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

ASF subversion and git services commented on GEODE-8846:
--------------------------------------------------------

Commit b46a0a24ebe2b959361d9b99585e47d2aca25fd6 in geode's branch 
refs/heads/develop from Jakov Varenina
[ https://gitbox.apache.org/repos/asf?p=geode.git;h=b46a0a2 ]

GEODE-8846: Fix for transaction commit failure (#5927)

* GEODE-8846: Fix for transaction commit failure
Issue: Transaction commit fail when transactionID integer overflows to
negative value, because server interprets negative value as
non-transactional message.

Fix: Client is impacted to always overflow transactionID to one instead
of to Integer.MIN_VALUE(-2147483648).

Additionally, this commit removes unused methods from TXManagerImpl.java:
    _incrementTXUniqueIDForReplay
    incrementTXUniqueIDForReplay

> Transaction commit fail when uniqueID integer overflow to negative value
> ------------------------------------------------------------------------
>
>                 Key: GEODE-8846
>                 URL: https://issues.apache.org/jira/browse/GEODE-8846
>             Project: Geode
>          Issue Type: Bug
>          Components: client/server
>    Affects Versions: 1.13.0, 1.13.1
>            Reporter: Jakov Varenina
>            Assignee: Jakov Varenina
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 1.14.0
>
>
> When client increments *uniqId* above Integer.MAX_VALUE (2147483647) then due 
> to memory overflow the *uniqId* is set to negative value Integer.MIN_VALUE 
> (-2147483648). TransactionID (uniqId) is  sent to the server as a part of 
> transaction message.
> {code:java}
> public class TXManagerImpl implements CacheTransactionManager, 
> MembershipListener {
> ...
>   // The unique transaction ID for this Manager
>   private final AtomicInteger uniqId;
> ....
>     TXId id = new TXId(this.distributionMgrId, this.uniqId.incrementAndGet());
> ....
> {code}
> Currently server will interpret any negative value of transactionID (uniqID) 
> as non-transactional traffic. Please notice that getTransactionID() actually 
> retrieves uniqID value that is set by client.
> {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)

Reply via email to