@@ -1409,6 +1409,79 @@ 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 ()
1443+ // .add(newNormalNode("node1", "node1"))
1444+ .add (newNormalNode ("node2" , "node2" ));
1445+ // node1 which is replaced by node1 may or may not be in the cluster
1446+ if (sourceNodeInTable ) {
1447+ discoveryNodes .add (newNormalNode ("node1" , "node1" ));
1448+ }
1449+ // node3 which is to replace node1 may or may not be in the cluster
1450+ if (targetNodeInTable ) {
1451+ discoveryNodes .add (newNormalNode ("node3" , "node3" ));
1452+ }
1453+ final ClusterState clusterState = applyStartedShardsUntilNoChange (
1454+ ClusterState .builder (ClusterName .DEFAULT )
1455+ .metadata (metadata )
1456+ .routingTable (GlobalRoutingTable .builder ().put (projectId , routingTable ).build ())
1457+ .nodes (discoveryNodes )
1458+ .build (),
1459+ createAllocationService (Settings .EMPTY )
1460+ );
1461+ final Index testIndex = routingTable .index ("test" ).getIndex ();
1462+
1463+ Map <String , DiskUsage > diskUsages = new HashMap <>();
1464+ diskUsages .put ("node1" , new DiskUsage ("node1" , "node1" , "/foo/bar" , 100 , between (0 , 4 )));
1465+ diskUsages .put ("node2" , new DiskUsage ("node2" , "node2" , "/foo/bar" , 100 , between (0 , 4 )));
1466+ final ClusterInfo clusterInfo = clusterInfo (diskUsages );
1467+ Tuple <Boolean , Set <Index >> result = runDiskThresholdMonitor (clusterState , clusterInfo );
1468+ assertTrue (result .v1 ()); // reroute on new nodes
1469+ assertThat (result .v2 (), contains (testIndex ));
1470+ }
1471+
1472+ public void testSkipReplaceSourceNodeNotInRoutingTable () {
1473+ doTestSkipNodesNotInRoutingTable (false , true );
1474+ ;
1475+ }
1476+
1477+ public void testSkipReplaceTargetNodeNotInRoutingTable () {
1478+ doTestSkipNodesNotInRoutingTable (true , false );
1479+ }
1480+
1481+ public void testSkipReplaceSourceAndTargetNodesNotInRoutingTable () {
1482+ doTestSkipNodesNotInRoutingTable (false , false );
1483+ }
1484+
14121485 // Runs a disk threshold monitor with a given cluster state and cluster info and returns whether a reroute should
14131486 // happen and any indices that should be marked as read-only.
14141487 private Tuple <Boolean , Set <Index >> runDiskThresholdMonitor (ClusterState clusterState , ClusterInfo clusterInfo ) {
0 commit comments