8484import  java .util .concurrent .TimeUnit ;
8585import  java .util .concurrent .atomic .AtomicBoolean ;
8686import  java .util .concurrent .atomic .AtomicReference ;
87+ import  java .util .function .Consumer ;
8788import  java .util .function .Function ;
8889import  java .util .function .LongSupplier ;
8990import  java .util .function .Supplier ;
@@ -1202,6 +1203,51 @@ ClusterState readClusterStateInParallel(
12021203        Map <String , UploadedMetadataAttribute > clusterStateCustomToRead ,
12031204        boolean  readIndexRoutingTableDiff ,
12041205        boolean  includeEphemeral 
1206+     ) {
1207+         return  readClusterStateInParallel (
1208+             previousState ,
1209+             manifest ,
1210+             clusterUUID ,
1211+             localNodeId ,
1212+             indicesToRead ,
1213+             customToRead ,
1214+             readCoordinationMetadata ,
1215+             readSettingsMetadata ,
1216+             readTransientSettingsMetadata ,
1217+             readTemplatesMetadata ,
1218+             readDiscoveryNodes ,
1219+             readClusterBlocks ,
1220+             indicesRoutingToRead ,
1221+             readHashesOfConsistentSettings ,
1222+             clusterStateCustomToRead ,
1223+             readIndexRoutingTableDiff ,
1224+             includeEphemeral ,
1225+             (metadataBuilder ) -> {},
1226+             (routingTable ) -> {}
1227+         );
1228+     }
1229+ 
1230+     // package private for testing 
1231+     ClusterState  readClusterStateInParallel (
1232+         ClusterState  previousState ,
1233+         ClusterMetadataManifest  manifest ,
1234+         String  clusterUUID ,
1235+         String  localNodeId ,
1236+         List <UploadedIndexMetadata > indicesToRead ,
1237+         Map <String , UploadedMetadataAttribute > customToRead ,
1238+         boolean  readCoordinationMetadata ,
1239+         boolean  readSettingsMetadata ,
1240+         boolean  readTransientSettingsMetadata ,
1241+         boolean  readTemplatesMetadata ,
1242+         boolean  readDiscoveryNodes ,
1243+         boolean  readClusterBlocks ,
1244+         List <UploadedIndexMetadata > indicesRoutingToRead ,
1245+         boolean  readHashesOfConsistentSettings ,
1246+         Map <String , UploadedMetadataAttribute > clusterStateCustomToRead ,
1247+         boolean  readIndexRoutingTableDiff ,
1248+         boolean  includeEphemeral ,
1249+         Consumer <Metadata .Builder > metadataTransformer ,
1250+         Consumer <RoutingTable > routingTableTransformer 
12051251    ) {
12061252        int  totalReadTasks  = indicesToRead .size () + customToRead .size () + (readCoordinationMetadata  ? 1  : 0 ) + (readSettingsMetadata 
12071253            ? 1 
@@ -1467,12 +1513,11 @@ ClusterState readClusterStateInParallel(
14671513        });
14681514
14691515        metadataBuilder .indices (indexMetadataMap );
1516+         metadataTransformer .accept (metadataBuilder );
14701517        if  (readDiscoveryNodes ) {
14711518            clusterStateBuilder .nodes (discoveryNodesBuilder .get ().localNodeId (localNodeId ));
14721519        }
14731520
1474-         clusterStateBuilder .metadata (metadataBuilder ).version (manifest .getStateVersion ()).stateUUID (manifest .getStateUUID ());
1475- 
14761521        readIndexRoutingTableResults .forEach (
14771522            indexRoutingTable  -> indicesRouting .put (indexRoutingTable .getIndex ().getName (), indexRoutingTable )
14781523        );
@@ -1481,8 +1526,12 @@ ClusterState readClusterStateInParallel(
14811526        if  (routingTableDiff  != null ) {
14821527            newRoutingTable  = routingTableDiff .apply (previousState .getRoutingTable ());
14831528        }
1484-         clusterStateBuilder . routingTable (newRoutingTable );
1529+         routingTableTransformer . accept (newRoutingTable );
14851530
1531+         clusterStateBuilder .metadata (metadataBuilder )
1532+             .routingTable (newRoutingTable )
1533+             .version (manifest .getStateVersion ())
1534+             .stateUUID (manifest .getStateUUID ());
14861535        return  clusterStateBuilder .build ();
14871536    }
14881537
@@ -1638,41 +1687,40 @@ public ClusterState getClusterStateUsingDiff(ClusterMetadataManifest manifest, C
16381687                manifest .getDiffManifest () != null 
16391688                    && manifest .getDiffManifest ().getIndicesRoutingDiffPath () != null 
16401689                    && !manifest .getDiffManifest ().getIndicesRoutingDiffPath ().isEmpty (),
1641-                 includeEphemeral 
1690+                 includeEphemeral ,
1691+                 (metadataBuilder ) -> {
1692+                     // remove the deleted indices from the metadata 
1693+                     for  (String  index  : diff .getIndicesDeleted ()) {
1694+                         metadataBuilder .remove (index );
1695+                     }
1696+                     // remove the deleted metadata customs from the metadata 
1697+                     if  (diff .getCustomMetadataDeleted () != null ) {
1698+                         for  (String  customType  : diff .getCustomMetadataDeleted ()) {
1699+                             metadataBuilder .removeCustom (customType );
1700+                         }
1701+                     }
1702+                 },
1703+                 (routingTable ) -> {
1704+                     Map <String , IndexRoutingTable > indexRoutingTables  = routingTable .getIndicesRouting ();
1705+                     if  (manifest .getCodecVersion () == CODEC_V2  || manifest .getCodecVersion () == CODEC_V3 ) {
1706+                         for  (String  indexName  : diff .getIndicesRoutingDeleted ()) {
1707+                             indexRoutingTables .remove (indexName );
1708+                         }
1709+                     }
1710+                 }
16421711            );
16431712            ClusterState .Builder  clusterStateBuilder  = ClusterState .builder (updatedClusterState );
1644-             Metadata .Builder  metadataBuilder  = Metadata .builder (updatedClusterState .metadata ());
1645-             // remove the deleted indices from the metadata 
1646-             for  (String  index  : diff .getIndicesDeleted ()) {
1647-                 metadataBuilder .remove (index );
1648-             }
1649-             // remove the deleted metadata customs from the metadata 
1650-             if  (diff .getCustomMetadataDeleted () != null ) {
1651-                 for  (String  customType  : diff .getCustomMetadataDeleted ()) {
1652-                     metadataBuilder .removeCustom (customType );
1653-                 }
1654-             }
1655- 
16561713            // remove the deleted cluster state customs from the metadata 
16571714            if  (diff .getClusterStateCustomDeleted () != null ) {
16581715                for  (String  customType  : diff .getClusterStateCustomDeleted ()) {
16591716                    clusterStateBuilder .removeCustom (customType );
16601717                }
16611718            }
16621719
1663-             HashMap <String , IndexRoutingTable > indexRoutingTables  = new  HashMap <>(
1664-                 updatedClusterState .getRoutingTable ().getIndicesRouting ()
1665-             );
1666-             if  (manifest .getCodecVersion () == CODEC_V2  || manifest .getCodecVersion () == CODEC_V3 ) {
1667-                 for  (String  indexName  : diff .getIndicesRoutingDeleted ()) {
1668-                     indexRoutingTables .remove (indexName );
1669-                 }
1670-             }
1671- 
16721720            ClusterState  clusterState  = clusterStateBuilder .stateUUID (manifest .getStateUUID ())
16731721                .version (manifest .getStateVersion ())
1674-                 .metadata (metadataBuilder )
1675-                 .routingTable (new   RoutingTable ( manifest . getRoutingTableVersion (),  indexRoutingTables ))
1722+                 .metadata (updatedClusterState . metadata () )
1723+                 .routingTable (updatedClusterState . routingTable ( ))
16761724                .build ();
16771725            if  (!remoteClusterStateValidationMode .equals (RemoteClusterStateValidationMode .NONE )
16781726                && manifest .getClusterStateChecksum () != null ) {
0 commit comments