You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by du...@apache.org on 2022/06/13 01:39:52 UTC

[rocketmq] branch develop updated: [ISSUE #4349] fix negative index when index reach Integer.MAX_VALUE (#4447)

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 <31...@users.noreply.github.com>
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 <wu...@zhuanzhuan.com>
---
 .../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