@@ -41,6 +41,7 @@ public class RemoteDualReplicationIT extends MigrationBaseTestCase {
41
41
private final String REMOTE_PRI_DOCREP_REP = "remote-primary-docrep-replica" ;
42
42
private final String REMOTE_PRI_DOCREP_REMOTE_REP = "remote-primary-docrep-remote-replica" ;
43
43
private final String FAILOVER_REMOTE_TO_DOCREP = "failover-remote-to-docrep" ;
44
+ private final String FAILOVER_REMOTE_TO_REMOTE = "failover-remote-to-remote" ;
44
45
45
46
@ Override
46
47
protected Collection <Class <? extends Plugin >> nodePlugins () {
@@ -241,14 +242,63 @@ RLs on remote enabled copies are brought up to (GlobalCkp + 1) upon a flush requ
241
242
*/
242
243
extraSettings = Settings .builder ().put (IndexingMemoryController .SHARD_INACTIVE_TIME_SETTING .getKey (), "3s" ).build ();
243
244
testRemotePrimaryDocRepAndRemoteReplica ();
244
- DiscoveryNodes nodes = internalCluster ().client ().admin ().cluster ().prepareState ().get ().getState ().getNodes ();
245
- assertBusy (() -> {
246
- for (ShardStats shardStats : internalCluster ().client ()
245
+ pollAndCheckRetentionLeases (REMOTE_PRI_DOCREP_REMOTE_REP );
246
+ }
247
+
248
+ public void testMissingRetentionLeaseCreatedOnFailedOverRemoteReplica () throws Exception {
249
+ internalCluster ().startClusterManagerOnlyNode ();
250
+
251
+ logger .info ("---> Starting docrep data node" );
252
+ internalCluster ().startDataOnlyNode ();
253
+
254
+ Settings zeroReplicasAndOverridenSyncIntervals = Settings .builder ()
255
+ .put (IndexMetadata .SETTING_NUMBER_OF_REPLICAS , 0 )
256
+ .put (IndexService .GLOBAL_CHECKPOINT_SYNC_INTERVAL_SETTING .getKey (), "100ms" )
257
+ .put (IndexService .RETENTION_LEASE_SYNC_INTERVAL_SETTING .getKey (), "100ms" )
258
+ .build ();
259
+ createIndex (FAILOVER_REMOTE_TO_REMOTE , zeroReplicasAndOverridenSyncIntervals );
260
+ ensureGreen (FAILOVER_REMOTE_TO_REMOTE );
261
+
262
+ indexBulk (FAILOVER_REMOTE_TO_REMOTE , 100 );
263
+
264
+ logger .info ("---> Starting first remote node" );
265
+ initDocRepToRemoteMigration ();
266
+ addRemote = true ;
267
+ String firstRemoteNode = internalCluster ().startDataOnlyNode ();
268
+ String primaryShardHostingNode = primaryNodeName (FAILOVER_REMOTE_TO_REMOTE );
269
+ logger .info ("---> Moving primary copy from {} to remote enabled node {}" , primaryShardHostingNode , firstRemoteNode );
270
+ assertAcked (
271
+ internalCluster ().client ()
272
+ .admin ()
273
+ .cluster ()
274
+ .prepareReroute ()
275
+ .add (new MoveAllocationCommand (FAILOVER_REMOTE_TO_REMOTE , 0 , primaryShardHostingNode , firstRemoteNode ))
276
+ .get ()
277
+ );
278
+ ensureGreen (FAILOVER_REMOTE_TO_REMOTE );
279
+ assertReplicaAndPrimaryConsistency (FAILOVER_REMOTE_TO_REMOTE , 100 , 0 );
280
+
281
+ String secondRemoteNode = internalCluster ().startDataOnlyNode ();
282
+ Settings twoReplicas = Settings .builder ().put (IndexMetadata .SETTING_NUMBER_OF_REPLICAS , 2 ).build ();
283
+ assertAcked (
284
+ internalCluster ().client ()
247
285
.admin ()
248
286
.indices ()
249
- .prepareStats (REMOTE_PRI_DOCREP_REMOTE_REP )
287
+ .prepareUpdateSettings ()
288
+ .setIndices (FAILOVER_REMOTE_TO_REMOTE )
289
+ .setSettings (twoReplicas )
250
290
.get ()
251
- .getShards ()) {
291
+ );
292
+ ensureGreen (FAILOVER_REMOTE_TO_REMOTE );
293
+
294
+ logger .info ("---> Checking retention leases" );
295
+ pollAndCheckRetentionLeases (FAILOVER_REMOTE_TO_REMOTE );
296
+ }
297
+
298
+ private void pollAndCheckRetentionLeases (String indexName ) throws Exception {
299
+ DiscoveryNodes nodes = internalCluster ().client ().admin ().cluster ().prepareState ().get ().getState ().getNodes ();
300
+ assertBusy (() -> {
301
+ for (ShardStats shardStats : internalCluster ().client ().admin ().indices ().prepareStats (indexName ).get ().getShards ()) {
252
302
ShardRouting shardRouting = shardStats .getShardRouting ();
253
303
DiscoveryNode discoveryNode = nodes .get (shardRouting .currentNodeId ());
254
304
RetentionLeases retentionLeases = shardStats .getRetentionLeaseStats ().retentionLeases ();
0 commit comments