lhotari commented on code in PR #24730: URL: https://github.com/apache/pulsar/pull/24730#discussion_r2342198254
########## pulsar-broker/src/test/java/org/apache/pulsar/broker/service/HashRangeExclusiveStickyKeyConsumerSelectorTest.java: ########## @@ -89,6 +89,38 @@ public void testConsumerSelect() throws ExecutionException, InterruptedException Assert.assertNull(selectedConsumer); } + + @Test + public void testConsumerSelectWithMultipRanges() throws ExecutionException, InterruptedException { Review Comment: Multip -> Multiple ########## pulsar-broker/src/main/java/org/apache/pulsar/broker/service/HashRangeExclusiveStickyKeyConsumerSelector.java: ########## @@ -143,34 +153,38 @@ private synchronized CompletableFuture<Void> validateKeySharedMeta(Consumer cons } } - private synchronized Consumer findConflictingConsumer(List<IntRange> ranges) { - for (IntRange intRange : ranges) { - Map.Entry<Integer, Consumer> ceilingEntry = rangeMap.ceilingEntry(intRange.getStart()); - Map.Entry<Integer, Consumer> floorEntry = rangeMap.floorEntry(intRange.getEnd()); - - if (floorEntry != null && floorEntry.getKey() >= intRange.getStart()) { - return floorEntry.getValue(); - } - - if (ceilingEntry != null && ceilingEntry.getKey() <= intRange.getEnd()) { - return ceilingEntry.getValue(); + private synchronized Consumer findConflictingConsumer(List<IntRange> newConsumerRanges) { + for (IntRange newRange : newConsumerRanges) { + // 1. Check for potential conflicts with existing ranges that start before newRange's start. + Map.Entry<Integer, Pair<Range, Consumer>> conflictBeforeStart = rangeMap.floorEntry(newRange.getStart()); + if (conflictBeforeStart != null) { + Range existingRange = conflictBeforeStart.getValue().getLeft(); + if (checkRangesOverlap(newRange, existingRange)) { + return conflictBeforeStart.getValue().getRight(); + } } - - if (ceilingEntry != null && floorEntry != null && ceilingEntry.getValue().equals(floorEntry.getValue())) { - KeySharedMeta keySharedMeta = ceilingEntry.getValue().getKeySharedMeta(); - for (IntRange range : keySharedMeta.getHashRangesList()) { - int start = Math.max(intRange.getStart(), range.getStart()); - int end = Math.min(intRange.getEnd(), range.getEnd()); - if (end >= start) { - return ceilingEntry.getValue(); - } + // 2. Check for potential conflicts with existing ranges that start after newRange's start. + Map.Entry<Integer, Pair<Range, Consumer>> conflictAfterStart = rangeMap.ceilingEntry(newRange.getStart()); + if (conflictAfterStart != null) { + Range existingRange = conflictAfterStart.getValue().getLeft(); + if (checkRangesOverlap(newRange, existingRange)) { + return conflictAfterStart.getValue().getRight(); } } } return null; } - Map<Integer, Consumer> getRangeConsumer() { + + private boolean checkRangesOverlap(IntRange range1, Range range2) { Review Comment: make it static since it's not using instance fields ########## pulsar-broker/src/test/java/org/apache/pulsar/broker/service/HashRangeExclusiveStickyKeyConsumerSelectorTest.java: ########## @@ -189,6 +221,32 @@ public void testGetConsumerKeyHashRangesWithSameConsumerName() throws Exception } } + @Test + public void testOneConsumerRangeConflict() throws ExecutionException, InterruptedException { Review Comment: It's a bit unclear from the test name what this is testing. Perhaps testAddingConsumerWithMultipleRangeConflicts is what this does and how this differs from following tests? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@pulsar.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org