11
11
import org .elasticsearch .cluster .ClusterState ;
12
12
import org .elasticsearch .cluster .metadata .IndexMetaData ;
13
13
import org .elasticsearch .cluster .metadata .MetaData ;
14
+ import org .elasticsearch .cluster .routing .IndexRoutingTable ;
15
+ import org .elasticsearch .cluster .routing .RoutingTable ;
16
+ import org .elasticsearch .cluster .routing .ShardRouting ;
17
+ import org .elasticsearch .cluster .routing .ShardRoutingState ;
18
+ import org .elasticsearch .cluster .routing .TestShardRouting ;
14
19
import org .elasticsearch .cluster .service .ClusterService ;
15
20
import org .elasticsearch .common .collect .Tuple ;
16
21
import org .elasticsearch .common .settings .Settings ;
@@ -49,12 +54,7 @@ public void testAutoFollower() {
49
54
Client client = mock (Client .class );
50
55
when (client .getRemoteClusterClient (anyString ())).thenReturn (client );
51
56
52
- ClusterState leaderState = ClusterState .builder (new ClusterName ("remote" ))
53
- .metaData (MetaData .builder ().put (IndexMetaData .builder ("logs-20190101" )
54
- .settings (settings (Version .CURRENT ).put (IndexSettings .INDEX_SOFT_DELETES_SETTING .getKey (), true ))
55
- .numberOfShards (1 )
56
- .numberOfReplicas (0 )))
57
- .build ();
57
+ ClusterState leaderState = createRemoteClusterState ("logs-20190101" );
58
58
59
59
AutoFollowPattern autoFollowPattern = new AutoFollowPattern ("remote" , Collections .singletonList ("logs-*" ),
60
60
null , null , null , null , null , null , null , null , null , null , null );
@@ -168,13 +168,7 @@ void updateAutoFollowMetadata(Function<ClusterState, ClusterState> updateFunctio
168
168
public void testAutoFollowerUpdateClusterStateFailure () {
169
169
Client client = mock (Client .class );
170
170
when (client .getRemoteClusterClient (anyString ())).thenReturn (client );
171
-
172
- ClusterState leaderState = ClusterState .builder (new ClusterName ("remote" ))
173
- .metaData (MetaData .builder ().put (IndexMetaData .builder ("logs-20190101" )
174
- .settings (settings (Version .CURRENT ).put (IndexSettings .INDEX_SOFT_DELETES_SETTING .getKey (), true ))
175
- .numberOfShards (1 )
176
- .numberOfReplicas (0 )))
177
- .build ();
171
+ ClusterState leaderState = createRemoteClusterState ("logs-20190101" );
178
172
179
173
AutoFollowPattern autoFollowPattern = new AutoFollowPattern ("remote" , Collections .singletonList ("logs-*" ),
180
174
null , null , null , null , null , null , null , null , null , null , null );
@@ -230,13 +224,7 @@ void updateAutoFollowMetadata(Function<ClusterState, ClusterState> updateFunctio
230
224
public void testAutoFollowerCreateAndFollowApiCallFailure () {
231
225
Client client = mock (Client .class );
232
226
when (client .getRemoteClusterClient (anyString ())).thenReturn (client );
233
-
234
- ClusterState leaderState = ClusterState .builder (new ClusterName ("remote" ))
235
- .metaData (MetaData .builder ().put (IndexMetaData .builder ("logs-20190101" )
236
- .settings (settings (Version .CURRENT ).put (IndexSettings .INDEX_SOFT_DELETES_SETTING .getKey (), true ))
237
- .numberOfShards (1 )
238
- .numberOfReplicas (0 )))
239
- .build ();
227
+ ClusterState leaderState = createRemoteClusterState ("logs-20190101" );
240
228
241
229
AutoFollowPattern autoFollowPattern = new AutoFollowPattern ("remote" , Collections .singletonList ("logs-*" ),
242
230
null , null , null , null , null , null , null , null , null , null , null );
@@ -299,24 +287,39 @@ public void testGetLeaderIndicesToFollow() {
299
287
new AutoFollowMetadata (Collections .singletonMap ("remote" , autoFollowPattern ), Collections .emptyMap (), headers )))
300
288
.build ();
301
289
290
+ RoutingTable .Builder routingTableBuilder = RoutingTable .builder ();
302
291
MetaData .Builder imdBuilder = MetaData .builder ();
303
292
for (int i = 0 ; i < 5 ; i ++) {
293
+ String indexName = "metrics-" + i ;
304
294
Settings .Builder builder = Settings .builder ()
305
295
.put (IndexMetaData .SETTING_VERSION_CREATED , Version .CURRENT )
306
- .put (IndexMetaData .SETTING_INDEX_UUID , "metrics-" + i )
296
+ .put (IndexMetaData .SETTING_INDEX_UUID , indexName )
307
297
.put (IndexSettings .INDEX_SOFT_DELETES_SETTING .getKey (), i % 2 == 0 );
308
298
imdBuilder .put (IndexMetaData .builder ("metrics-" + i )
309
299
.settings (builder )
310
300
.numberOfShards (1 )
311
301
.numberOfReplicas (0 ));
302
+
303
+ ShardRouting shardRouting =
304
+ TestShardRouting .newShardRouting (indexName , 0 , "1" , true , ShardRoutingState .INITIALIZING ).moveToStarted ();
305
+ IndexRoutingTable indexRoutingTable = IndexRoutingTable .builder (imdBuilder .get (indexName ).getIndex ())
306
+ .addShard (shardRouting )
307
+ .build ();
308
+ routingTableBuilder .add (indexRoutingTable );
312
309
}
310
+
313
311
imdBuilder .put (IndexMetaData .builder ("logs-0" )
314
312
.settings (settings (Version .CURRENT ))
315
313
.numberOfShards (1 )
316
314
.numberOfReplicas (0 ));
315
+ ShardRouting shardRouting =
316
+ TestShardRouting .newShardRouting ("logs-0" , 0 , "1" , true , ShardRoutingState .INITIALIZING ).moveToStarted ();
317
+ IndexRoutingTable indexRoutingTable = IndexRoutingTable .builder (imdBuilder .get ("logs-0" ).getIndex ()).addShard (shardRouting ).build ();
318
+ routingTableBuilder .add (indexRoutingTable );
317
319
318
320
ClusterState leaderState = ClusterState .builder (new ClusterName ("remote" ))
319
321
.metaData (imdBuilder )
322
+ .routingTable (routingTableBuilder .build ())
320
323
.build ();
321
324
322
325
List <Index > result = AutoFollower .getLeaderIndicesToFollow ("remote" , autoFollowPattern , leaderState , followerState ,
@@ -335,6 +338,52 @@ public void testGetLeaderIndicesToFollow() {
335
338
assertThat (result .get (1 ).getName (), equalTo ("metrics-4" ));
336
339
}
337
340
341
+ public void testGetLeaderIndicesToFollow_shardsNotStarted () {
342
+ AutoFollowPattern autoFollowPattern = new AutoFollowPattern ("remote" , Collections .singletonList ("*" ),
343
+ null , null , null , null , null , null , null , null , null , null , null );
344
+ Map <String , Map <String , String >> headers = new HashMap <>();
345
+ ClusterState followerState = ClusterState .builder (new ClusterName ("remote" ))
346
+ .metaData (MetaData .builder ().putCustom (AutoFollowMetadata .TYPE ,
347
+ new AutoFollowMetadata (Collections .singletonMap ("remote" , autoFollowPattern ), Collections .emptyMap (), headers )))
348
+ .build ();
349
+
350
+ // 1 shard started and another not started:
351
+ ClusterState leaderState = createRemoteClusterState ("index1" );
352
+ MetaData .Builder mBuilder = MetaData .builder (leaderState .metaData ());
353
+ mBuilder .put (IndexMetaData .builder ("index2" )
354
+ .settings (settings (Version .CURRENT ).put (IndexSettings .INDEX_SOFT_DELETES_SETTING .getKey (), true ))
355
+ .numberOfShards (1 )
356
+ .numberOfReplicas (0 ));
357
+ ShardRouting shardRouting =
358
+ TestShardRouting .newShardRouting ("index2" , 0 , "1" , true , ShardRoutingState .INITIALIZING );
359
+ IndexRoutingTable indexRoutingTable = IndexRoutingTable .builder (mBuilder .get ("index2" ).getIndex ()
360
+ ).addShard (shardRouting ).build ();
361
+ leaderState = ClusterState .builder (leaderState .getClusterName ())
362
+ .metaData (mBuilder )
363
+ .routingTable (RoutingTable .builder (leaderState .routingTable ()).add (indexRoutingTable ).build ())
364
+ .build ();
365
+
366
+ List <Index > result = AutoFollower .getLeaderIndicesToFollow ("remote" , autoFollowPattern , leaderState , followerState ,
367
+ Collections .emptyList ());
368
+ assertThat (result .size (), equalTo (1 ));
369
+ assertThat (result .get (0 ).getName (), equalTo ("index1" ));
370
+
371
+ // Start second shard:
372
+ shardRouting = shardRouting .moveToStarted ();
373
+ indexRoutingTable = IndexRoutingTable .builder (leaderState .metaData ().indices ().get ("index2" ).getIndex ())
374
+ .addShard (shardRouting ).build ();
375
+ leaderState = ClusterState .builder (leaderState .getClusterName ())
376
+ .metaData (leaderState .metaData ())
377
+ .routingTable (RoutingTable .builder (leaderState .routingTable ()).add (indexRoutingTable ).build ())
378
+ .build ();
379
+
380
+ result = AutoFollower .getLeaderIndicesToFollow ("remote" , autoFollowPattern , leaderState , followerState , Collections .emptyList ());
381
+ assertThat (result .size (), equalTo (2 ));
382
+ result .sort (Comparator .comparing (Index ::getName ));
383
+ assertThat (result .get (0 ).getName (), equalTo ("index1" ));
384
+ assertThat (result .get (1 ).getName (), equalTo ("index2" ));
385
+ }
386
+
338
387
public void testGetFollowerIndexName () {
339
388
AutoFollowPattern autoFollowPattern = new AutoFollowPattern ("remote" , Collections .singletonList ("metrics-*" ), null , null ,
340
389
null , null , null , null , null , null , null , null , null );
@@ -408,4 +457,21 @@ public void testStats() {
408
457
assertThat (autoFollowStats .getRecentAutoFollowErrors ().get ("_alias2:index2" ).getCause ().getMessage (), equalTo ("error" ));
409
458
}
410
459
460
+ private static ClusterState createRemoteClusterState (String indexName ) {
461
+ IndexMetaData indexMetaData = IndexMetaData .builder (indexName )
462
+ .settings (settings (Version .CURRENT ).put (IndexSettings .INDEX_SOFT_DELETES_SETTING .getKey (), true ))
463
+ .numberOfShards (1 )
464
+ .numberOfReplicas (0 )
465
+ .build ();
466
+ ClusterState .Builder csBuilder = ClusterState .builder (new ClusterName ("remote" ))
467
+ .metaData (MetaData .builder ().put (indexMetaData , true ));
468
+
469
+ ShardRouting shardRouting =
470
+ TestShardRouting .newShardRouting (indexName , 0 , "1" , true , ShardRoutingState .INITIALIZING ).moveToStarted ();
471
+ IndexRoutingTable indexRoutingTable = IndexRoutingTable .builder (indexMetaData .getIndex ()).addShard (shardRouting ).build ();
472
+ csBuilder .routingTable (RoutingTable .builder ().add (indexRoutingTable ).build ()).build ();
473
+
474
+ return csBuilder .build ();
475
+ }
476
+
411
477
}
0 commit comments