[ 
https://issues.apache.org/jira/browse/GEODE-5277?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

ASF GitHub Bot updated GEODE-5277:
----------------------------------
    Labels: pull-request-available  (was: )

> 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
>            Assignee: Jianxia Chen
>            Priority: Major
>              Labels: pull-request-available
>             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