@@ -193,6 +193,105 @@ public void testAddRetentionLeaseCausesRetentionLeaseSync() {
193
193
}
194
194
}
195
195
196
+ public void testRemoveRetentionLease () {
197
+ final AllocationId allocationId = AllocationId .newInitializing ();
198
+ long primaryTerm = randomLongBetween (1 , Long .MAX_VALUE );
199
+ final ReplicationTracker replicationTracker = new ReplicationTracker (
200
+ new ShardId ("test" , "_na" , 0 ),
201
+ allocationId .getId (),
202
+ IndexSettingsModule .newIndexSettings ("test" , Settings .EMPTY ),
203
+ primaryTerm ,
204
+ UNASSIGNED_SEQ_NO ,
205
+ value -> {},
206
+ () -> 0L ,
207
+ (leases , listener ) -> {});
208
+ replicationTracker .updateFromMaster (
209
+ randomNonNegativeLong (),
210
+ Collections .singleton (allocationId .getId ()),
211
+ routingTable (Collections .emptySet (), allocationId ),
212
+ Collections .emptySet ());
213
+ replicationTracker .activatePrimaryMode (SequenceNumbers .NO_OPS_PERFORMED );
214
+ final int length = randomIntBetween (0 , 8 );
215
+ final long [] minimumRetainingSequenceNumbers = new long [length ];
216
+ for (int i = 0 ; i < length ; i ++) {
217
+ if (rarely () && primaryTerm < Long .MAX_VALUE ) {
218
+ primaryTerm = randomLongBetween (primaryTerm + 1 , Long .MAX_VALUE );
219
+ replicationTracker .setOperationPrimaryTerm (primaryTerm );
220
+ }
221
+ minimumRetainingSequenceNumbers [i ] = randomLongBetween (SequenceNumbers .NO_OPS_PERFORMED , Long .MAX_VALUE );
222
+ replicationTracker .addRetentionLease (
223
+ Integer .toString (i ), minimumRetainingSequenceNumbers [i ], "test-" + i , ActionListener .wrap (() -> {}));
224
+ }
225
+
226
+ for (int i = 0 ; i < length ; i ++) {
227
+ if (rarely () && primaryTerm < Long .MAX_VALUE ) {
228
+ primaryTerm = randomLongBetween (primaryTerm + 1 , Long .MAX_VALUE );
229
+ replicationTracker .setOperationPrimaryTerm (primaryTerm );
230
+ }
231
+ /*
232
+ * Remove from the end since it will make the following assertion easier; we want to ensure that only the intended lease was
233
+ * removed.
234
+ */
235
+ replicationTracker .removeRetentionLease (Integer .toString (length - i - 1 ), ActionListener .wrap (() -> {}));
236
+ assertRetentionLeases (
237
+ replicationTracker ,
238
+ length - i - 1 ,
239
+ minimumRetainingSequenceNumbers ,
240
+ primaryTerm ,
241
+ 1 + length + i ,
242
+ true ,
243
+ false );
244
+ }
245
+ }
246
+
247
+ public void testRemoveRetentionLeaseCausesRetentionLeaseSync () {
248
+ final AllocationId allocationId = AllocationId .newInitializing ();
249
+ final Map <String , Long > retainingSequenceNumbers = new HashMap <>();
250
+ final AtomicBoolean invoked = new AtomicBoolean ();
251
+ final AtomicReference <ReplicationTracker > reference = new AtomicReference <>();
252
+ final ReplicationTracker replicationTracker = new ReplicationTracker (
253
+ new ShardId ("test" , "_na" , 0 ),
254
+ allocationId .getId (),
255
+ IndexSettingsModule .newIndexSettings ("test" , Settings .EMPTY ),
256
+ randomNonNegativeLong (),
257
+ UNASSIGNED_SEQ_NO ,
258
+ value -> {},
259
+ () -> 0L ,
260
+ (leases , listener ) -> {
261
+ // we do not want to hold a lock on the replication tracker in the callback!
262
+ assertFalse (Thread .holdsLock (reference .get ()));
263
+ invoked .set (true );
264
+ assertThat (
265
+ leases .leases ()
266
+ .stream ()
267
+ .collect (Collectors .toMap (RetentionLease ::id , RetentionLease ::retainingSequenceNumber )),
268
+ equalTo (retainingSequenceNumbers ));
269
+ });
270
+ reference .set (replicationTracker );
271
+ replicationTracker .updateFromMaster (
272
+ randomNonNegativeLong (),
273
+ Collections .singleton (allocationId .getId ()),
274
+ routingTable (Collections .emptySet (), allocationId ),
275
+ Collections .emptySet ());
276
+ replicationTracker .activatePrimaryMode (SequenceNumbers .NO_OPS_PERFORMED );
277
+
278
+ final int length = randomIntBetween (0 , 8 );
279
+ for (int i = 0 ; i < length ; i ++) {
280
+ final String id = randomAlphaOfLength (8 );
281
+ final long retainingSequenceNumber = randomLongBetween (SequenceNumbers .NO_OPS_PERFORMED , Long .MAX_VALUE );
282
+ retainingSequenceNumbers .put (id , retainingSequenceNumber );
283
+ replicationTracker .addRetentionLease (id , retainingSequenceNumber , "test" , ActionListener .wrap (() -> {}));
284
+ // assert that the new retention lease callback was invoked
285
+ assertTrue (invoked .get ());
286
+
287
+ // reset the invocation marker so that we can assert the callback was not invoked when removing the lease
288
+ invoked .set (false );
289
+ retainingSequenceNumbers .remove (id );
290
+ replicationTracker .removeRetentionLease (id , ActionListener .wrap (() -> {}));
291
+ assertTrue (invoked .get ());
292
+ }
293
+ }
294
+
196
295
public void testExpirationOnPrimary () {
197
296
runExpirationTest (true );
198
297
}
0 commit comments