@@ -65,52 +65,71 @@ public void testSimplePrimary() {
6565 assertThat (seqNo1 , equalTo (0L ));
6666 tracker .markSeqNoAsCompleted (seqNo1 );
6767 assertThat (tracker .getCheckpoint (), equalTo (0L ));
68+ assertThat (tracker .contains (0L ), equalTo (true ));
69+ assertThat (tracker .contains (atLeast (1 )), equalTo (false ));
6870 seqNo1 = tracker .generateSeqNo ();
6971 seqNo2 = tracker .generateSeqNo ();
7072 assertThat (seqNo1 , equalTo (1L ));
7173 assertThat (seqNo2 , equalTo (2L ));
7274 tracker .markSeqNoAsCompleted (seqNo2 );
7375 assertThat (tracker .getCheckpoint (), equalTo (0L ));
76+ assertThat (tracker .contains (seqNo1 ), equalTo (false ));
77+ assertThat (tracker .contains (seqNo2 ), equalTo (true ));
7478 tracker .markSeqNoAsCompleted (seqNo1 );
7579 assertThat (tracker .getCheckpoint (), equalTo (2L ));
80+ assertThat (tracker .contains (between (0 , 2 )), equalTo (true ));
81+ assertThat (tracker .contains (atLeast (3 )), equalTo (false ));
7682 }
7783
7884 public void testSimpleReplica () {
7985 assertThat (tracker .getCheckpoint (), equalTo (SequenceNumbers .NO_OPS_PERFORMED ));
86+ assertThat (tracker .contains (randomNonNegativeLong ()), equalTo (false ));
8087 tracker .markSeqNoAsCompleted (0L );
8188 assertThat (tracker .getCheckpoint (), equalTo (0L ));
89+ assertThat (tracker .contains (0 ), equalTo (true ));
8290 tracker .markSeqNoAsCompleted (2L );
8391 assertThat (tracker .getCheckpoint (), equalTo (0L ));
92+ assertThat (tracker .contains (1L ), equalTo (false ));
93+ assertThat (tracker .contains (2L ), equalTo (true ));
8494 tracker .markSeqNoAsCompleted (1L );
8595 assertThat (tracker .getCheckpoint (), equalTo (2L ));
96+ assertThat (tracker .contains (between (0 , 2 )), equalTo (true ));
97+ assertThat (tracker .contains (atLeast (3 )), equalTo (false ));
8698 }
8799
88100 public void testLazyInitialization () {
89101 /*
90102 * Previously this would allocate the entire chain of bit sets to the one for the sequence number being marked; for very large
91103 * sequence numbers this could lead to excessive memory usage resulting in out of memory errors.
92104 */
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 ));
94110 assertThat (tracker .processedSeqNo .size (), equalTo (1 ));
95111 }
96112
97113 public void testSimpleOverFlow () {
98- List <Integer > seqNoList = new ArrayList <>();
114+ List <Long > seqNoList = new ArrayList <>();
99115 final boolean aligned = randomBoolean ();
100116 final int maxOps = BIT_SET_SIZE * randomIntBetween (1 , 5 ) + (aligned ? 0 : randomIntBetween (1 , BIT_SET_SIZE - 1 ));
101117
102- for (int i = 0 ; i < maxOps ; i ++) {
118+ for (long i = 0 ; i < maxOps ; i ++) {
103119 seqNoList .add (i );
104120 }
105121 Collections .shuffle (seqNoList , random ());
106- for (Integer seqNo : seqNoList ) {
122+ for (Long seqNo : seqNoList ) {
107123 tracker .markSeqNoAsCompleted (seqNo );
108124 }
109125 assertThat (tracker .checkpoint , equalTo (maxOps - 1L ));
110126 assertThat (tracker .processedSeqNo .size (), equalTo (aligned ? 0 : 1 ));
111127 if (aligned == false ) {
112128 assertThat (tracker .processedSeqNo .keys ().iterator ().next ().value , equalTo (tracker .checkpoint / BIT_SET_SIZE ));
113129 }
130+ assertThat (tracker .contains (randomFrom (seqNoList )), equalTo (true ));
131+ final long notCompletedSeqNo = randomValueOtherThanMany (seqNoList ::contains , ESTestCase ::randomNonNegativeLong );
132+ assertThat (tracker .contains (notCompletedSeqNo ), equalTo (false ));
114133 }
115134
116135 public void testConcurrentPrimary () throws InterruptedException {
@@ -199,8 +218,12 @@ protected void doRun() throws Exception {
199218 }
200219 assertThat (tracker .getMaxSeqNo (), equalTo (maxOps - 1L ));
201220 assertThat (tracker .getCheckpoint (), equalTo (unFinishedSeq - 1L ));
221+ assertThat (tracker .contains (randomValueOtherThan (unFinishedSeq , () -> (long ) randomFrom (seqNos ))), equalTo (true ));
222+ assertThat (tracker .contains (unFinishedSeq ), equalTo (false ));
202223 tracker .markSeqNoAsCompleted (unFinishedSeq );
203224 assertThat (tracker .getCheckpoint (), equalTo (maxOps - 1L ));
225+ assertThat (tracker .contains (unFinishedSeq ), equalTo (true ));
226+ assertThat (tracker .contains (randomLongBetween (maxOps , Long .MAX_VALUE )), equalTo (false ));
204227 assertThat (tracker .processedSeqNo .size (), isOneOf (0 , 1 ));
205228 if (tracker .processedSeqNo .size () == 1 ) {
206229 assertThat (tracker .processedSeqNo .keys ().iterator ().next ().value , equalTo (tracker .checkpoint / BIT_SET_SIZE ));
@@ -272,4 +295,23 @@ public void describeTo(Description description) {
272295 });
273296 assertThat (tracker .generateSeqNo (), equalTo ((long ) (maxSeqNo + 1 )));
274297 }
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+ }
275317}
0 commit comments