2424import com .google .common .annotations .VisibleForTesting ;
2525import com .google .common .collect .Range ;
2626import com .google .common .collect .RangeMap ;
27- import com .google .common .collect .TreeRangeMap ;
2827import io .github .merlimat .slog .Logger ;
2928import io .netty .util .Timeout ;
3029import io .netty .util .Timer ;
@@ -107,7 +106,7 @@ public static record SnapshotKey(long ledgerId, long entryId) {}
107106
108107 @ Getter
109108 @ VisibleForTesting
110- private final RangeMap < Long , ImmutableBucket > immutableBuckets ;
109+ private final ImmutableBucketIndex immutableBuckets ;
111110
112111 private final ConcurrentHashMap <SnapshotKey , ImmutableBucket > snapshotSegmentLastIndexMap ;
113112
@@ -154,7 +153,7 @@ public BucketDelayedDeliveryTracker(DelayedDeliveryContext context,
154153 this .maxIndexesPerBucketSnapshotSegment = maxIndexesPerBucketSnapshotSegment ;
155154 this .maxNumBuckets = maxNumBuckets ;
156155 this .sharedBucketPriorityQueue = new TripleLongPriorityQueue ();
157- this .immutableBuckets = TreeRangeMap . create ();
156+ this .immutableBuckets = new ImmutableBucketIndex ();
158157 this .snapshotSegmentLastIndexMap = new ConcurrentHashMap <>();
159158 this .lastMutableBucket =
160159 new MutableBucket (context .getName (), context .getCursor (), FutureUtil .Sequencer .create (),
@@ -241,7 +240,7 @@ private synchronized long recoverBucketSnapshot() throws RecoverDelayedDeliveryT
241240 for (Map .Entry <Range <Long >, ImmutableBucket > mapEntry : toBeDeletedBucketMap .entrySet ()) {
242241 Range <Long > key = mapEntry .getKey ();
243242 ImmutableBucket immutableBucket = mapEntry .getValue ();
244- immutableBucketMap .remove (key );
243+ immutableBuckets .remove (key );
245244 // delete asynchronously without waiting for completion
246245 immutableBucket .asyncDeleteBucketSnapshot (stats );
247246 }
@@ -251,6 +250,8 @@ private synchronized long recoverBucketSnapshot() throws RecoverDelayedDeliveryT
251250 numberDelayedMessages .add (bucket .numberBucketDelayedMessages );
252251 });
253252
253+ immutableBuckets .recomputeCounters ();
254+
254255 log .info ()
255256 .attr ("buckets" , immutableBucketMap .size ())
256257 .attr ("numberDelayedMessages" , numberDelayedMessages .longValue ())
@@ -371,7 +372,7 @@ private void afterCreateImmutableBucket(Pair<ImmutableBucket, DelayedIndex> immu
371372 });
372373
373374 immutableBucket .setCurrentSegmentEntryId (immutableBucket .lastSegmentEntryId );
374- immutableBuckets .asMapOfRanges (). remove (
375+ immutableBuckets .remove (
375376 Range .closed (immutableBucket .startLedgerId , immutableBucket .endLedgerId ));
376377 snapshotSegmentLastIndexMap .remove (
377378 new SnapshotKey (lastDelayedIndex .getLedgerId (), lastDelayedIndex .getEntryId ()));
@@ -409,7 +410,7 @@ public synchronized boolean addMessage(long ledgerId, long entryId, long deliver
409410 afterCreateImmutableBucket (immutableBucketDelayedIndexPair , createStartTime );
410411 lastMutableBucket .resetLastMutableBucketRange ();
411412
412- if (maxNumBuckets > 0 && immutableBuckets .asMapOfRanges (). size () > maxNumBuckets ) {
413+ if (maxNumBuckets > 0 && immutableBuckets .count () > maxNumBuckets ) {
413414 asyncMergeBucketSnapshot ();
414415 }
415416 }
@@ -507,7 +508,7 @@ private synchronized CompletableFuture<Void> asyncMergeBucketSnapshot() {
507508 } else {
508509 log .info ()
509510 .attr ("bucketKeys" , bucketsStr )
510- .attr ("bucketNum" , immutableBuckets .asMapOfRanges (). size ())
511+ .attr ("bucketNum" , immutableBuckets .count ())
511512 .log ("Merge bucket snapshot finish" );
512513
513514 stats .recordSuccessEvent (BucketDelayedMessageIndexStats .Type .merge ,
@@ -577,8 +578,7 @@ private synchronized CompletableFuture<Void> asyncMergeBucketSnapshot(List<Immut
577578 });
578579
579580 for (ImmutableBucket bucket : buckets ) {
580- immutableBuckets .asMapOfRanges ()
581- .remove (Range .closed (bucket .startLedgerId , bucket .endLedgerId ));
581+ immutableBuckets .remove (Range .closed (bucket .startLedgerId , bucket .endLedgerId ));
582582 }
583583 }
584584 });
@@ -644,7 +644,7 @@ public synchronized NavigableSet<Position> getScheduledMessages(int maxMessages)
644644 SnapshotKey snapshotKey = new SnapshotKey (ledgerId , entryId );
645645
646646 ImmutableBucket bucket = snapshotSegmentLastIndexMap .get (snapshotKey );
647- if (bucket != null && immutableBuckets .asMapOfRanges (). containsValue (bucket )) {
647+ if (bucket != null && immutableBuckets .containsValue (bucket )) {
648648 // All message of current snapshot segment are scheduled, try load next snapshot segment
649649 if (bucket .merging ) {
650650 log .info ()
@@ -674,8 +674,7 @@ public synchronized NavigableSet<Position> getScheduledMessages(int maxMessages)
674674 synchronized (BucketDelayedDeliveryTracker .this ) {
675675 this .snapshotSegmentLastIndexMap .remove (snapshotKey );
676676 if (CollectionUtils .isEmpty (indexList )) {
677- immutableBuckets .asMapOfRanges ()
678- .remove (Range .closed (bucket .startLedgerId , bucket .endLedgerId ));
677+ immutableBuckets .remove (Range .closed (bucket .startLedgerId , bucket .endLedgerId ));
679678 bucket .asyncDeleteBucketSnapshot (stats );
680679 return ;
681680 }
@@ -807,13 +806,9 @@ public synchronized boolean containsMessage(long ledgerId, long entryId) {
807806 }
808807
809808 public Map <String , TopicMetricBean > genTopicMetricMap () {
810- stats .recordNumOfBuckets (immutableBuckets . asMapOfRanges (). size () + 1 );
809+ stats .recordNumOfBuckets (( int ) ( immutableBuckets . count () + 1 ) );
811810 stats .recordDelayedMessageIndexLoaded (this .sharedBucketPriorityQueue .size () + this .lastMutableBucket .size ());
812- MutableLong totalSnapshotLength = new MutableLong ();
813- immutableBuckets .asMapOfRanges ().values ().forEach (immutableBucket -> {
814- totalSnapshotLength .add (immutableBucket .getSnapshotLength ());
815- });
816- stats .recordBucketSnapshotSizeBytes (totalSnapshotLength .longValue ());
811+ stats .recordBucketSnapshotSizeBytes (immutableBuckets .totalSnapshotLength ());
817812 return stats .genTopicMetricMap ();
818813 }
819814}
0 commit comments