1111
1212package com .automq .stream .s3 .index ;
1313
14+ import com .automq .stream .utils .MockTime ;
1415import java .util .ArrayList ;
1516import java .util .Collections ;
1617import java .util .List ;
1920import java .util .concurrent .CompletableFuture ;
2021import java .util .concurrent .CopyOnWriteArrayList ;
2122import java .util .concurrent .TimeUnit ;
22- import org .junit .jupiter .api .AfterEach ;
2323import org .junit .jupiter .api .Assertions ;
2424import org .junit .jupiter .api .BeforeEach ;
2525import org .junit .jupiter .api .Test ;
@@ -31,11 +31,6 @@ public void setUp() {
3131 NodeRangeIndexCache .getInstance ().clear ();
3232 }
3333
34- @ AfterEach
35- public void tearDown () {
36- NodeRangeIndexCache .getInstance ().clear ();
37- }
38-
3934 @ Test
4035 public void testIndex () {
4136 int node0 = 32 ;
@@ -52,43 +47,47 @@ public void testIndex() {
5247 new RangeIndex (50 , 100 , object0 ),
5348 new RangeIndex (150 , 250 , object1 ),
5449 new RangeIndex (300 , 400 , object2 )));
50+
51+ MockTime time = new MockTime ();
5552 // refresh cache
56- NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 50 , () -> CompletableFuture .completedFuture (streamRangeMap0 ));
53+ NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 50 ,
54+ () -> CompletableFuture .completedFuture (streamRangeMap0 ), time );
5755
5856 Assertions .assertTrue (NodeRangeIndexCache .getInstance ().isValid (node0 ));
5957 Assertions .assertFalse (NodeRangeIndexCache .getInstance ().isValid (node1 ));
6058 Assertions .assertEquals (-1 , NodeRangeIndexCache .getInstance ().searchObjectId (node1 , stream0 , 50 ,
61- () -> CompletableFuture .completedFuture (Collections .emptyMap ())).join ());
59+ () -> CompletableFuture .completedFuture (Collections .emptyMap ()), time ).join ());
6260 Assertions .assertEquals (-1 , NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream1 , 50 ,
63- () -> CompletableFuture .completedFuture (streamRangeMap0 )).join ());
61+ () -> CompletableFuture .completedFuture (streamRangeMap0 ), time ).join ());
6462 Assertions .assertEquals (-1 , NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 0 ,
65- () -> CompletableFuture .completedFuture (streamRangeMap0 )).join ());
63+ () -> CompletableFuture .completedFuture (streamRangeMap0 ), time ).join ());
6664 Assertions .assertEquals (object0 , NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 50 ,
67- () -> CompletableFuture .completedFuture (streamRangeMap0 )).join ());
65+ () -> CompletableFuture .completedFuture (streamRangeMap0 ), time ).join ());
6866 Assertions .assertEquals (object0 , NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 100 ,
69- () -> CompletableFuture .completedFuture (streamRangeMap0 )).join ());
67+ () -> CompletableFuture .completedFuture (streamRangeMap0 ), time ).join ());
7068 Assertions .assertEquals (object1 , NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 200 ,
71- () -> CompletableFuture .completedFuture (streamRangeMap0 )).join ());
69+ () -> CompletableFuture .completedFuture (streamRangeMap0 ), time ).join ());
7270 Assertions .assertEquals (object2 , NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 300 ,
73- () -> CompletableFuture .completedFuture (streamRangeMap0 )).join ());
71+ () -> CompletableFuture .completedFuture (streamRangeMap0 ), time ).join ());
7472 Assertions .assertEquals (object2 , NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 500 ,
75- () -> CompletableFuture .completedFuture (streamRangeMap0 )).join ());
73+ () -> CompletableFuture .completedFuture (streamRangeMap0 ), time ).join ());
7674
7775 NodeRangeIndexCache .getInstance ().invalidate (node0 );
76+ time .setCurrentTimeMs (time .milliseconds () + NodeRangeIndexCache .MIN_CACHE_UPDATE_INTERVAL_MS );
7877 Map <Long , List <RangeIndex >> streamRangeMap1 = Map .of (stream0 , List .of (
7978 new RangeIndex (50 , 300 , object3 ),
8079 new RangeIndex (500 , 600 , object4 )));
8180 Assertions .assertFalse (NodeRangeIndexCache .getInstance ().isValid (node0 ));
8281 Assertions .assertEquals (-1 , NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 0 ,
83- () -> CompletableFuture .completedFuture (streamRangeMap1 )).join ());
82+ () -> CompletableFuture .completedFuture (streamRangeMap1 ), time ).join ());
8483 Assertions .assertEquals (object3 , NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 50 ,
85- () -> CompletableFuture .completedFuture (streamRangeMap1 )).join ());
84+ () -> CompletableFuture .completedFuture (streamRangeMap1 ), time ).join ());
8685 Assertions .assertEquals (object3 , NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 400 ,
87- () -> CompletableFuture .completedFuture (streamRangeMap1 )).join ());
86+ () -> CompletableFuture .completedFuture (streamRangeMap1 ), time ).join ());
8887 Assertions .assertEquals (object4 , NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 500 ,
89- () -> CompletableFuture .completedFuture (streamRangeMap1 )).join ());
88+ () -> CompletableFuture .completedFuture (streamRangeMap1 ), time ).join ());
9089 Assertions .assertEquals (object4 , NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 1000 ,
91- () -> CompletableFuture .completedFuture (streamRangeMap1 )).join ());
90+ () -> CompletableFuture .completedFuture (streamRangeMap1 ), time ).join ());
9291 }
9392
9493 @ Test
@@ -106,6 +105,32 @@ public void testLRUCache() throws InterruptedException {
106105 Assertions .assertTrue (NodeRangeIndexCache .getInstance ().cache ().totalSize () - 100 * 1024 * 1024 <= 1000 * Long .BYTES );
107106 }
108107
108+ @ Test
109+ public void testUpdateCacheFrequency () {
110+ int node0 = 32 ;
111+ long stream0 = 0 ;
112+ int object0 = 99 ;
113+ Map <Long , List <RangeIndex >> streamRangeMap0 = Map .of (stream0 , List .of (
114+ new RangeIndex (50 , 100 , object0 )));
115+
116+ MockTime mockTime = new MockTime ();
117+ // refresh cache
118+ Assertions .assertEquals (object0 , NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 50 ,
119+ () -> CompletableFuture .completedFuture (streamRangeMap0 ), mockTime ).join ());
120+ NodeRangeIndexCache .getInstance ().invalidate (node0 );
121+
122+ CompletableFuture <Long > cf = NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 50 ,
123+ () -> CompletableFuture .completedFuture (streamRangeMap0 ), mockTime );
124+ Assertions .assertTrue (cf .isDone ());
125+ Assertions .assertEquals (-1L , cf .join ());
126+
127+ mockTime .setCurrentTimeMs (mockTime .milliseconds () + NodeRangeIndexCache .MIN_CACHE_UPDATE_INTERVAL_MS );
128+ cf = NodeRangeIndexCache .getInstance ().searchObjectId (node0 , stream0 , 50 ,
129+ () -> CompletableFuture .completedFuture (streamRangeMap0 ), mockTime );
130+ Assertions .assertTrue (cf .isDone ());
131+ Assertions .assertEquals (object0 , cf .join ());
132+ }
133+
109134 private List <RangeIndex > createRangeIndex (int size ) {
110135 List <RangeIndex > index = new ArrayList <>();
111136 int curr = 0 ;
0 commit comments