You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@geode.apache.org by "ASF GitHub Bot (Jira)" <ji...@apache.org> on 2021/01/27 09:35:00 UTC

[jira] [Commented] (GEODE-8874) Transaction commit fail when m_transactionId integer overflow to negative value

    [ https://issues.apache.org/jira/browse/GEODE-8874?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17272709#comment-17272709 ] 

ASF GitHub Bot commented on GEODE-8874:
---------------------------------------

jvarenina opened a new pull request #731:
URL: https://github.com/apache/geode-native/pull/731


   Issue: Transaction commit fail when m_transactionID integer overflows to
   negative value, because server interprets negative value as
   non-transactional message.
   
   Fix: Client is impacted to reset transactionID to zero when INT_32MAX
   value is reached in order to avoid overflow.


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


> Transaction commit fail when m_transactionId integer overflow to negative value
> -------------------------------------------------------------------------------
>
>                 Key: GEODE-8874
>                 URL: https://issues.apache.org/jira/browse/GEODE-8874
>             Project: Geode
>          Issue Type: Bug
>          Components: native client
>            Reporter: Jakov Varenina
>            Assignee: Jakov Varenina
>            Priority: Major
>
> When native client increments *m_transactionId* above INT32_MAX(2147483647) then due to memory overflow the *m_transactionId* is set to negative value INT32_MIN(-2147483648). TransactionID (m_transactionId) is sent to the server as a part of transaction message.
> {code:cpp}
> std::atomic<int32_t> TXId::m_transactionId(1);
> TXId::TXId() : m_TXId(m_transactionId++) {}
> {code}
> Currently server will interpret any negative value of transactionID as non-transactional traffic.
> {code:java}
> /**
>  * checks to see if this thread needs to masquerade as a transactional thread. clients after
>  * GFE_66 should be able to start a transaction.
>  *
>  * @return true if thread should masquerade as a transactional thread.
>  */
> protected boolean shouldMasqueradeForTx(Message clientMessage,
>     ServerConnection serverConnection) {
>   return serverConnection.getClientVersion().isNotOlderThan(KnownVersion.GFE_66)
>       && clientMessage.getTransactionId() > TXManagerImpl.NOTX; // ---> NOTX is equal -1
> }
> {code}
> After overflow happens all subsequent commit actions from the client are rejected with exception:
> [vm0] [fatal 2021/01/14 15:28:41.967 CET <ServerConnection on port 39093 Thread 2> tid=0x52] Server connection from [identity(192.168.90.23(29826:loner):48210:6c694c01,connection=1; port=48212] : Unexpected Error on server
>  [vm0] org.apache.geode.InternalGemFireError
>  [vm0] at org.apache.geode.internal.Assert.throwError(Assert.java:91)
>  [vm0] at org.apache.geode.internal.Assert.assertTrue(Assert.java:55)
>  [vm0] at org.apache.geode.internal.cache.tier.sockets.command.CommitCommand.cmdExecute(CommitCommand.java:82)
>  [vm0] at org.apache.geode.internal.cache.tier.sockets.BaseCommand.execute(BaseCommand.java:183)
>  [vm0] at org.apache.geode.internal.cache.tier.sockets.ServerConnection.doNormalMessage(ServerConnection.java:848)
>  [vm0] at org.apache.geode.internal.cache.tier.sockets.OriginalServerConnection.doOneMessage(OriginalServerConnection.java:72)
>  [vm0] at org.apache.geode.internal.cache.tier.sockets.ServerConnection.run(ServerConnection.java:1214)
>  [vm0] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>  [vm0] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>  [vm0] at org.apache.geode.internal.cache.tier.sockets.AcceptorImpl.lambda$initializeServerConnectionThreadPool$3(AcceptorImpl.java:691)
>  [vm0] at org.apache.geode.logging.internal.executors.LoggingThreadFactory.lambda$newThread$0(LoggingThreadFactory.java:120)
>  [vm0] at java.lang.Thread.run(Thread.java:748)



--
This message was sent by Atlassian Jira
(v8.3.4#803005)