hazelcast / hazelcast-jet

Distributed Stream and Batch Processing
https://jet-start.sh
Other
1.1k stars 205 forks source link

Lamdba serialisation issue when client and server main class names clash #2380

Open neilstevenson opened 4 years ago

neilstevenson commented 4 years ago

On Jet 4.1., if the server is started with

package neil;

import com.hazelcast.jet.Jet;

public class Main {

    public static void main(String[] args) {
        Jet.newJetInstance();
    }
}

and the client has

package neil;

import com.hazelcast.jet.Jet;
import com.hazelcast.jet.JetInstance;
import com.hazelcast.jet.config.JobConfig;
import com.hazelcast.jet.pipeline.Pipeline;
import com.hazelcast.jet.pipeline.Sinks;
import com.hazelcast.jet.pipeline.test.TestSources;

public class Main {

    public static void main(String[] args) {
        JetInstance client = Jet.newJetClient();

        Pipeline pipeline = Main.buildPipeline();

        JobConfig jobConfig = new JobConfig();
        jobConfig.addClass(Main.class);

        try {
            client.newJob(pipeline, jobConfig).join();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client.shutdown();
        }
    }

    private static Pipeline buildPipeline() {

        Pipeline pipeline = Pipeline.create();

        pipeline.readFrom(TestSources.items("a", "b", "c"))
        .map(line -> line.toUpperCase())
        .writeTo(Sinks.logger());

        return pipeline;
    }
}

Then the map stage triggers this error

com.hazelcast.nio.serialization.HazelcastSerializationException: Error deserializing vertex 'map': com.hazelcast.nio.serialization.HazelcastSerializationException: java.io.IOException: unexpected exception type
    at com.hazelcast.jet.core.Vertex.readData(Vertex.java:219)
    at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.readInternal(DataSerializableSerializer.java:160)
    at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:106)
    at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:51)
    at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:44)
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.readObject(AbstractSerializationService.java:284)
    at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataInput.readObject(ByteArrayObjectDataInput.java:567)
    at com.hazelcast.jet.core.DAG.readData(DAG.java:486)
    at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.readInternal(DataSerializableSerializer.java:160)
    at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:106)
    at com.hazelcast.internal.serialization.impl.DataSerializableSerializer.read(DataSerializableSerializer.java:51)
    at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:44)
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:203)
    at com.hazelcast.jet.impl.execution.init.CustomClassLoadedObject.deserializeWithCustomClassLoader(CustomClassLoadedObject.java:65)
    at com.hazelcast.jet.impl.JobCoordinationService.deserializeDag(JobCoordinationService.java:815)
    at com.hazelcast.jet.impl.JobCoordinationService.lambda$submitJob$1(JobCoordinationService.java:203)
    at com.hazelcast.jet.impl.JobCoordinationService.lambda$submitToCoordinatorThread$42(JobCoordinationService.java:978)
    at com.hazelcast.jet.impl.JobCoordinationService.lambda$submitToCoordinatorThread$43(JobCoordinationService.java:997)
    at com.hazelcast.internal.util.executor.CompletableFutureTask.run(CompletableFutureTask.java:64)
    at com.hazelcast.internal.util.executor.CachedExecutorServiceDelegate$Worker.run(CachedExecutorServiceDelegate.java:217)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.lang.Thread.run(Thread.java:834)
    at com.hazelcast.internal.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:64)
    at com.hazelcast.internal.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:80)
Caused by: com.hazelcast.nio.serialization.HazelcastSerializationException: java.io.IOException: unexpected exception type
    at com.hazelcast.internal.serialization.impl.SerializationUtil.handleException(SerializationUtil.java:103)
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.readObject(AbstractSerializationService.java:290)
    at com.hazelcast.internal.serialization.impl.ByteArrayObjectDataInput.readObject(ByteArrayObjectDataInput.java:567)
    at com.hazelcast.jet.impl.execution.init.CustomClassLoadedObject.read(CustomClassLoadedObject.java:56)
    at com.hazelcast.jet.core.Vertex.readData(Vertex.java:217)
    ... 24 more
Caused by: java.io.IOException: unexpected exception type
    at java.io.ObjectStreamClass.throwMiscException(ObjectStreamClass.java:1641)
    at java.io.ObjectStreamClass.invokeReadResolve(ObjectStreamClass.java:1271)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2153)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646)
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:2050)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1634)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2412)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2306)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2144)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646)
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:2050)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1634)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2412)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2306)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2144)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646)
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:2050)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1634)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2412)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2306)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2144)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2412)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2306)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2144)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:464)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
    at com.hazelcast.jet.impl.execution.init.CustomClassLoadedObject$Serializer.read(CustomClassLoadedObject.java:110)
    at com.hazelcast.jet.impl.execution.init.CustomClassLoadedObject$Serializer.read(CustomClassLoadedObject.java:91)
    at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:44)
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.readObject(AbstractSerializationService.java:284)
    ... 27 more
Caused by: com.hazelcast.client.UndefinedErrorCodeException: Class name: java.lang.NoSuchMethodException, Message: neil.Main.$deserializeLambda$(java.lang.invoke.SerializedLambda)
    at java.lang.Class.getDeclaredMethod(Class.java:2475)
    at java.lang.invoke.SerializedLambda$1.run(SerializedLambda.java:231)
    at java.lang.invoke.SerializedLambda$1.run(SerializedLambda.java:228)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.lang.invoke.SerializedLambda.readResolve(SerializedLambda.java:228)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:566)
    at java.io.ObjectStreamClass.invokeReadResolve(ObjectStreamClass.java:1265)
    ... 57 more

As per @gurbuzali , renaming the server's class to Main2 for example makes the problem go away.

It appears to be some sort of clash in naming.

neilstevenson commented 4 years ago

Also, it seems to me pretty reasonable for the client and server to have their main class in Main.java in the same package, so the solution here should be to allow it rather than to give a more meaningful error message.

cangencer commented 4 years ago

I don't think this is worth fixing at the moment. You should just use the JetMemberStarter class or the jet-start script to start the server instance.