diff --git a/store/src/main/java/org/apache/rocketmq/store/index/IndexService.java b/store/src/main/java/org/apache/rocketmq/store/index/IndexService.java index 1a180e4442b..35e05864c25 100644 --- a/store/src/main/java/org/apache/rocketmq/store/index/IndexService.java +++ b/store/src/main/java/org/apache/rocketmq/store/index/IndexService.java @@ -173,7 +173,10 @@ public QueryOffsetResult queryOffset(String topic, String key, int maxNum, long public QueryOffsetResult queryOffset(String topic, String key, int maxNum, long begin, long end, String indexType) { long indexLastUpdateTimestamp = 0; long indexLastUpdatePhyoffset = 0; - maxNum = Math.min(maxNum, this.defaultMessageStore.getMessageStoreConfig().getMaxMsgsNumBatch()); + // maxNum comes from the request header and is only checked for null, + // so a negative value must be clamped here instead of blowing up the + // ArrayList allocation below with an IllegalArgumentException. + maxNum = Math.min(Math.max(maxNum, 0), this.defaultMessageStore.getMessageStoreConfig().getMaxMsgsNumBatch()); List phyOffsets = new ArrayList<>(maxNum); try { this.readWriteLock.readLock().lock(); diff --git a/store/src/test/java/org/apache/rocketmq/store/index/IndexServiceTest.java b/store/src/test/java/org/apache/rocketmq/store/index/IndexServiceTest.java index bd520e6a483..982dd2296db 100644 --- a/store/src/test/java/org/apache/rocketmq/store/index/IndexServiceTest.java +++ b/store/src/test/java/org/apache/rocketmq/store/index/IndexServiceTest.java @@ -81,4 +81,11 @@ public void testQueryOffsetWithZeroMaxNum() { assertNotNull(result); assertEquals(Collections.emptyList(), result.getPhyOffsets()); } + + @Test + public void testQueryOffsetWithNegativeMaxNum() { + QueryOffsetResult result = indexService.queryOffset("test", "testKey", -1, 0, 100); + assertNotNull(result); + assertEquals(Collections.emptyList(), result.getPhyOffsets()); + } }