This is an automated email from the ASF dual-hosted git repository.

duhengforever pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/rocketmq.git


The following commit(s) were added to refs/heads/develop by this push:
     new f08c79ff9 [ISSUE #4349] fix negative index when index reach 
Integer.MAX_VALUE (#4447)
f08c79ff9 is described below

commit f08c79ff9f9681f26046cb552f2c14a1ee1de10f
Author: Wushiyii <[email protected]>
AuthorDate: Mon Jun 13 09:39:40 2022 +0800

    [ISSUE #4349] fix negative index when index reach Integer.MAX_VALUE (#4447)
    
    Co-authored-by: wuguoqing <[email protected]>
---
 .../apache/rocketmq/client/common/ThreadLocalIndex.java   |  3 ++-
 .../rocketmq/client/common/ThreadLocalIndexTest.java      | 15 +++++++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git 
a/client/src/main/java/org/apache/rocketmq/client/common/ThreadLocalIndex.java 
b/client/src/main/java/org/apache/rocketmq/client/common/ThreadLocalIndex.java
index 891c17e3b..41056fac6 100644
--- 
a/client/src/main/java/org/apache/rocketmq/client/common/ThreadLocalIndex.java
+++ 
b/client/src/main/java/org/apache/rocketmq/client/common/ThreadLocalIndex.java
@@ -22,6 +22,7 @@ import java.util.Random;
 public class ThreadLocalIndex {
     private final ThreadLocal<Integer> threadLocalIndex = new 
ThreadLocal<Integer>();
     private final Random random = new Random();
+    private final static int POSITIVE_MASK = 0x7FFFFFFF;
 
     public int incrementAndGet() {
         Integer index = this.threadLocalIndex.get();
@@ -31,7 +32,7 @@ public class ThreadLocalIndex {
         }
 
         this.threadLocalIndex.set(++index);
-        return Math.abs(index);
+        return Math.abs(index & POSITIVE_MASK);
     }
 
     @Override
diff --git 
a/client/src/test/java/org/apache/rocketmq/client/common/ThreadLocalIndexTest.java
 
b/client/src/test/java/org/apache/rocketmq/client/common/ThreadLocalIndexTest.java
index 22ce28113..ce7ec1bee 100644
--- 
a/client/src/test/java/org/apache/rocketmq/client/common/ThreadLocalIndexTest.java
+++ 
b/client/src/test/java/org/apache/rocketmq/client/common/ThreadLocalIndexTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.rocketmq.client.common;
 
+import java.lang.reflect.Field;
 import org.junit.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -36,4 +37,18 @@ public class ThreadLocalIndexTest {
         assertThat(initialVal >= 0).isTrue();
     }
 
+    @Test
+    public void testIncrementAndGet3() throws Exception {
+        ThreadLocalIndex localIndex = new ThreadLocalIndex();
+        Field threadLocalIndexField = 
ThreadLocalIndex.class.getDeclaredField("threadLocalIndex");
+        ThreadLocal<Integer> mockThreadLocal = new ThreadLocal<Integer>();
+        mockThreadLocal.set(Integer.MAX_VALUE);
+
+        threadLocalIndexField.setAccessible(true);
+        threadLocalIndexField.set(localIndex, mockThreadLocal);
+
+        int initialVal = localIndex.incrementAndGet();
+        assertThat(initialVal >= 0).isTrue();
+    }
+
 }
\ No newline at end of file

Reply via email to