From 86d213a28854a771bc5cf35b1c1be87642c36bfb Mon Sep 17 00:00:00 2001 From: hyc <2768167716@qq.com> Date: Tue, 31 Mar 2026 13:50:32 +0800 Subject: [PATCH] [ISSUE #10193] Fix incorrect min offset when local store returns -1 When the local store has no valid min offset and returns -1 as a sentinel value, TieredMessageStore.getMinOffsetInQueue() incorrectly returns -1 via Math.min(-1, tieredOffset), ignoring a valid tiered store offset. Add a guard for minOffsetInNextStore < 0 before the Math.min comparison, returning the tiered store offset directly when the local store has no valid data. Add test case covering local=-1 with valid tiered offset. --- .../org/apache/rocketmq/tieredstore/TieredMessageStore.java | 3 +++ .../apache/rocketmq/tieredstore/TieredMessageStoreTest.java | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/tieredstore/src/main/java/org/apache/rocketmq/tieredstore/TieredMessageStore.java b/tieredstore/src/main/java/org/apache/rocketmq/tieredstore/TieredMessageStore.java index 38946fd1611..42391e79a30 100644 --- a/tieredstore/src/main/java/org/apache/rocketmq/tieredstore/TieredMessageStore.java +++ b/tieredstore/src/main/java/org/apache/rocketmq/tieredstore/TieredMessageStore.java @@ -310,6 +310,9 @@ public long getMinOffsetInQueue(String topic, int queueId) { if (minOffsetInTieredStore < 0) { return minOffsetInNextStore; } + if (minOffsetInNextStore < 0) { + return minOffsetInTieredStore; + } return Math.min(minOffsetInNextStore, minOffsetInTieredStore); } diff --git a/tieredstore/src/test/java/org/apache/rocketmq/tieredstore/TieredMessageStoreTest.java b/tieredstore/src/test/java/org/apache/rocketmq/tieredstore/TieredMessageStoreTest.java index f88779f09b2..5134a016f69 100644 --- a/tieredstore/src/test/java/org/apache/rocketmq/tieredstore/TieredMessageStoreTest.java +++ b/tieredstore/src/test/java/org/apache/rocketmq/tieredstore/TieredMessageStoreTest.java @@ -240,6 +240,12 @@ public void testGetMinOffsetInQueue() { Mockito.when(flatFile.getConsumeQueueMinOffset()).thenReturn(10L); Assert.assertEquals(10L, currentStore.getMinOffsetInQueue(mq.getTopic(), mq.getQueueId())); + + // When local store returns -1 (no valid offset), tiered store offset should be used + long tieredOffset = flatFile.getConsumeQueueMinOffset(); + Assert.assertTrue("tiered offset should be valid for this test", tieredOffset >= 0); + Mockito.when(defaultStore.getMinOffsetInQueue(anyString(), anyInt())).thenReturn(-1L); + Assert.assertEquals(tieredOffset, currentStore.getMinOffsetInQueue(mq.getTopic(), mq.getQueueId())); } @Test