From 01828df993a61bc44232762a581b722ad01bda27 Mon Sep 17 00:00:00 2001 From: kris20030907 <3185633428@qq.com> Date: Sun, 22 Mar 2026 17:44:57 +0800 Subject: [PATCH 1/2] fix: incorrect min offset returned from TieredMessageStore when local store returns -1 --- .../rocketmq/tieredstore/TieredMessageStore.java | 3 +++ .../tieredstore/TieredMessageStoreTest.java | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) 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..6bad8ebb746 100644 --- a/tieredstore/src/test/java/org/apache/rocketmq/tieredstore/TieredMessageStoreTest.java +++ b/tieredstore/src/test/java/org/apache/rocketmq/tieredstore/TieredMessageStoreTest.java @@ -238,7 +238,21 @@ public void testGetMinOffsetInQueue() { Mockito.when(defaultStore.getMinOffsetInQueue(anyString(), anyInt())).thenReturn(100L); Assert.assertEquals(100L, currentStore.getMinOffsetInQueue(mq.getTopic(), mq.getQueueId())); - Mockito.when(flatFile.getConsumeQueueMinOffset()).thenReturn(10L); + Assert.assertEquals(flatFile.getConsumeQueueMinOffset(), + currentStore.getMinOffsetInQueue(mq.getTopic(), mq.getQueueId())); + + FlatFileStore mockFlatFileStore = Mockito.mock(FlatFileStore.class); + FlatMessageFile mockFlatFile = Mockito.mock(FlatMessageFile.class); + Mockito.when(mockFlatFileStore.getFlatFile(any(MessageQueue.class))).thenReturn(mockFlatFile); + Mockito.when(mockFlatFile.getConsumeQueueMinOffset()).thenReturn(10L); + Mockito.when(defaultStore.getMinOffsetInQueue(anyString(), anyInt())).thenReturn(-1L); + try { + Field field = currentStore.getClass().getDeclaredField("flatFileStore"); + field.setAccessible(true); + field.set(currentStore, mockFlatFileStore); + } catch (NoSuchFieldException | IllegalAccessException e) { + Assert.fail(e.getClass().getCanonicalName() + ": " + e.getMessage()); + } Assert.assertEquals(10L, currentStore.getMinOffsetInQueue(mq.getTopic(), mq.getQueueId())); } From 2758c4f44c7b0fd9908f2dc3a43fd7d4520a7cff Mon Sep 17 00:00:00 2001 From: kris20030907 <3185633428@qq.com> Date: Fri, 3 Apr 2026 21:48:02 +0800 Subject: [PATCH 2/2] fix: test --- .../tieredstore/TieredMessageStoreTest.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) 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 6bad8ebb746..d4f97b8920e 100644 --- a/tieredstore/src/test/java/org/apache/rocketmq/tieredstore/TieredMessageStoreTest.java +++ b/tieredstore/src/test/java/org/apache/rocketmq/tieredstore/TieredMessageStoreTest.java @@ -238,22 +238,9 @@ public void testGetMinOffsetInQueue() { Mockito.when(defaultStore.getMinOffsetInQueue(anyString(), anyInt())).thenReturn(100L); Assert.assertEquals(100L, currentStore.getMinOffsetInQueue(mq.getTopic(), mq.getQueueId())); + Mockito.when(defaultStore.getMinOffsetInQueue(anyString(), anyInt())).thenReturn(-1L); Assert.assertEquals(flatFile.getConsumeQueueMinOffset(), currentStore.getMinOffsetInQueue(mq.getTopic(), mq.getQueueId())); - - FlatFileStore mockFlatFileStore = Mockito.mock(FlatFileStore.class); - FlatMessageFile mockFlatFile = Mockito.mock(FlatMessageFile.class); - Mockito.when(mockFlatFileStore.getFlatFile(any(MessageQueue.class))).thenReturn(mockFlatFile); - Mockito.when(mockFlatFile.getConsumeQueueMinOffset()).thenReturn(10L); - Mockito.when(defaultStore.getMinOffsetInQueue(anyString(), anyInt())).thenReturn(-1L); - try { - Field field = currentStore.getClass().getDeclaredField("flatFileStore"); - field.setAccessible(true); - field.set(currentStore, mockFlatFileStore); - } catch (NoSuchFieldException | IllegalAccessException e) { - Assert.fail(e.getClass().getCanonicalName() + ": " + e.getMessage()); - } - Assert.assertEquals(10L, currentStore.getMinOffsetInQueue(mq.getTopic(), mq.getQueueId())); } @Test