Uploaded image for project: 'Infinispan'
  1. Infinispan
  2. ISPN-13703

Merge on clustered DIST_SYNC transactional cache fails for a non owner node, causes nullpointer in remote node

    XMLWordPrintable

Details

    • Hide

      If you add this test to class org.infinispan.distribution.DistSyncTxFuncTest:

      public void testMergeFromNonOwner()

      { initAndTest(); // merge function applied Object retval = getFirstNonOwner("k1").merge("k1", "value2", (v1, v2) -> "merged_" + v1 + "_" + v2); asyncWait("k1", ReadWriteKeyCommand.class); if (testRetVals) assertEquals("merged_value_value2", retval); assertOnAllCachesAndOwnership("k1", "merged_value_value2"); }

       

      You get the failed merge.  If you swap to use an owner cache it does not fail.

      Show
      If you add this test to class org.infinispan.distribution.DistSyncTxFuncTest: public void testMergeFromNonOwner() { initAndTest(); // merge function applied Object retval = getFirstNonOwner("k1").merge("k1", "value2", (v1, v2) -> "merged_" + v1 + "_" + v2); asyncWait("k1", ReadWriteKeyCommand.class); if (testRetVals) assertEquals("merged_value_value2", retval); assertOnAllCachesAndOwnership("k1", "merged_value_value2"); }   You get the failed merge.  If you swap to use an owner cache it does not fail.

    Description

      If I bring up a cluster of infinispan transactional  distributed sync caches and try to merge from a node which is not an owner the merge fails with a null pointer from one of the owners (primary?).  The exception generated on our server is:

      Feb 09, 2022 2:28:36 PM org.infinispan.remoting.inboundhandler.BasePerCacheInboundInvocationHandler exceptionHandlingCommand
      WARN: ISPN000071: Caught exception when handling command SingleRpcCommand{cacheName='weather', command=TxReadOnlyKeyCommand{key=A, f=null, mutations=[org.infinispan.commands.functional.Mutations$ReadWrite@6ce4c4c], params=Params=[LOAD_PERSIST, LOCK, ALL, GATHER, SYNC], keyDataConversion=DataConversion

      {encoderClass=null, wrapperClass=null, requestMediaType=application/x-java-object, storageMediaType=application/x-java-object, encoderId=1, wrapperId=0, encoder=org.infinispan.commons.dataconversion.IdentityEncoder@2f8b17ad, wrapper=null, isKey=true, transcoder=null}

      , valueDataConversion=DataConversion{encoderClass=null, wrapperClass=null, requestMediaType=application/x-java-object, storageMediaType=application/x-java-object, encoderId=1, wrapperId=0, encoder=org.infinispan.commons.dataconversion.IdentityEncoder@2f8b17ad, wrapper=null, isKey=false, transcoder=null}}}
      org.infinispan.util.UserRaisedFunctionalException: java.lang.NullPointerException
          at org.infinispan.commands.functional.functions.MergeFunction.apply(MergeFunction.java:56)
          at org.infinispan.commands.functional.functions.MergeFunction.apply(MergeFunction.java:20)
          at org.infinispan.commands.functional.Mutations$ReadWrite.apply(Mutations.java:106)
          at org.infinispan.interceptors.impl.CallInterceptor.visitTxReadOnlyKeyCommand(CallInterceptor.java:859)
          at org.infinispan.interceptors.impl.CallInterceptor.visitReadOnlyKeyCommand(CallInterceptor.java:834)
          at org.infinispan.commands.functional.ReadOnlyKeyCommand.acceptVisitor(ReadOnlyKeyCommand.java:79)
          at org.infinispan.interceptors.impl.CallInterceptor.visitCommand(CallInterceptor.java:178)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:61)
          at org.infinispan.interceptors.DDAsyncInterceptor.handleDefault(DDAsyncInterceptor.java:55)
          at org.infinispan.interceptors.DDAsyncInterceptor.visitReadOnlyKeyCommand(DDAsyncInterceptor.java:183)
          at org.infinispan.commands.functional.ReadOnlyKeyCommand.acceptVisitor(ReadOnlyKeyCommand.java:79)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNextThenApply(BaseAsyncInterceptor.java:79)
          at org.infinispan.interceptors.distribution.BaseDistributionInterceptor.visitReadOnlyKeyCommand(BaseDistributionInterceptor.java:656)
          at org.infinispan.commands.functional.ReadOnlyKeyCommand.acceptVisitor(ReadOnlyKeyCommand.java:79)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:59)
          at org.infinispan.interceptors.BaseAsyncInterceptor.asyncInvokeNext(BaseAsyncInterceptor.java:232)
          at org.infinispan.interceptors.impl.EntryWrappingInterceptor.visitReadOnlyKeyCommand(EntryWrappingInterceptor.java:511)
          at org.infinispan.commands.functional.ReadOnlyKeyCommand.acceptVisitor(ReadOnlyKeyCommand.java:79)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:59)
          at org.infinispan.interceptors.DDAsyncInterceptor.handleDefault(DDAsyncInterceptor.java:55)
          at org.infinispan.interceptors.DDAsyncInterceptor.visitReadOnlyKeyCommand(DDAsyncInterceptor.java:183)
          at org.infinispan.commands.functional.ReadOnlyKeyCommand.acceptVisitor(ReadOnlyKeyCommand.java:79)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:59)
          at org.infinispan.interceptors.locking.PessimisticLockingInterceptor.visitDataReadCommand(PessimisticLockingInterceptor.java:59)
          at org.infinispan.interceptors.locking.AbstractLockingInterceptor.visitReadOnlyKeyCommand(AbstractLockingInterceptor.java:217)
          at org.infinispan.commands.functional.ReadOnlyKeyCommand.acceptVisitor(ReadOnlyKeyCommand.java:79)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:59)
          at org.infinispan.interceptors.impl.TxInterceptor.visitReadOnlyKeyCommand(TxInterceptor.java:352)
          at org.infinispan.commands.functional.ReadOnlyKeyCommand.acceptVisitor(ReadOnlyKeyCommand.java:79)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:59)
          at org.infinispan.statetransfer.TransactionSynchronizerInterceptor.visitCommand(TransactionSynchronizerInterceptor.java:41)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNextAndHandle(BaseAsyncInterceptor.java:190)
          at org.infinispan.interceptors.impl.BaseStateTransferInterceptor.handleReadCommand(BaseStateTransferInterceptor.java:197)
          at org.infinispan.interceptors.impl.BaseStateTransferInterceptor.visitReadOnlyKeyCommand(BaseStateTransferInterceptor.java:270)
          at org.infinispan.commands.functional.ReadOnlyKeyCommand.acceptVisitor(ReadOnlyKeyCommand.java:79)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:59)
          at org.infinispan.interceptors.impl.CacheMgmtInterceptor.visitReadOnlyKeyCommand(CacheMgmtInterceptor.java:272)
          at org.infinispan.commands.functional.ReadOnlyKeyCommand.acceptVisitor(ReadOnlyKeyCommand.java:79)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNextAndExceptionally(BaseAsyncInterceptor.java:128)
          at org.infinispan.interceptors.impl.InvocationContextInterceptor.visitCommand(InvocationContextInterceptor.java:89)
          at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:61)
          at org.infinispan.interceptors.DDAsyncInterceptor.handleDefault(DDAsyncInterceptor.java:55)
          at org.infinispan.interceptors.DDAsyncInterceptor.visitReadOnlyKeyCommand(DDAsyncInterceptor.java:183)
          at org.infinispan.commands.functional.ReadOnlyKeyCommand.acceptVisitor(ReadOnlyKeyCommand.java:79)
          at org.infinispan.interceptors.DDAsyncInterceptor.visitCommand(DDAsyncInterceptor.java:51)
          at org.infinispan.interceptors.impl.AsyncInterceptorChainImpl.invokeAsync(AsyncInterceptorChainImpl.java:220)
          at org.infinispan.commands.remote.SingleRpcCommand.invokeAsync(SingleRpcCommand.java:70)
          at org.infinispan.remoting.inboundhandler.BasePerCacheInboundInvocationHandler.invokeCommand(BasePerCacheInboundInvocationHandler.java:109)
          at org.infinispan.remoting.inboundhandler.BaseBlockingRunnable.invoke(BaseBlockingRunnable.java:107)
          at org.infinispan.remoting.inboundhandler.BaseBlockingRunnable.runAsync(BaseBlockingRunnable.java:75)
          at org.infinispan.remoting.inboundhandler.BaseBlockingRunnable.run(BaseBlockingRunnable.java:44)
          at org.infinispan.remoting.inboundhandler.BasePerCacheInboundInvocationHandler.handleRunnable(BasePerCacheInboundInvocationHandler.java:159)
          at org.infinispan.remoting.inboundhandler.TxPerCacheInboundInvocationHandler.handle(TxPerCacheInboundInvocationHandler.java:84)
          at org.infinispan.remoting.inboundhandler.GlobalInboundInvocationHandler.handleCacheRpcCommand(GlobalInboundInvocationHandler.java:165)
          at org.infinispan.remoting.inboundhandler.GlobalInboundInvocationHandler.handleFromCluster(GlobalInboundInvocationHandler.java:112)
          at org.infinispan.remoting.transport.jgroups.JGroupsTransport.processRequest(JGroupsTransport.java:1457)
          at org.infinispan.remoting.transport.jgroups.JGroupsTransport.processMessage(JGroupsTransport.java:1380)
          at org.infinispan.remoting.transport.jgroups.JGroupsTransport.access$300(JGroupsTransport.java:138)
          at org.infinispan.remoting.transport.jgroups.JGroupsTransport$ChannelCallbacks.up(JGroupsTransport.java:1524)
          at org.jgroups.JChannel.up(JChannel.java:780)
          at org.jgroups.stack.ProtocolStack.up(ProtocolStack.java:913)
          at org.jgroups.protocols.FRAG3.up(FRAG3.java:165)
          at org.jgroups.protocols.FlowControl.up(FlowControl.java:355)
          at org.jgroups.protocols.FlowControl.up(FlowControl.java:363)
          at org.jgroups.protocols.pbcast.GMS.up(GMS.java:876)
          at org.jgroups.protocols.pbcast.STABLE.up(STABLE.java:254)
          at org.jgroups.protocols.UNICAST3.deliverMessage(UNICAST3.java:1048)
          at org.jgroups.protocols.UNICAST3.addMessage(UNICAST3.java:771)
          at org.jgroups.protocols.UNICAST3.handleDataReceived(UNICAST3.java:752)
          at org.jgroups.protocols.UNICAST3.up(UNICAST3.java:405)
          at org.jgroups.protocols.pbcast.NAKACK2.up(NAKACK2.java:592)
          at org.jgroups.protocols.VERIFY_SUSPECT.up(VERIFY_SUSPECT.java:132)
          at org.jgroups.protocols.FailureDetection.up(FailureDetection.java:186)
          at org.jgroups.protocols.FD_SOCK.up(FD_SOCK.java:254)
          at org.jgroups.protocols.MERGE3.up(MERGE3.java:281)
          at org.jgroups.protocols.Discovery.up(Discovery.java:300)
          at org.jgroups.protocols.TP.passMessageUp(TP.java:1400)
          at org.jgroups.util.SubmitToThreadPool$SingleMessageHandler.run(SubmitToThreadPool.java:98)
          at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
          at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
          at java.base/java.lang.Thread.run(Thread.java:829)
      Caused by: java.lang.NullPointerException
          at org.infinispan.encoding.DataConversion.getWrapper(DataConversion.java:271)
          at org.infinispan.encoding.DataConversion.toStorage(DataConversion.java:228)
          at org.infinispan.commands.functional.functions.MergeFunction.apply(MergeFunction.java:39)
          ... 80 more

       

      Attachments

        Activity

          People

            pruivo@redhat.com Pedro Ruivo
            tomdearman Tom Dearman (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: