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)