From f08c79ff9f9681f26046cb552f2c14a1ee1de10f Mon Sep 17 00:00:00 2001 From: Wushiyii <31801502+Wushiyii@users.noreply.github.com> Date: Mon, 13 Jun 2022 09:39:40 +0800 Subject: [PATCH] [ISSUE #4349] fix negative index when index reach Integer.MAX_VALUE (#4447) Co-authored-by: wuguoqing --- .../rocketmq/client/common/ThreadLocalIndex.java | 3 ++- .../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 891c17e3ba..41056fac63 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 threadLocalIndex = new ThreadLocal(); 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 22ce281139..ce7ec1beee 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 mockThreadLocal = new ThreadLocal(); + 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