Jianxia Chen created GEODE-5277:
-----------------------------------

             Summary: Server affinity causes wrong transaction failover behavior
                 Key: GEODE-5277
                 URL: https://issues.apache.org/jira/browse/GEODE-5277
             Project: Geode
          Issue Type: Bug
          Components: transactions
            Reporter: Jianxia Chen
             Fix For: 1.8.0


A transaction is initiated from a client, and is successfully committed on the 
server. Client has received TXCommitMessage from the server. It has a listener 
callbacks need pdx Type from the server, so it sends a GetPDXEnumByIdOp message 
to the server. The connection to the server is lost, so it failed over to a new 
server. Because it is still using affinity server, so it sends TXFailoverOp 
trying to locate the transaction hosts. However, GetPDXEnumByIdOp message does 
not set transaction id as it does not participate in a transaction. This cause 
server failed with the assertion and send back the InternalGemFireError to the 
client.

This could be solved by unset the serverAffinity ThreadLocal after client 
receives the TXCommitMessage but before callbacks are invoked.

 

{code}

at 
org.apache.geode.cache.client.internal.AbstractOp.processAck(AbstractOp.java:263)
 at 
org.apache.geode.cache.client.internal.TXFailoverOp$TXFailoverOpImpl.processResponse(TXFailoverOp.java:52)
 at 
org.apache.geode.cache.client.internal.AbstractOp.processResponse(AbstractOp.java:226)
 at 
org.apache.geode.cache.client.internal.AbstractOp.attemptReadResponse(AbstractOp.java:211)
 at 
org.apache.geode.cache.client.internal.AbstractOp.attempt(AbstractOp.java:387) 
at 
org.apache.geode.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:276)
 at 
org.apache.geode.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:327)
 at 
org.apache.geode.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:885)
 at 
org.apache.geode.cache.client.internal.OpExecutorImpl.executeOnServer(OpExecutorImpl.java:378)
 at 
org.apache.geode.cache.client.internal.OpExecutorImpl.executeWithServerAffinity(OpExecutorImpl.java:231)
 at 
org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:140)
 at 
org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:127)
 at org.apache.geode.cache.client.internal.PoolImpl.execute(PoolImpl.java:782) 
at 
org.apache.geode.cache.client.internal.TXFailoverOp.execute(TXFailoverOp.java:29)
 at 
org.apache.geode.cache.client.internal.OpExecutorImpl.executeWithServerAffinity(OpExecutorImpl.java:265)
 at 
org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:140)
 at 
org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:127)
 at org.apache.geode.cache.client.internal.PoolImpl.execute(PoolImpl.java:782) 
at 
org.apache.geode.cache.client.internal.GetPDXEnumByIdOp.execute(GetPDXEnumByIdOp.java:34)
 at 
org.apache.geode.pdx.internal.ClientTypeRegistration.getEnumById(ClientTypeRegistration.java:198)
 at 
org.apache.geode.pdx.internal.TypeRegistry.getEnumInfoById(TypeRegistry.java:442)
 at 
org.apache.geode.pdx.internal.TypeRegistry.getEnumById(TypeRegistry.java:418) 
at 
org.apache.geode.internal.InternalDataSerializer.readPdxEnum(InternalDataSerializer.java:2323)
 at 
org.apache.geode.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:3075)
 at org.apache.geode.DataSerializer.readObject(DataSerializer.java:2978) at 
org.apache.geode.pdx.internal.PdxInputStream.readObject(PdxInputStream.java:251)
 at 
org.apache.geode.pdx.internal.PdxInputStream.readObject(PdxInputStream.java:96) 
at 
org.apache.geode.pdx.internal.PdxReaderImpl.readObject(PdxReaderImpl.java:333) 
at 
org.apache.geode.pdx.internal.PdxInstanceImpl.readObject(PdxInstanceImpl.java:527)
 at 
org.apache.geode.pdx.internal.PdxReaderImpl.readObject(PdxReaderImpl.java:326) 
at 
org.apache.geode.pdx.internal.PdxInstanceImpl.readObject(PdxInstanceImpl.java:522)
 at util.VersionedValueHolder.myFromData(VersionedValueHolder.java:242) at 
util.PdxVersionedValueHolder.fromData(PdxVersionedValueHolder.java:95) at 
org.apache.geode.pdx.internal.PdxReaderImpl.basicGetObject(PdxReaderImpl.java:737)
 at 
org.apache.geode.pdx.internal.PdxInstanceImpl.basicGetObject(PdxInstanceImpl.java:600)
 at 
org.apache.geode.pdx.internal.PdxInstanceImpl.getObject(PdxInstanceImpl.java:243)
 at pdx.PdxTest.getOldValueStr(PdxTest.java:518) at 
pdx.PdxSilenceListener.getOldValueStr(PdxSilenceListener.java:31) at 
util.AbstractListener.toString(AbstractListener.java:191) at 
util.AbstractListener.logCall(AbstractListener.java:356) at 
util.SilenceListener.afterDestroy(SilenceListener.java:31) at 
org.apache.geode.internal.cache.EnumListenerEvent$AFTER_DESTROY.dispatchEvent(EnumListenerEvent.java:151)
 at 
org.apache.geode.internal.cache.LocalRegion.dispatchEvent(LocalRegion.java:8468)
 at 
org.apache.geode.internal.cache.LocalRegion.dispatchListenerEvent(LocalRegion.java:6969)
 at 
org.apache.geode.internal.cache.LocalRegion.invokeTXCallbacks(LocalRegion.java:6807)
 at 
org.apache.geode.internal.cache.TXCommitMessage.firePendingCallbacks(TXCommitMessage.java:727)
 at 
org.apache.geode.internal.cache.TXCommitMessage.basicProcessOps(TXCommitMessage.java:718)
 at 
org.apache.geode.internal.cache.TXCommitMessage.basicProcess(TXCommitMessage.java:638)
 at 
org.apache.geode.internal.cache.tx.ClientTXStateStub.afterServerCommit(ClientTXStateStub.java:184)
 at 
org.apache.geode.internal.cache.tx.ClientTXStateStub.commit(ClientTXStateStub.java:112)
 at 
org.apache.geode.internal.cache.TXStateProxyImpl.commit(TXStateProxyImpl.java:228)
 at org.apache.geode.internal.cache.TXManagerImpl.commit(TXManagerImpl.java:405)

{code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to