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/20 12:30:00 UTC

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

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

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

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


   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 zero instead
   of to Integer.MIN_VALUE(-2147483648).
   
   Additionally, this commit removes unused methods from TXManagerImpl.java:
   - _incrementTXUniqueIDForReplay
   - incrementTXUniqueIDForReplay
   
   Thank you for submitting a contribution to Apache Geode.
   
   In order to streamline the review of the contribution we ask you
   to ensure the following steps have been taken:
   
   ### For all changes:
   - [x] Is there a JIRA ticket associated with this PR? Is it referenced in the commit message?
   
   - [x] Has your PR been rebased against the latest commit within the target branch (typically `develop`)?
   
   - [x] Is your initial contribution a single, squashed commit?
   
   - [x] Does `gradlew build` run cleanly?
   
   - [x] Have you written or updated unit tests to verify your changes?
   
   - [ ] If adding new dependencies to the code, are these dependencies licensed in a way that is compatible for inclusion under [ASF 2.0](http://www.apache.org/legal/resolved.html#category-a)?
   
   ### Note:
   Please ensure that once the PR is submitted, check Concourse for build issues and
   submit an update to your PR as soon as possible. If you need help, please send an
   email to dev@geode.apache.org.
   


----------------------------------------------------------------
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 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
>
> 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)