@@ -65,52 +65,71 @@ public void testSimplePrimary() {
65
65
assertThat (seqNo1 , equalTo (0L ));
66
66
tracker .markSeqNoAsCompleted (seqNo1 );
67
67
assertThat (tracker .getCheckpoint (), equalTo (0L ));
68
+ assertThat (tracker .contains (0L ), equalTo (true ));
69
+ assertThat (tracker .contains (atLeast (1 )), equalTo (false ));
68
70
seqNo1 = tracker .generateSeqNo ();
69
71
seqNo2 = tracker .generateSeqNo ();
70
72
assertThat (seqNo1 , equalTo (1L ));
71
73
assertThat (seqNo2 , equalTo (2L ));
72
74
tracker .markSeqNoAsCompleted (seqNo2 );
73
75
assertThat (tracker .getCheckpoint (), equalTo (0L ));
76
+ assertThat (tracker .contains (seqNo1 ), equalTo (false ));
77
+ assertThat (tracker .contains (seqNo2 ), equalTo (true ));
74
78
tracker .markSeqNoAsCompleted (seqNo1 );
75
79
assertThat (tracker .getCheckpoint (), equalTo (2L ));
80
+ assertThat (tracker .contains (between (0 , 2 )), equalTo (true ));
81
+ assertThat (tracker .contains (atLeast (3 )), equalTo (false ));
76
82
}
77
83
78
84
public void testSimpleReplica () {
79
85
assertThat (tracker .getCheckpoint (), equalTo (SequenceNumbers .NO_OPS_PERFORMED ));
86
+ assertThat (tracker .contains (randomNonNegativeLong ()), equalTo (false ));
80
87
tracker .markSeqNoAsCompleted (0L );
81
88
assertThat (tracker .getCheckpoint (), equalTo (0L ));
89
+ assertThat (tracker .contains (0 ), equalTo (true ));
82
90
tracker .markSeqNoAsCompleted (2L );
83
91
assertThat (tracker .getCheckpoint (), equalTo (0L ));
92
+ assertThat (tracker .contains (1L ), equalTo (false ));
93
+ assertThat (tracker .contains (2L ), equalTo (true ));
84
94
tracker .markSeqNoAsCompleted (1L );
85
95
assertThat (tracker .getCheckpoint (), equalTo (2L ));
96
+ assertThat (tracker .contains (between (0 , 2 )), equalTo (true ));
97
+ assertThat (tracker .contains (atLeast (3 )), equalTo (false ));
86
98
}
87
99
88
100
public void testLazyInitialization () {
89
101
/*
90
102
* Previously this would allocate the entire chain of bit sets to the one for the sequence number being marked; for very large
91
103
* sequence numbers this could lead to excessive memory usage resulting in out of memory errors.
92
104
*/
93
- tracker .markSeqNoAsCompleted (randomNonNegativeLong ());
105
+ long seqNo = randomNonNegativeLong ();
106
+ tracker .markSeqNoAsCompleted (seqNo );
107
+ assertThat (tracker .processedSeqNo .size (), equalTo (1 ));
108
+ assertThat (tracker .contains (seqNo ), equalTo (true ));
109
+ assertThat (tracker .contains (randomValueOtherThan (seqNo , ESTestCase ::randomNonNegativeLong )), equalTo (false ));
94
110
assertThat (tracker .processedSeqNo .size (), equalTo (1 ));
95
111
}
96
112
97
113
public void testSimpleOverFlow () {
98
- List <Integer > seqNoList = new ArrayList <>();
114
+ List <Long > seqNoList = new ArrayList <>();
99
115
final boolean aligned = randomBoolean ();
100
116
final int maxOps = BIT_SET_SIZE * randomIntBetween (1 , 5 ) + (aligned ? 0 : randomIntBetween (1 , BIT_SET_SIZE - 1 ));
101
117
102
- for (int i = 0 ; i < maxOps ; i ++) {
118
+ for (long i = 0 ; i < maxOps ; i ++) {
103
119
seqNoList .add (i );
104
120
}
105
121
Collections .shuffle (seqNoList , random ());
106
- for (Integer seqNo : seqNoList ) {
122
+ for (Long seqNo : seqNoList ) {
107
123
tracker .markSeqNoAsCompleted (seqNo );
108
124
}
109
125
assertThat (tracker .checkpoint , equalTo (maxOps - 1L ));
110
126
assertThat (tracker .processedSeqNo .size (), equalTo (aligned ? 0 : 1 ));
111
127
if (aligned == false ) {
112
128
assertThat (tracker .processedSeqNo .keys ().iterator ().next ().value , equalTo (tracker .checkpoint / BIT_SET_SIZE ));
113
129
}
130
+ assertThat (tracker .contains (randomFrom (seqNoList )), equalTo (true ));
131
+ final long notCompletedSeqNo = randomValueOtherThanMany (seqNoList ::contains , ESTestCase ::randomNonNegativeLong );
132
+ assertThat (tracker .contains (notCompletedSeqNo ), equalTo (false ));
114
133
}
115
134
116
135
public void testConcurrentPrimary () throws InterruptedException {
@@ -199,8 +218,12 @@ protected void doRun() throws Exception {
199
218
}
200
219
assertThat (tracker .getMaxSeqNo (), equalTo (maxOps - 1L ));
201
220
assertThat (tracker .getCheckpoint (), equalTo (unFinishedSeq - 1L ));
221
+ assertThat (tracker .contains (randomValueOtherThan (unFinishedSeq , () -> (long ) randomFrom (seqNos ))), equalTo (true ));
222
+ assertThat (tracker .contains (unFinishedSeq ), equalTo (false ));
202
223
tracker .markSeqNoAsCompleted (unFinishedSeq );
203
224
assertThat (tracker .getCheckpoint (), equalTo (maxOps - 1L ));
225
+ assertThat (tracker .contains (unFinishedSeq ), equalTo (true ));
226
+ assertThat (tracker .contains (randomLongBetween (maxOps , Long .MAX_VALUE )), equalTo (false ));
204
227
assertThat (tracker .processedSeqNo .size (), isOneOf (0 , 1 ));
205
228
if (tracker .processedSeqNo .size () == 1 ) {
206
229
assertThat (tracker .processedSeqNo .keys ().iterator ().next ().value , equalTo (tracker .checkpoint / BIT_SET_SIZE ));
@@ -272,4 +295,23 @@ public void describeTo(Description description) {
272
295
});
273
296
assertThat (tracker .generateSeqNo (), equalTo ((long ) (maxSeqNo + 1 )));
274
297
}
298
+
299
+ public void testContains () {
300
+ final long maxSeqNo = randomLongBetween (SequenceNumbers .NO_OPS_PERFORMED , 100 );
301
+ final long localCheckpoint = randomLongBetween (SequenceNumbers .NO_OPS_PERFORMED , maxSeqNo );
302
+ final LocalCheckpointTracker tracker = new LocalCheckpointTracker (maxSeqNo , localCheckpoint );
303
+ if (localCheckpoint >= 0 ) {
304
+ assertThat (tracker .contains (randomLongBetween (0 , localCheckpoint )), equalTo (true ));
305
+ }
306
+ assertThat (tracker .contains (randomLongBetween (localCheckpoint + 1 , Long .MAX_VALUE )), equalTo (false ));
307
+ final int numOps = between (1 , 100 );
308
+ final List <Long > seqNos = new ArrayList <>();
309
+ for (int i = 0 ; i < numOps ; i ++) {
310
+ long seqNo = randomLongBetween (0 , 1000 );
311
+ seqNos .add (seqNo );
312
+ tracker .markSeqNoAsCompleted (seqNo );
313
+ }
314
+ final long seqNo = randomNonNegativeLong ();
315
+ assertThat (tracker .contains (seqNo ), equalTo (seqNo <= localCheckpoint || seqNos .contains (seqNo )));
316
+ }
275
317
}
0 commit comments