Uploaded image for project: 'Ignite'
  1. Ignite
  2. IGNITE-13103

Investigate marshalling errors when changing fields of lambda's capturingClass

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 2.8.1
    • 2.9
    • binary, compute
    • None
    • Fixed registration of capturingClass in marshaller making lambdas fragile on code update.

    Description

      Trying to execute static lambda whose outer type's fields changed leads to the following error:

      Exception in thread "main" class org.apache.ignite.IgniteException: Remote job threw user exception (override or implement ComputeTask.result(..) method if you would like to have automatic failover for this exception): Failed to serialize object [typeName=org.apache.ignite.internal.processors.closure.GridClosureProcessor$C4]
      	at org.apache.ignite.compute.ComputeTaskAdapter.result(ComputeTaskAdapter.java:102)
      	at org.apache.ignite.internal.processors.task.GridTaskWorker$5.apply(GridTaskWorker.java:1062)
      	at org.apache.ignite.internal.processors.task.GridTaskWorker$5.apply(GridTaskWorker.java:1055)
      	at org.apache.ignite.internal.util.IgniteUtils.wrapThreadLoader(IgniteUtils.java:7037)
      	at org.apache.ignite.internal.processors.task.GridTaskWorker.result(GridTaskWorker.java:1055)
      	at org.apache.ignite.internal.processors.task.GridTaskWorker.onResponse(GridTaskWorker.java:862)
      	at org.apache.ignite.internal.processors.task.GridTaskWorker.processDelayedResponses(GridTaskWorker.java:711)
      	at org.apache.ignite.internal.processors.task.GridTaskWorker.body(GridTaskWorker.java:542)
      	at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:120)
      	at org.apache.ignite.internal.processors.task.GridTaskProcessor.startTask(GridTaskProcessor.java:829)
      	at org.apache.ignite.internal.processors.task.GridTaskProcessor.execute(GridTaskProcessor.java:497)
      	at org.apache.ignite.internal.processors.closure.GridClosureProcessor.runAsync(GridClosureProcessor.java:244)
      	at org.apache.ignite.internal.processors.closure.GridClosureProcessor.runAsync(GridClosureProcessor.java:216)
      	at org.apache.ignite.internal.IgniteComputeImpl.runAsync0(IgniteComputeImpl.java:702)
      	at org.apache.ignite.internal.IgniteComputeImpl.run(IgniteComputeImpl.java:678)
      	at com.gridgain.deployer.c.ComputeCallerStarter.start(ComputeCallerStarter.java:19)
      	at com.gridgain.deployer.c.ComputeCallerStarter.main(ComputeCallerStarter.java:13)
      Caused by: class org.apache.ignite.binary.BinaryObjectException: Failed to serialize object [typeName=org.apache.ignite.internal.processors.closure.GridClosureProcessor$C4]
      	at org.apache.ignite.internal.binary.BinaryClassDescriptor.write(BinaryClassDescriptor.java:853)
      	at org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal0(BinaryWriterExImpl.java:232)
      	at org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal(BinaryWriterExImpl.java:165)
      	at org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal(BinaryWriterExImpl.java:152)
      	at org.apache.ignite.internal.binary.GridBinaryMarshaller.marshal(GridBinaryMarshaller.java:251)
      	at org.apache.ignite.internal.binary.BinaryMarshaller.marshal0(BinaryMarshaller.java:84)
      	at org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.marshal(AbstractNodeNameAwareMarshaller.java:57)
      	at org.apache.ignite.internal.util.IgniteUtils.marshal(IgniteUtils.java:10386)
      	at org.apache.ignite.internal.processors.task.GridTaskWorker.sendRequest(GridTaskWorker.java:1397)
      	at org.apache.ignite.internal.processors.task.GridTaskWorker.processMappedJobs(GridTaskWorker.java:664)
      	at org.apache.ignite.internal.processors.task.GridTaskWorker.body(GridTaskWorker.java:536)
      	... 9 more
      Caused by: class org.apache.ignite.binary.BinaryObjectException: Failed to serialize object [typeName=java.lang.invoke.SerializedLambda]
      	at org.apache.ignite.internal.binary.BinaryClassDescriptor.write(BinaryClassDescriptor.java:853)
      	at org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal0(BinaryWriterExImpl.java:232)
      	at org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal(BinaryWriterExImpl.java:165)
      	at org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal0(BinaryWriterExImpl.java:227)
      	at org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal(BinaryWriterExImpl.java:165)
      	at org.apache.ignite.internal.binary.BinaryWriterExImpl.marshal(BinaryWriterExImpl.java:152)
      	at org.apache.ignite.internal.binary.BinaryWriterExImpl.doWriteObject(BinaryWriterExImpl.java:524)
      	at org.apache.ignite.internal.binary.BinaryWriterExImpl.writeObject(BinaryWriterExImpl.java:1503)
      	at org.apache.ignite.internal.processors.closure.GridClosureProcessor$C4.writeBinary(GridClosureProcessor.java:1955)
      	at org.apache.ignite.internal.binary.BinaryClassDescriptor.write(BinaryClassDescriptor.java:767)
      	... 19 more
      Caused by: class org.apache.ignite.binary.BinaryObjectException: Failed to write field [name=capturingClass]
      	at org.apache.ignite.internal.binary.BinaryFieldAccessor.write(BinaryFieldAccessor.java:164)
      	at org.apache.ignite.internal.binary.BinaryClassDescriptor.write(BinaryClassDescriptor.java:822)
      	... 28 more
      Caused by: class org.apache.ignite.binary.BinaryObjectException: Type 'com.gridgain.deployer.c.ComputeCallerStarter' with typeId -2020111498 has a different/incorrect type for field 'c'. Expected 'int' but 'String' was provided. Field type's modification is unsupported, clean {root_path}/marshaller and {root_path}/binary_meta directories if the type change is required.
      	at org.apache.ignite.internal.binary.BinaryUtils.mergeMetadata(BinaryUtils.java:1045)
      	at org.apache.ignite.internal.processors.cache.binary.BinaryMetadataTransport.requestMetadataUpdate(BinaryMetadataTransport.java:182)
      	at org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl.addMeta(CacheObjectBinaryProcessorImpl.java:548)
      	at org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl$1.addMeta(CacheObjectBinaryProcessorImpl.java:235)
      	at org.apache.ignite.internal.binary.BinaryContext.registerUserClassDescriptor(BinaryContext.java:837)
      	at org.apache.ignite.internal.binary.BinaryContext.registerDescriptor(BinaryContext.java:796)
      	at org.apache.ignite.internal.binary.BinaryContext.registerClass(BinaryContext.java:654)
      	at org.apache.ignite.internal.binary.BinaryContext.registerClass(BinaryContext.java:629)
      	at org.apache.ignite.internal.binary.BinaryWriterExImpl.doWriteClass(BinaryWriterExImpl.java:914)
      	at org.apache.ignite.internal.binary.BinaryWriterExImpl.writeClassField(BinaryWriterExImpl.java:1004)
      	at org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.write0(BinaryFieldAccessor.java:692)
      	at org.apache.ignite.internal.binary.BinaryFieldAccessor.write(BinaryFieldAccessor.java:157)
      	... 29 more
      

      This is in spite to the fact that instance of outer type never sent over via network, it can be peer loaded with user versioning and deployment types as any other compute type.

      Attachments

        1. deployer.zip
          21 kB
          Ilya Kasnacheev

        Issue Links

          Activity

            People

              ilyak Ilya Kasnacheev
              ilyak Ilya Kasnacheev
              Denis Mekhanikov Denis Mekhanikov
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0h
                  0h
                  Logged:
                  Time Spent - 0.5h
                  0.5h