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

Jakov Varenina updated GEODE-8874:
----------------------------------
    Description: 
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)

  was:
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 (uniqID) as 
non-transactional traffic. Please notice that getTransactionID() actually 
retrieves uniqID==*m_transactionId* 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)


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

Reply via email to