@@ -1409,6 +1409,76 @@ public void testSkipDiskThresholdMonitorWhenStateNotRecovered() {
14091409 assertNull (result2 .v2 ());
14101410 }
14111411
1412+ private void doTestSkipNodesNotInRoutingTable (boolean sourceNodeInTable , boolean targetNodeInTable ) {
1413+ final var projectId = randomProjectIdOrDefault ();
1414+ final Metadata .Builder metadataBuilder = Metadata .builder ()
1415+ .put (
1416+ ProjectMetadata .builder (projectId )
1417+ .put (IndexMetadata .builder ("test" ).settings (settings (IndexVersion .current ())).numberOfShards (1 ).numberOfReplicas (1 ))
1418+ .build ()
1419+ );
1420+
1421+ metadataBuilder .putCustom (
1422+ NodesShutdownMetadata .TYPE ,
1423+ new NodesShutdownMetadata (
1424+ Collections .singletonMap (
1425+ "node1" ,
1426+ SingleNodeShutdownMetadata .builder ()
1427+ .setNodeId ("node1" )
1428+ .setNodeEphemeralId ("node1" )
1429+ .setReason ("testing" )
1430+ .setType (SingleNodeShutdownMetadata .Type .REPLACE )
1431+ .setTargetNodeName ("node3" )
1432+ .setStartedAtMillis (randomNonNegativeLong ())
1433+ .build ()
1434+ )
1435+ )
1436+ );
1437+
1438+ final Metadata metadata = metadataBuilder .build ();
1439+ final RoutingTable routingTable = RoutingTable .builder (TestShardRoutingRoleStrategies .DEFAULT_ROLE_ONLY )
1440+ .addAsNew (metadata .getProject (projectId ).index ("test" ))
1441+ .build ();
1442+ DiscoveryNodes .Builder discoveryNodes = DiscoveryNodes .builder ().add (newNormalNode ("node2" , "node2" ));
1443+ // node1 which is replaced by node3 may or may not be in the cluster
1444+ if (sourceNodeInTable ) {
1445+ discoveryNodes .add (newNormalNode ("node1" , "node1" ));
1446+ }
1447+ // node3 which is to replace node1 may or may not be in the cluster
1448+ if (targetNodeInTable ) {
1449+ discoveryNodes .add (newNormalNode ("node3" , "node3" ));
1450+ }
1451+ final ClusterState clusterState = applyStartedShardsUntilNoChange (
1452+ ClusterState .builder (ClusterName .DEFAULT )
1453+ .metadata (metadata )
1454+ .routingTable (GlobalRoutingTable .builder ().put (projectId , routingTable ).build ())
1455+ .nodes (discoveryNodes )
1456+ .build (),
1457+ createAllocationService (Settings .EMPTY )
1458+ );
1459+ final Index testIndex = routingTable .index ("test" ).getIndex ();
1460+
1461+ Map <String , DiskUsage > diskUsages = new HashMap <>();
1462+ diskUsages .put ("node1" , new DiskUsage ("node1" , "node1" , "/foo/bar" , 100 , between (0 , 4 )));
1463+ diskUsages .put ("node2" , new DiskUsage ("node2" , "node2" , "/foo/bar" , 100 , between (0 , 4 )));
1464+ final ClusterInfo clusterInfo = clusterInfo (diskUsages );
1465+ Tuple <Boolean , Set <Index >> result = runDiskThresholdMonitor (clusterState , clusterInfo );
1466+ assertTrue (result .v1 ()); // reroute on new nodes
1467+ assertThat (result .v2 (), contains (testIndex ));
1468+ }
1469+
1470+ public void testSkipReplaceSourceNodeNotInRoutingTable () {
1471+ doTestSkipNodesNotInRoutingTable (false , true );
1472+ }
1473+
1474+ public void testSkipReplaceTargetNodeNotInRoutingTable () {
1475+ doTestSkipNodesNotInRoutingTable (true , false );
1476+ }
1477+
1478+ public void testSkipReplaceSourceAndTargetNodesNotInRoutingTable () {
1479+ doTestSkipNodesNotInRoutingTable (false , false );
1480+ }
1481+
14121482 // Runs a disk threshold monitor with a given cluster state and cluster info and returns whether a reroute should
14131483 // happen and any indices that should be marked as read-only.
14141484 private Tuple <Boolean , Set <Index >> runDiskThresholdMonitor (ClusterState clusterState , ClusterInfo clusterInfo ) {
0 commit comments