diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/protocol/statictopic/TopicQueueMappingUtils.java b/remoting/src/main/java/org/apache/rocketmq/remoting/protocol/statictopic/TopicQueueMappingUtils.java index 647669fde24..7fbc2b3d906 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/protocol/statictopic/TopicQueueMappingUtils.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/protocol/statictopic/TopicQueueMappingUtils.java @@ -338,7 +338,7 @@ public static void checkPhysicalQueueConsistence(Map checkAndBuildMappingItems(List mappingDetailList, boolean replace, boolean checkConsistence) { - mappingDetailList.sort((o1, o2) -> (int) (o2.getEpoch() - o1.getEpoch())); + mappingDetailList.sort((o1, o2) -> Long.compare(o2.getEpoch(), o1.getEpoch())); int maxNum = 0; Map globalIdMap = new HashMap<>(); diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/rpc/ClientMetadata.java b/remoting/src/main/java/org/apache/rocketmq/remoting/rpc/ClientMetadata.java index d4962e00a58..61f0b3388d1 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/rpc/ClientMetadata.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/rpc/ClientMetadata.java @@ -119,7 +119,7 @@ public static ConcurrentMap topicRouteData2EndpointsForSta Map topicQueueMappingInfoMap = mapEntry.getValue(); ConcurrentMap mqEndPoints = new ConcurrentHashMap<>(); List> mappingInfos = new ArrayList<>(topicQueueMappingInfoMap.entrySet()); - mappingInfos.sort((o1, o2) -> (int) (o2.getValue().getEpoch() - o1.getValue().getEpoch())); + mappingInfos.sort((o1, o2) -> Long.compare(o2.getValue().getEpoch(), o1.getValue().getEpoch())); int maxTotalNums = 0; long maxTotalNumOfEpoch = -1; for (Map.Entry entry : mappingInfos) { diff --git a/remoting/src/test/java/org/apache/rocketmq/remoting/protocol/statictopic/TopicQueueMappingUtilsTest.java b/remoting/src/test/java/org/apache/rocketmq/remoting/protocol/statictopic/TopicQueueMappingUtilsTest.java index a12c9f89200..b91b311369c 100644 --- a/remoting/src/test/java/org/apache/rocketmq/remoting/protocol/statictopic/TopicQueueMappingUtilsTest.java +++ b/remoting/src/test/java/org/apache/rocketmq/remoting/protocol/statictopic/TopicQueueMappingUtilsTest.java @@ -31,6 +31,23 @@ public class TopicQueueMappingUtilsTest { + @Test + public void testCheckAndBuildMappingItemsChoosesLatestEpochWithoutOverflow() { + TopicQueueMappingDetail latest = buildMappingDetail("latest", Long.MAX_VALUE); + TopicQueueMappingDetail stale = buildMappingDetail("stale", 0); + + Map result = TopicQueueMappingUtils.checkAndBuildMappingItems( + new ArrayList<>(java.util.Arrays.asList(latest, stale)), true, false); + + Assert.assertEquals("latest", result.get(0).getBname()); + } + + private TopicQueueMappingDetail buildMappingDetail(String brokerName, long epoch) { + TopicQueueMappingDetail detail = new TopicQueueMappingDetail("topic", 1, brokerName, epoch); + LogicQueueMappingItem item = new LogicQueueMappingItem(0, 0, brokerName, 0, 0, -1, -1, -1); + detail.getHostedQueues().put(0, new ArrayList<>(Collections.singletonList(item))); + return detail; + } private Set buildTargetBrokers(int num) { return buildTargetBrokers(num, "");