From 12dc0282e23b88437f2331f092b821fd6876142c Mon Sep 17 00:00:00 2001 From: Niels Bauman Date: Mon, 2 Jun 2025 16:42:55 +0200 Subject: [PATCH 1/3] Remove non-test usages of `Metadata.Builder#putCustom` This removes all non-test usages of ``` Metadata.Builder.putCustom(String type, ProjectCustom custom) ``` And replaces it with appropriate calls to the equivalent method on `ProjectMetadata.Builder`. In most cases this _does not_ make the code project aware, but does reduce the number of deprecated methods in use. --- ...portDeleteDatabaseConfigurationAction.java | 12 ++++----- ...ansportPutDatabaseConfigurationAction.java | 12 ++++----- .../cluster/metadata/Metadata.java | 1 + .../blobstore/BlobStoreRepository.java | 26 +++++++++---------- .../elasticsearch/script/ScriptService.java | 17 ++++++------ .../snapshots/RestoreService.java | 8 +++--- .../snapshots/SnapshotsService.java | 13 ++++++---- .../blobstore/BlobStoreTestUtil.java | 17 +++++++++--- .../ccr/action/AutoFollowCoordinator.java | 20 +++++++------- ...nsportActivateAutoFollowPatternAction.java | 8 +++--- .../TransportPutAutoFollowPatternAction.java | 8 +++--- .../core/ilm/OperationModeUpdateTask.java | 24 +++++------------ .../task/MigrationResultsUpdateTask.java | 8 +++--- .../TransportDeleteTrainedModelAction.java | 8 ++---- ...ransportDeleteTrainedModelAliasAction.java | 8 +++--- .../TransportPutTrainedModelAliasAction.java | 6 ++--- .../action/TransportSetUpgradeModeAction.java | 7 +++-- .../TrainedModelAssignmentClusterService.java | 12 ++++----- .../TrainedModelCacheMetadataService.java | 9 ++++--- .../xpack/slm/SnapshotLifecycleTask.java | 20 ++++++-------- .../slm/UpdateSnapshotLifecycleStatsTask.java | 7 +++-- ...ransportDeleteSnapshotLifecycleAction.java | 23 ++++++---------- .../TransportPutSnapshotLifecycleAction.java | 17 +++--------- ...ransportSetTransformUpgradeModeAction.java | 6 +++-- .../TransportWatcherServiceAction.java | 8 +++--- 25 files changed, 140 insertions(+), 165 deletions(-) diff --git a/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/direct/TransportDeleteDatabaseConfigurationAction.java b/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/direct/TransportDeleteDatabaseConfigurationAction.java index 078aa142bba5a..5b1be42b1dcfa 100644 --- a/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/direct/TransportDeleteDatabaseConfigurationAction.java +++ b/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/direct/TransportDeleteDatabaseConfigurationAction.java @@ -21,7 +21,7 @@ import org.elasticsearch.cluster.SimpleBatchedExecutor; import org.elasticsearch.cluster.block.ClusterBlockException; import org.elasticsearch.cluster.block.ClusterBlockLevel; -import org.elasticsearch.cluster.metadata.Metadata; +import org.elasticsearch.cluster.metadata.ProjectMetadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.cluster.service.MasterServiceTaskQueue; import org.elasticsearch.common.Priority; @@ -103,17 +103,17 @@ private record DeleteDatabaseConfigurationTask(ActionListener databases = new HashMap<>(geoIpMeta.getDatabases()); databases.remove(databaseId); - Metadata currentMeta = currentState.metadata(); return ClusterState.builder(currentState) - .metadata(Metadata.builder(currentMeta).putCustom(IngestGeoIpMetadata.TYPE, new IngestGeoIpMetadata(databases))) + .putProjectMetadata( + ProjectMetadata.builder(project).putCustom(IngestGeoIpMetadata.TYPE, new IngestGeoIpMetadata(databases)) + ) .build(); } diff --git a/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/direct/TransportPutDatabaseConfigurationAction.java b/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/direct/TransportPutDatabaseConfigurationAction.java index 3096a60da1e18..2c090a6bf578d 100644 --- a/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/direct/TransportPutDatabaseConfigurationAction.java +++ b/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/direct/TransportPutDatabaseConfigurationAction.java @@ -20,7 +20,7 @@ import org.elasticsearch.cluster.SimpleBatchedExecutor; import org.elasticsearch.cluster.block.ClusterBlockException; import org.elasticsearch.cluster.block.ClusterBlockLevel; -import org.elasticsearch.cluster.metadata.Metadata; +import org.elasticsearch.cluster.metadata.ProjectMetadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.cluster.service.MasterServiceTaskQueue; import org.elasticsearch.common.Priority; @@ -130,9 +130,8 @@ private record UpdateDatabaseConfigurationTask(ActionListener builder.putCustom(RepositoriesMetadata.TYPE, updatedRepositoriesMetadata) + ); } @Override diff --git a/server/src/main/java/org/elasticsearch/script/ScriptService.java b/server/src/main/java/org/elasticsearch/script/ScriptService.java index f84f1eb834bfd..c44bf1ffc2731 100644 --- a/server/src/main/java/org/elasticsearch/script/ScriptService.java +++ b/server/src/main/java/org/elasticsearch/script/ScriptService.java @@ -22,7 +22,6 @@ import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.ClusterStateApplier; import org.elasticsearch.cluster.ClusterStateUpdateTask; -import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.Strings; import org.elasticsearch.common.logging.DeprecationCategory; @@ -733,11 +732,11 @@ public void putStoredScript( submitUnbatchedTask(clusterService, "put-script-" + request.id(), new AckedClusterStateUpdateTask(request, listener) { @Override public ClusterState execute(ClusterState currentState) { - ScriptMetadata smd = currentState.metadata().getProject().custom(ScriptMetadata.TYPE); - smd = ScriptMetadata.putStoredScript(smd, request.id(), source); - Metadata.Builder mdb = Metadata.builder(currentState.getMetadata()).putCustom(ScriptMetadata.TYPE, smd); + final var project = currentState.metadata().getProject(); + final ScriptMetadata originalSmd = project.custom(ScriptMetadata.TYPE); + final ScriptMetadata updatedSmd = ScriptMetadata.putStoredScript(originalSmd, request.id(), source); - return ClusterState.builder(currentState).metadata(mdb).build(); + return currentState.copyAndUpdateProject(project.id(), builder -> builder.putCustom(ScriptMetadata.TYPE, updatedSmd)); } }); } @@ -750,11 +749,11 @@ public static void deleteStoredScript( submitUnbatchedTask(clusterService, "delete-script-" + request.id(), new AckedClusterStateUpdateTask(request, listener) { @Override public ClusterState execute(ClusterState currentState) { - ScriptMetadata smd = currentState.metadata().getProject().custom(ScriptMetadata.TYPE); - smd = ScriptMetadata.deleteStoredScript(smd, request.id()); - Metadata.Builder mdb = Metadata.builder(currentState.getMetadata()).putCustom(ScriptMetadata.TYPE, smd); + final var project = currentState.metadata().getProject(); + final ScriptMetadata originalSmd = project.custom(ScriptMetadata.TYPE); + final ScriptMetadata updatedSmd = ScriptMetadata.deleteStoredScript(originalSmd, request.id()); - return ClusterState.builder(currentState).metadata(mdb).build(); + return currentState.copyAndUpdateProject(project.id(), builder -> builder.putCustom(ScriptMetadata.TYPE, updatedSmd)); } }); } diff --git a/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java b/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java index 99df2ac920f0c..bf6b078571bfc 100644 --- a/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java +++ b/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java @@ -1583,6 +1583,8 @@ private void ensureSnapshotNotDeleted(ClusterState currentState) { } private void applyGlobalStateRestore(ClusterState currentState, Metadata.Builder mdBuilder) { + @FixForMultiProject + final var projectBuilder = mdBuilder.getProject(ProjectId.DEFAULT); if (metadata.persistentSettings() != null) { Settings settings = metadata.persistentSettings(); if (request.skipOperatorOnlyState()) { @@ -1607,13 +1609,13 @@ private void applyGlobalStateRestore(ClusterState currentState, Metadata.Builder if (metadata.getProject().templates() != null) { // TODO: Should all existing templates be deleted first? for (IndexTemplateMetadata cursor : metadata.getProject().templates().values()) { - mdBuilder.put(cursor); + projectBuilder.put(cursor); } } // override existing restorable customs (as there might be nothing in snapshot to override them) mdBuilder.removeCustomIf((key, value) -> value.isRestorable()); - mdBuilder.removeProjectCustomIf((key, value) -> value.isRestorable()); + projectBuilder.removeCustomIf((key, value) -> value.isRestorable()); // restore customs from the snapshot if (metadata.customs() != null) { @@ -1630,7 +1632,7 @@ private void applyGlobalStateRestore(ClusterState currentState, Metadata.Builder for (var entry : metadata.getProject().customs().entrySet()) { if (entry.getValue().isRestorable()) { // Also, don't restore data streams here, we already added them to the metadata builder above - mdBuilder.putCustom(entry.getKey(), entry.getValue()); + projectBuilder.putCustom(entry.getKey(), entry.getValue()); } } } diff --git a/server/src/main/java/org/elasticsearch/snapshots/SnapshotsService.java b/server/src/main/java/org/elasticsearch/snapshots/SnapshotsService.java index 8496faf7bc0e6..4865e8cb5f690 100644 --- a/server/src/main/java/org/elasticsearch/snapshots/SnapshotsService.java +++ b/server/src/main/java/org/elasticsearch/snapshots/SnapshotsService.java @@ -4090,10 +4090,11 @@ public ClusterState execute(BatchExecutionContext batchExecutionCo // Handle the tasks to apply the shard snapshot updates (ShardSnapshotUpdate tasks). SnapshotsInProgress snapshotsInProgress = shardsUpdateContext.computeUpdatedState(); - final RegisteredPolicySnapshots.Builder registeredPolicySnapshots = state.metadata() - .getProject() - .custom(RegisteredPolicySnapshots.TYPE, RegisteredPolicySnapshots.EMPTY) - .builder(); + final var project = state.metadata().getProject(); + final RegisteredPolicySnapshots.Builder registeredPolicySnapshots = project.custom( + RegisteredPolicySnapshots.TYPE, + RegisteredPolicySnapshots.EMPTY + ).builder(); // Handle the tasks to create new snapshots (CreateSnapshotTask tasks). for (final var taskContext : batchExecutionContext.taskContexts()) { if (taskContext.getTask() instanceof CreateSnapshotTask task) { @@ -4135,7 +4136,9 @@ public ClusterState execute(BatchExecutionContext batchExecutionCo return ClusterState.builder(state) .putCustom(SnapshotsInProgress.TYPE, snapshotsInProgress) - .metadata(Metadata.builder(state.metadata()).putCustom(RegisteredPolicySnapshots.TYPE, registeredPolicySnapshots.build())) + .putProjectMetadata( + ProjectMetadata.builder(project).putCustom(RegisteredPolicySnapshots.TYPE, registeredPolicySnapshots.build()) + ) .build(); } diff --git a/test/framework/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreTestUtil.java b/test/framework/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreTestUtil.java index 349f1ae5d1921..e9a50c12eae0a 100644 --- a/test/framework/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreTestUtil.java +++ b/test/framework/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreTestUtil.java @@ -18,6 +18,8 @@ import org.elasticsearch.cluster.ClusterStateUpdateTask; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.cluster.metadata.Metadata; +import org.elasticsearch.cluster.metadata.ProjectId; +import org.elasticsearch.cluster.metadata.ProjectMetadata; import org.elasticsearch.cluster.metadata.RepositoriesMetadata; import org.elasticsearch.cluster.metadata.RepositoryMetadata; import org.elasticsearch.cluster.node.DiscoveryNode; @@ -391,18 +393,25 @@ public static ClusterService mockClusterService() { /** * Creates a mocked {@link ClusterService} for use in {@link BlobStoreRepository} related tests that mocks out all the necessary * functionality to make {@link BlobStoreRepository} work. Initializes the cluster state with a {@link RepositoriesMetadata} instance - * that contains the given {@code metadata}. + * that contains the given {@code repositoryMetadata}. * - * @param metadata RepositoryMetadata to initialize the cluster state with + * @param repositoryMetadata RepositoryMetadata to initialize the cluster state with * @return Mock ClusterService */ - public static ClusterService mockClusterService(RepositoryMetadata metadata) { + public static ClusterService mockClusterService(RepositoryMetadata repositoryMetadata) { return mockClusterService( ClusterState.builder(ClusterState.EMPTY_STATE) .metadata( Metadata.builder() .clusterUUID(UUIDs.randomBase64UUID(random())) - .putCustom(RepositoriesMetadata.TYPE, new RepositoriesMetadata(Collections.singletonList(metadata))) + .put( + ProjectMetadata.builder(ProjectId.DEFAULT) + .putCustom( + RepositoriesMetadata.TYPE, + new RepositoriesMetadata(Collections.singletonList(repositoryMetadata)) + ) + .build() + ) .build() ) .build() diff --git a/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/AutoFollowCoordinator.java b/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/AutoFollowCoordinator.java index 9a0d46f4bc507..6773ec0ad5d17 100644 --- a/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/AutoFollowCoordinator.java +++ b/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/AutoFollowCoordinator.java @@ -23,6 +23,7 @@ import org.elasticsearch.cluster.metadata.IndexAbstraction; import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.cluster.metadata.Metadata; +import org.elasticsearch.cluster.metadata.ProjectMetadata; import org.elasticsearch.cluster.routing.IndexRoutingTable; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.component.AbstractLifecycleComponent; @@ -879,7 +880,8 @@ static String getFollowerIndexName(AutoFollowPattern autoFollowPattern, String l static Function recordLeaderIndexAsFollowFunction(String name, Index indexToFollow) { return currentState -> { - AutoFollowMetadata currentAutoFollowMetadata = currentState.metadata().getProject().custom(AutoFollowMetadata.TYPE); + final var project = currentState.metadata().getProject(); + AutoFollowMetadata currentAutoFollowMetadata = project.custom(AutoFollowMetadata.TYPE); Map> newFollowedIndexUUIDS = new HashMap<>(currentAutoFollowMetadata.getFollowedLeaderIndexUUIDs()); if (newFollowedIndexUUIDS.containsKey(name) == false) { // A delete auto follow pattern request can have removed the auto follow pattern while we want to update @@ -900,9 +902,7 @@ static Function recordLeaderIndexAsFollowFunction(St currentAutoFollowMetadata.getHeaders() ); return ClusterState.builder(currentState) - .metadata( - Metadata.builder(currentState.getMetadata()).putCustom(AutoFollowMetadata.TYPE, newAutoFollowMetadata).build() - ) + .putProjectMetadata(ProjectMetadata.builder(project).putCustom(AutoFollowMetadata.TYPE, newAutoFollowMetadata).build()) .build(); }; } @@ -920,7 +920,8 @@ static Function cleanFollowedRemoteIndices( final List autoFollowPatternNames ) { return currentState -> { - AutoFollowMetadata currentAutoFollowMetadata = currentState.metadata().getProject().custom(AutoFollowMetadata.TYPE); + final var currentProject = currentState.metadata().getProject(); + AutoFollowMetadata currentAutoFollowMetadata = currentProject.custom(AutoFollowMetadata.TYPE); Map> autoFollowPatternNameToFollowedIndexUUIDs = new HashMap<>( currentAutoFollowMetadata.getFollowedLeaderIndexUUIDs() ); @@ -957,11 +958,10 @@ static Function cleanFollowedRemoteIndices( autoFollowPatternNameToFollowedIndexUUIDs, currentAutoFollowMetadata.getHeaders() ); - return ClusterState.builder(currentState) - .metadata( - Metadata.builder(currentState.getMetadata()).putCustom(AutoFollowMetadata.TYPE, newAutoFollowMetadata).build() - ) - .build(); + return currentState.copyAndUpdateProject( + currentProject.id(), + builder -> builder.putCustom(AutoFollowMetadata.TYPE, newAutoFollowMetadata) + ); } else { return currentState; } diff --git a/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/TransportActivateAutoFollowPatternAction.java b/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/TransportActivateAutoFollowPatternAction.java index ef7d79af2b47c..d07ee76fd9792 100644 --- a/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/TransportActivateAutoFollowPatternAction.java +++ b/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/TransportActivateAutoFollowPatternAction.java @@ -76,7 +76,8 @@ private void submitUnbatchedTask(@SuppressWarnings("SameParameterValue") String } static ClusterState innerActivate(final Request request, ClusterState currentState) { - final AutoFollowMetadata autoFollowMetadata = currentState.metadata().getProject().custom(AutoFollowMetadata.TYPE); + final var project = currentState.metadata().getProject(); + final AutoFollowMetadata autoFollowMetadata = project.custom(AutoFollowMetadata.TYPE); if (autoFollowMetadata == null) { throw new ResourceNotFoundException("auto-follow pattern [{}] is missing", request.getName()); } @@ -114,8 +115,9 @@ static ClusterState innerActivate(final Request request, ClusterState currentSta ) ); - return currentState.copyAndUpdateMetadata( - metadata -> metadata.putCustom( + return currentState.copyAndUpdateProject( + project.id(), + builder -> builder.putCustom( AutoFollowMetadata.TYPE, new AutoFollowMetadata(newPatterns, autoFollowMetadata.getFollowedLeaderIndexUUIDs(), autoFollowMetadata.getHeaders()) ) diff --git a/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/TransportPutAutoFollowPatternAction.java b/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/TransportPutAutoFollowPatternAction.java index 2d1292899be0c..9002c14b73b48 100644 --- a/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/TransportPutAutoFollowPatternAction.java +++ b/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/TransportPutAutoFollowPatternAction.java @@ -151,7 +151,8 @@ static ClusterState innerPut( // auto patterns are always overwritten // only already followed index uuids are updated - AutoFollowMetadata currentAutoFollowMetadata = localState.metadata().getProject().custom(AutoFollowMetadata.TYPE); + final var localProject = localState.metadata().getProject(); + AutoFollowMetadata currentAutoFollowMetadata = localProject.custom(AutoFollowMetadata.TYPE); Map> followedLeaderIndices; Map patterns; Map> headers; @@ -215,8 +216,9 @@ static ClusterState innerPut( ); patterns.put(request.getName(), autoFollowPattern); - return localState.copyAndUpdateMetadata( - metadata -> metadata.putCustom(AutoFollowMetadata.TYPE, new AutoFollowMetadata(patterns, followedLeaderIndices, headers)) + return localState.copyAndUpdateProject( + localProject.id(), + builder -> builder.putCustom(AutoFollowMetadata.TYPE, new AutoFollowMetadata(patterns, followedLeaderIndices, headers)) ); } diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/OperationModeUpdateTask.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/OperationModeUpdateTask.java index bdfa4c7303a4c..5a708dbf95fb2 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/OperationModeUpdateTask.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/OperationModeUpdateTask.java @@ -14,7 +14,6 @@ import org.elasticsearch.cluster.AckedClusterStateUpdateTask; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.ClusterStateUpdateTask; -import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.common.Priority; import org.elasticsearch.core.Nullable; import org.elasticsearch.core.Strings; @@ -91,7 +90,8 @@ private ClusterState updateILMState(final ClusterState currentState) { return currentState; } - final OperationMode currentMode = currentILMMode(currentState.metadata().getProject()); + final var project = currentState.metadata().getProject(); + final OperationMode currentMode = currentILMMode(project); if (currentMode.equals(ilmMode)) { // No need for a new state return currentState; @@ -106,12 +106,8 @@ private ClusterState updateILMState(final ClusterState currentState) { } logger.info("updating ILM operation mode to {}", newMode); - return ClusterState.builder(currentState) - .metadata( - Metadata.builder(currentState.metadata()) - .putCustom(LifecycleOperationMetadata.TYPE, new LifecycleOperationMetadata(newMode, currentSLMMode(currentState))) - ) - .build(); + final var updatedMetadata = new LifecycleOperationMetadata(newMode, currentSLMMode(currentState)); + return currentState.copyAndUpdateProject(project.id(), b -> b.putCustom(LifecycleOperationMetadata.TYPE, updatedMetadata)); } private ClusterState updateSLMState(final ClusterState currentState) { @@ -119,6 +115,7 @@ private ClusterState updateSLMState(final ClusterState currentState) { return currentState; } + final var project = currentState.metadata().getProject(); final OperationMode currentMode = currentSLMMode(currentState); if (currentMode.equals(slmMode)) { // No need for a new state @@ -134,15 +131,8 @@ private ClusterState updateSLMState(final ClusterState currentState) { } logger.info("updating SLM operation mode to {}", newMode); - return ClusterState.builder(currentState) - .metadata( - Metadata.builder(currentState.metadata()) - .putCustom( - LifecycleOperationMetadata.TYPE, - new LifecycleOperationMetadata(currentILMMode(currentState.metadata().getProject()), newMode) - ) - ) - .build(); + final var updatedMetadata = new LifecycleOperationMetadata(currentILMMode(project), newMode); + return currentState.copyAndUpdateProject(project.id(), b -> b.putCustom(LifecycleOperationMetadata.TYPE, updatedMetadata)); } @Override diff --git a/x-pack/plugin/migrate/src/main/java/org/elasticsearch/system_indices/task/MigrationResultsUpdateTask.java b/x-pack/plugin/migrate/src/main/java/org/elasticsearch/system_indices/task/MigrationResultsUpdateTask.java index 43bbe2a5aa74b..80060ec4908f1 100644 --- a/x-pack/plugin/migrate/src/main/java/org/elasticsearch/system_indices/task/MigrationResultsUpdateTask.java +++ b/x-pack/plugin/migrate/src/main/java/org/elasticsearch/system_indices/task/MigrationResultsUpdateTask.java @@ -12,7 +12,6 @@ import org.elasticsearch.action.ActionListener; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.ClusterStateUpdateTask; -import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.core.SuppressForbidden; @@ -70,14 +69,13 @@ private static void submitUnbatchedTask( @Override public ClusterState execute(ClusterState currentState) throws Exception { - FeatureMigrationResults currentResults = currentState.metadata().getProject().custom(FeatureMigrationResults.TYPE); + final var project = currentState.metadata().getProject(); + FeatureMigrationResults currentResults = project.custom(FeatureMigrationResults.TYPE); if (currentResults == null) { currentResults = new FeatureMigrationResults(new HashMap<>()); } FeatureMigrationResults newResults = currentResults.withResult(featureName, status); - final Metadata newMetadata = Metadata.builder(currentState.metadata()).putCustom(FeatureMigrationResults.TYPE, newResults).build(); - final ClusterState newState = ClusterState.builder(currentState).metadata(newMetadata).build(); - return newState; + return currentState.copyAndUpdateProject(project.id(), builder -> builder.putCustom(FeatureMigrationResults.TYPE, newResults)); } @Override diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteTrainedModelAction.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteTrainedModelAction.java index e5aedac14b08b..7ad733aa7443e 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteTrainedModelAction.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteTrainedModelAction.java @@ -22,7 +22,6 @@ import org.elasticsearch.cluster.ClusterStateUpdateTask; import org.elasticsearch.cluster.block.ClusterBlockException; import org.elasticsearch.cluster.block.ClusterBlockLevel; -import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.util.concurrent.EsExecutors; import org.elasticsearch.core.SuppressForbidden; @@ -228,7 +227,6 @@ private void deleteAliasesAndModel( submitUnbatchedTask("delete-trained-model-alias", new AckedClusterStateUpdateTask(request, nameDeletionListener) { @Override public ClusterState execute(final ClusterState currentState) { - final ClusterState.Builder builder = ClusterState.builder(currentState); final ModelAliasMetadata currentMetadata = ModelAliasMetadata.fromState(currentState); if (currentMetadata.modelAliases().isEmpty()) { return currentState; @@ -237,10 +235,8 @@ public ClusterState execute(final ClusterState currentState) { logger.info("[{}] delete model model_aliases {}", request.getId(), modelAliases); modelAliases.forEach(newMetadata::remove); final ModelAliasMetadata modelAliasMetadata = new ModelAliasMetadata(newMetadata); - builder.metadata( - Metadata.builder(currentState.getMetadata()).putCustom(ModelAliasMetadata.NAME, modelAliasMetadata).build() - ); - return builder.build(); + final var project = currentState.metadata().getProject(); + return currentState.copyAndUpdateProject(project.id(), b -> b.putCustom(ModelAliasMetadata.NAME, modelAliasMetadata)); } }); } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteTrainedModelAliasAction.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteTrainedModelAliasAction.java index f2dbe43cd70e1..2b8baa9075ced 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteTrainedModelAliasAction.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteTrainedModelAliasAction.java @@ -19,7 +19,6 @@ import org.elasticsearch.cluster.ClusterStateUpdateTask; import org.elasticsearch.cluster.block.ClusterBlockException; import org.elasticsearch.cluster.block.ClusterBlockLevel; -import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.util.concurrent.EsExecutors; import org.elasticsearch.core.SuppressForbidden; @@ -108,7 +107,8 @@ static ClusterState deleteModelAlias( request.getModelId() ); } - IngestMetadata currentIngestMetadata = currentState.metadata().getProject().custom(IngestMetadata.TYPE); + final var project = currentState.metadata().getProject(); + IngestMetadata currentIngestMetadata = project.custom(IngestMetadata.TYPE); Set referencedModels = InferenceProcessorInfoExtractor.getModelIdsFromInferenceProcessors(currentIngestMetadata); if (referencedModels.contains(request.getModelAlias())) { throw new ElasticsearchStatusException( @@ -117,15 +117,13 @@ static ClusterState deleteModelAlias( request.getModelAlias() ); } - final ClusterState.Builder builder = ClusterState.builder(currentState); final Map newMetadata = new HashMap<>(currentMetadata.modelAliases()); logger.info("deleting model_alias [{}] that refers to model [{}]", request.getModelAlias(), request.getModelId()); inferenceAuditor.info(referencedModel, String.format(Locale.ROOT, "deleting model_alias [%s]", request.getModelAlias())); newMetadata.remove(request.getModelAlias()); final ModelAliasMetadata modelAliasMetadata = new ModelAliasMetadata(newMetadata); - builder.metadata(Metadata.builder(currentState.getMetadata()).putCustom(ModelAliasMetadata.NAME, modelAliasMetadata).build()); - return builder.build(); + return currentState.copyAndUpdateProject(project.id(), builder -> builder.putCustom(ModelAliasMetadata.NAME, modelAliasMetadata)); } @Override diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportPutTrainedModelAliasAction.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportPutTrainedModelAliasAction.java index f24c77f3d59a8..33b17ca46a240 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportPutTrainedModelAliasAction.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportPutTrainedModelAliasAction.java @@ -18,7 +18,6 @@ import org.elasticsearch.cluster.ClusterStateUpdateTask; import org.elasticsearch.cluster.block.ClusterBlockException; import org.elasticsearch.cluster.block.ClusterBlockLevel; -import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.logging.HeaderWarning; import org.elasticsearch.common.util.concurrent.EsExecutors; @@ -257,7 +256,6 @@ private void submitUnbatchedTask(@SuppressWarnings("SameParameterValue") String } static ClusterState updateModelAlias(final ClusterState currentState, final PutTrainedModelAliasAction.Request request) { - final ClusterState.Builder builder = ClusterState.builder(currentState); final ModelAliasMetadata currentMetadata = ModelAliasMetadata.fromState(currentState); String currentModelId = currentMetadata.getModelId(request.getModelAlias()); final Map newMetadata = new HashMap<>(currentMetadata.modelAliases()); @@ -273,8 +271,8 @@ static ClusterState updateModelAlias(final ClusterState currentState, final PutT } newMetadata.put(request.getModelAlias(), new ModelAliasMetadata.ModelAliasEntry(request.getModelId())); final ModelAliasMetadata modelAliasMetadata = new ModelAliasMetadata(newMetadata); - builder.metadata(Metadata.builder(currentState.getMetadata()).putCustom(ModelAliasMetadata.NAME, modelAliasMetadata).build()); - return builder.build(); + final var project = currentState.metadata().getProject(); + return currentState.copyAndUpdateProject(project.id(), builder -> builder.putCustom(ModelAliasMetadata.NAME, modelAliasMetadata)); } @Override diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportSetUpgradeModeAction.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportSetUpgradeModeAction.java index a937d310a47f1..b6defef18c8c3 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportSetUpgradeModeAction.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportSetUpgradeModeAction.java @@ -87,11 +87,10 @@ protected boolean upgradeMode(ClusterState state) { @Override protected ClusterState createUpdatedState(SetUpgradeModeActionRequest request, ClusterState currentState) { logger.trace("Executing cluster state update"); - MlMetadata.Builder builder = new MlMetadata.Builder(currentState.metadata().getProject().custom(MlMetadata.TYPE)); + final var project = currentState.metadata().getProject(); + MlMetadata.Builder builder = new MlMetadata.Builder(project.custom(MlMetadata.TYPE)); builder.isUpgradeMode(request.enabled()); - ClusterState.Builder newState = ClusterState.builder(currentState); - newState.metadata(Metadata.builder(currentState.getMetadata()).putCustom(MlMetadata.TYPE, builder.build()).build()); - return newState.build(); + return currentState.copyAndUpdateProject(project.id(), b -> b.putCustom(MlMetadata.TYPE, builder.build())); } protected void upgradeModeSuccessfullyChanged( diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/assignment/TrainedModelAssignmentClusterService.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/assignment/TrainedModelAssignmentClusterService.java index fd1557cd7310d..ae6a8934c3d62 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/assignment/TrainedModelAssignmentClusterService.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/assignment/TrainedModelAssignmentClusterService.java @@ -21,8 +21,8 @@ import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.ClusterStateListener; import org.elasticsearch.cluster.ClusterStateUpdateTask; -import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.metadata.NodesShutdownMetadata; +import org.elasticsearch.cluster.metadata.ProjectMetadata; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNodes; import org.elasticsearch.cluster.service.ClusterService; @@ -523,14 +523,14 @@ private static ClusterState update(ClusterState currentState, TrainedModelAssign private static ClusterState forceUpdate(ClusterState currentState, TrainedModelAssignmentMetadata.Builder modelAssignments) { logger.debug(() -> format("updated assignments: %s", modelAssignments.build())); - Metadata.Builder metadata = Metadata.builder(currentState.metadata()); + ProjectMetadata.Builder builder = ProjectMetadata.builder(currentState.metadata().getProject()); if (currentState.getMinTransportVersion().onOrAfter(RENAME_ALLOCATION_TO_ASSIGNMENT_TRANSPORT_VERSION)) { - metadata.putCustom(TrainedModelAssignmentMetadata.NAME, modelAssignments.build()) - .removeProjectCustom(TrainedModelAssignmentMetadata.DEPRECATED_NAME); + builder.putCustom(TrainedModelAssignmentMetadata.NAME, modelAssignments.build()) + .removeCustom(TrainedModelAssignmentMetadata.DEPRECATED_NAME); } else { - metadata.putCustom(TrainedModelAssignmentMetadata.DEPRECATED_NAME, modelAssignments.buildOld()); + builder.putCustom(TrainedModelAssignmentMetadata.DEPRECATED_NAME, modelAssignments.buildOld()); } - return ClusterState.builder(currentState).metadata(metadata).build(); + return ClusterState.builder(currentState).putProjectMetadata(builder).build(); } ClusterState createModelAssignment(ClusterState currentState, CreateTrainedModelAssignmentAction.Request request) throws Exception { diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/persistence/TrainedModelCacheMetadataService.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/persistence/TrainedModelCacheMetadataService.java index bd7510a09a013..df6ea1641e68b 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/persistence/TrainedModelCacheMetadataService.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/persistence/TrainedModelCacheMetadataService.java @@ -17,7 +17,6 @@ import org.elasticsearch.cluster.ClusterStateTaskExecutor; import org.elasticsearch.cluster.ClusterStateTaskExecutor.TaskContext; import org.elasticsearch.cluster.ClusterStateTaskListener; -import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.cluster.service.MasterServiceTaskQueue; import org.elasticsearch.common.Priority; @@ -123,9 +122,11 @@ public ClusterState execute(BatchExecutionContext batch return initialState; } - return ClusterState.builder(initialState) - .metadata(Metadata.builder(initialState.metadata()).putCustom(TrainedModelCacheMetadata.NAME, currentCacheMetadata)) - .build(); + final var finalMetadata = currentCacheMetadata; + return initialState.copyAndUpdateProject( + initialState.metadata().getProject().id(), + builder -> builder.putCustom(TrainedModelCacheMetadata.NAME, finalMetadata) + ); } } } diff --git a/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/SnapshotLifecycleTask.java b/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/SnapshotLifecycleTask.java index b2a68bc8603b2..eb7c9c1b8794e 100644 --- a/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/SnapshotLifecycleTask.java +++ b/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/SnapshotLifecycleTask.java @@ -17,7 +17,6 @@ import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.ClusterStateUpdateTask; import org.elasticsearch.cluster.SnapshotsInProgress; -import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.Strings; import org.elasticsearch.common.scheduler.SchedulerEngine; @@ -271,12 +270,9 @@ static WriteJobStatus failure(String policyId, SnapshotId snapshotId, long times @Override public ClusterState execute(ClusterState currentState) throws Exception { - SnapshotLifecycleMetadata snapMeta = currentState.metadata() - .getProject() - .custom(SnapshotLifecycleMetadata.TYPE, SnapshotLifecycleMetadata.EMPTY); - RegisteredPolicySnapshots registeredSnapshots = currentState.metadata() - .getProject() - .custom(RegisteredPolicySnapshots.TYPE, RegisteredPolicySnapshots.EMPTY); + final var project = currentState.metadata().getProject(); + SnapshotLifecycleMetadata snapMeta = project.custom(SnapshotLifecycleMetadata.TYPE, SnapshotLifecycleMetadata.EMPTY); + RegisteredPolicySnapshots registeredSnapshots = project.custom(RegisteredPolicySnapshots.TYPE, RegisteredPolicySnapshots.EMPTY); Map snapLifecycles = new HashMap<>(snapMeta.getSnapshotConfigurations()); SnapshotLifecyclePolicyMetadata policyMetadata = snapLifecycles.get(policyName); @@ -349,11 +345,11 @@ public ClusterState execute(ClusterState currentState) throws Exception { currentSLMMode(currentState), newStats ); - Metadata newMeta = Metadata.builder(currentState.metadata()) - .putCustom(SnapshotLifecycleMetadata.TYPE, lifecycleMetadata) - .putCustom(RegisteredPolicySnapshots.TYPE, new RegisteredPolicySnapshots(newRegistered)) - .build(); - return ClusterState.builder(currentState).metadata(newMeta).build(); + return currentState.copyAndUpdateProject( + project.id(), + builder -> builder.putCustom(SnapshotLifecycleMetadata.TYPE, lifecycleMetadata) + .putCustom(RegisteredPolicySnapshots.TYPE, new RegisteredPolicySnapshots(newRegistered)) + ); } @Override diff --git a/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/UpdateSnapshotLifecycleStatsTask.java b/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/UpdateSnapshotLifecycleStatsTask.java index ee341eed12c35..d23b0cdc0fe23 100644 --- a/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/UpdateSnapshotLifecycleStatsTask.java +++ b/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/UpdateSnapshotLifecycleStatsTask.java @@ -37,7 +37,8 @@ public class UpdateSnapshotLifecycleStatsTask extends ClusterStateUpdateTask { @Override public ClusterState execute(ClusterState currentState) { final Metadata currentMeta = currentState.metadata(); - final SnapshotLifecycleMetadata currentSlmMeta = currentMeta.getProject().custom(SnapshotLifecycleMetadata.TYPE); + final var project = currentMeta.getProject(); + final SnapshotLifecycleMetadata currentSlmMeta = project.custom(SnapshotLifecycleMetadata.TYPE); if (currentSlmMeta == null) { return currentState; @@ -50,9 +51,7 @@ public ClusterState execute(ClusterState currentState) { newMetrics ); - return ClusterState.builder(currentState) - .metadata(Metadata.builder(currentMeta).putCustom(SnapshotLifecycleMetadata.TYPE, newSlmMeta)) - .build(); + return currentState.copyAndUpdateProject(project.id(), builder -> builder.putCustom(SnapshotLifecycleMetadata.TYPE, newSlmMeta)); } @Override diff --git a/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/action/TransportDeleteSnapshotLifecycleAction.java b/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/action/TransportDeleteSnapshotLifecycleAction.java index ee2810d23eeb4..1462117c91123 100644 --- a/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/action/TransportDeleteSnapshotLifecycleAction.java +++ b/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/action/TransportDeleteSnapshotLifecycleAction.java @@ -17,7 +17,6 @@ import org.elasticsearch.cluster.ClusterStateUpdateTask; import org.elasticsearch.cluster.block.ClusterBlockException; import org.elasticsearch.cluster.block.ClusterBlockLevel; -import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.util.concurrent.EsExecutors; import org.elasticsearch.core.SuppressForbidden; @@ -82,7 +81,8 @@ public static class DeleteSnapshotPolicyTask extends AckedClusterStateUpdateTask @Override public ClusterState execute(ClusterState currentState) { - SnapshotLifecycleMetadata snapMeta = currentState.metadata().getProject().custom(SnapshotLifecycleMetadata.TYPE); + final var project = currentState.metadata().getProject(); + SnapshotLifecycleMetadata snapMeta = project.custom(SnapshotLifecycleMetadata.TYPE); if (snapMeta == null) { throw new ResourceNotFoundException("snapshot lifecycle policy not found: {}", request.getLifecycleId()); } @@ -101,20 +101,13 @@ public ClusterState execute(ClusterState currentState) { .filter(e -> e.getKey().equals(request.getLifecycleId()) == false) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - Metadata metadata = currentState.metadata(); - return ClusterState.builder(currentState) - .metadata( - Metadata.builder(metadata) - .putCustom( - SnapshotLifecycleMetadata.TYPE, - new SnapshotLifecycleMetadata( - newConfigs, - currentMode, - snapMeta.getStats().removePolicy(request.getLifecycleId()) - ) - ) + return currentState.copyAndUpdateProject( + project.id(), + builder -> builder.putCustom( + SnapshotLifecycleMetadata.TYPE, + new SnapshotLifecycleMetadata(newConfigs, currentMode, snapMeta.getStats().removePolicy(request.getLifecycleId())) ) - .build(); + ); } } diff --git a/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/action/TransportPutSnapshotLifecycleAction.java b/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/action/TransportPutSnapshotLifecycleAction.java index 3631a9c1efdde..a66373e6e9d6c 100644 --- a/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/action/TransportPutSnapshotLifecycleAction.java +++ b/x-pack/plugin/slm/src/main/java/org/elasticsearch/xpack/slm/action/TransportPutSnapshotLifecycleAction.java @@ -18,7 +18,6 @@ import org.elasticsearch.cluster.ClusterStateUpdateTask; import org.elasticsearch.cluster.block.ClusterBlockException; import org.elasticsearch.cluster.block.ClusterBlockLevel; -import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.util.concurrent.EsExecutors; import org.elasticsearch.core.Nullable; @@ -121,9 +120,8 @@ public static class UpdateSnapshotPolicyTask extends AckedClusterStateUpdateTask @Override public ClusterState execute(ClusterState currentState) { - SnapshotLifecycleMetadata snapMeta = currentState.metadata() - .getProject() - .custom(SnapshotLifecycleMetadata.TYPE, SnapshotLifecycleMetadata.EMPTY); + final var project = currentState.metadata().getProject(); + SnapshotLifecycleMetadata snapMeta = project.custom(SnapshotLifecycleMetadata.TYPE, SnapshotLifecycleMetadata.EMPTY); var currentMode = LifecycleOperationMetadata.currentSLMMode(currentState); final SnapshotLifecyclePolicyMetadata existingPolicyMetadata = snapMeta.getSnapshotConfigurations() .get(request.getLifecycleId()); @@ -149,15 +147,8 @@ public ClusterState execute(ClusterState currentState) { logger.info("updating existing snapshot lifecycle [{}]", newLifecycle.getId()); } - return ClusterState.builder(currentState) - .metadata( - Metadata.builder(currentState.metadata()) - .putCustom( - SnapshotLifecycleMetadata.TYPE, - new SnapshotLifecycleMetadata(snapLifecycles, currentMode, snapMeta.getStats()) - ) - ) - .build(); + final var updatedMetadata = new SnapshotLifecycleMetadata(snapLifecycles, currentMode, snapMeta.getStats()); + return currentState.copyAndUpdateProject(project.id(), b -> b.putCustom(SnapshotLifecycleMetadata.TYPE, updatedMetadata)); } } diff --git a/x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/action/TransportSetTransformUpgradeModeAction.java b/x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/action/TransportSetTransformUpgradeModeAction.java index d5f30353f308e..98e5907bce3cf 100644 --- a/x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/action/TransportSetTransformUpgradeModeAction.java +++ b/x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/action/TransportSetTransformUpgradeModeAction.java @@ -77,8 +77,10 @@ protected boolean upgradeMode(ClusterState state) { @Override protected ClusterState createUpdatedState(SetUpgradeModeActionRequest request, ClusterState state) { var updatedTransformMetadata = TransformMetadata.getTransformMetadata(state).builder().upgradeMode(request.enabled()).build(); - var updatedClusterMetadata = state.metadata().copyAndUpdate(b -> b.putCustom(TransformMetadata.TYPE, updatedTransformMetadata)); - return state.copyAndUpdate(b -> b.metadata(updatedClusterMetadata)); + return state.copyAndUpdateProject( + state.metadata().getProject().id(), + b -> b.putCustom(TransformMetadata.TYPE, updatedTransformMetadata) + ); } @Override diff --git a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/transport/actions/TransportWatcherServiceAction.java b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/transport/actions/TransportWatcherServiceAction.java index 616821a8f3ddf..57eb0f9197ce5 100644 --- a/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/transport/actions/TransportWatcherServiceAction.java +++ b/x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/transport/actions/TransportWatcherServiceAction.java @@ -18,7 +18,6 @@ import org.elasticsearch.cluster.ClusterStateUpdateTask; import org.elasticsearch.cluster.block.ClusterBlockException; import org.elasticsearch.cluster.block.ClusterBlockLevel; -import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.core.SuppressForbidden; import org.elasticsearch.injection.guice.Inject; @@ -74,15 +73,14 @@ public ClusterState execute(ClusterState clusterState) { XPackPlugin.checkReadyForXPackCustomMetadata(clusterState); WatcherMetadata newWatcherMetadata = new WatcherMetadata(manuallyStopped); - WatcherMetadata currentMetadata = clusterState.metadata().getProject().custom(WatcherMetadata.TYPE); + final var project = clusterState.metadata().getProject(); + WatcherMetadata currentMetadata = project.custom(WatcherMetadata.TYPE); // adhere to the contract of returning the original state if nothing has changed if (newWatcherMetadata.equals(currentMetadata)) { return clusterState; } else { - ClusterState.Builder builder = new ClusterState.Builder(clusterState); - builder.metadata(Metadata.builder(clusterState.getMetadata()).putCustom(WatcherMetadata.TYPE, newWatcherMetadata)); - return builder.build(); + return clusterState.copyAndUpdateProject(project.id(), b -> b.putCustom(WatcherMetadata.TYPE, newWatcherMetadata)); } } From c04b088e7e5e9690e1ae552334ea2a0cd693d2b3 Mon Sep 17 00:00:00 2001 From: Niels Bauman Date: Wed, 4 Jun 2025 07:58:39 +0200 Subject: [PATCH 2/3] Small fix --- .../geoip/direct/TransportPutDatabaseConfigurationAction.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/direct/TransportPutDatabaseConfigurationAction.java b/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/direct/TransportPutDatabaseConfigurationAction.java index 2c090a6bf578d..f7a9c2aff305f 100644 --- a/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/direct/TransportPutDatabaseConfigurationAction.java +++ b/modules/ingest-geoip/src/main/java/org/elasticsearch/ingest/geoip/direct/TransportPutDatabaseConfigurationAction.java @@ -160,9 +160,7 @@ ClusterState execute(ClusterState currentState) throws Exception { } return ClusterState.builder(currentState) - .putProjectMetadata( - ProjectMetadata.builder(project).putCustom(IngestGeoIpMetadata.TYPE, new IngestGeoIpMetadata(databases)) - ) + .putProjectMetadata(ProjectMetadata.builder(project).putCustom(IngestGeoIpMetadata.TYPE, geoIpMeta)) .build(); } From bfd8afb6006245b2f5e432b4d749397f51ccb0a8 Mon Sep 17 00:00:00 2001 From: Niels Bauman Date: Fri, 6 Jun 2025 07:48:52 +0200 Subject: [PATCH 3/3] Feedback --- .../blobstore/BlobStoreRepository.java | 20 +++++++++++-------- .../ccr/action/AutoFollowCoordinator.java | 9 +++++---- .../TrainedModelCacheMetadataService.java | 12 ++++++----- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreRepository.java b/server/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreRepository.java index 91c1c26522af6..9611f42437765 100644 --- a/server/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreRepository.java +++ b/server/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreRepository.java @@ -2593,7 +2593,7 @@ private void markRepoCorrupted(long corruptedGeneration, Exception originalExcep new ClusterStateUpdateTask() { @Override public ClusterState execute(ClusterState currentState) { - final var project = currentState.metadata().getProject(); + final var project = currentState.metadata().getDefaultProject(); final RepositoriesMetadata state = RepositoriesMetadata.get(project); final RepositoryMetadata repoState = state.repository(metadata.name()); if (repoState.generation() != corruptedGeneration) { @@ -2787,13 +2787,17 @@ public ClusterState execute(ClusterState currentState) { + "] must be larger than latest known generation [" + latestKnownRepoGen.get() + "]"; - final var project = currentState.metadata().getProject(); - final var updatedRepositoriesMetadata = RepositoriesMetadata.get(project) - .withUpdatedGeneration(repoName, safeGeneration, newGen); - return currentState.copyAndUpdateProject( - project.id(), - builder -> builder.putCustom(RepositoriesMetadata.TYPE, updatedRepositoriesMetadata) - ); + final var project = currentState.metadata().getDefaultProject(); + return ClusterState.builder(currentState) + .putProjectMetadata( + ProjectMetadata.builder(project) + .putCustom( + RepositoriesMetadata.TYPE, + RepositoriesMetadata.get(project).withUpdatedGeneration(repoName, safeGeneration, newGen) + ) + .build() + ) + .build(); } @Override diff --git a/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/AutoFollowCoordinator.java b/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/AutoFollowCoordinator.java index 6773ec0ad5d17..4590b38f09f46 100644 --- a/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/AutoFollowCoordinator.java +++ b/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/AutoFollowCoordinator.java @@ -958,10 +958,11 @@ static Function cleanFollowedRemoteIndices( autoFollowPatternNameToFollowedIndexUUIDs, currentAutoFollowMetadata.getHeaders() ); - return currentState.copyAndUpdateProject( - currentProject.id(), - builder -> builder.putCustom(AutoFollowMetadata.TYPE, newAutoFollowMetadata) - ); + return ClusterState.builder(currentState) + .putProjectMetadata( + ProjectMetadata.builder(currentProject).putCustom(AutoFollowMetadata.TYPE, newAutoFollowMetadata).build() + ) + .build(); } else { return currentState; } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/persistence/TrainedModelCacheMetadataService.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/persistence/TrainedModelCacheMetadataService.java index df6ea1641e68b..65420c6c15073 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/persistence/TrainedModelCacheMetadataService.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/inference/persistence/TrainedModelCacheMetadataService.java @@ -17,6 +17,7 @@ import org.elasticsearch.cluster.ClusterStateTaskExecutor; import org.elasticsearch.cluster.ClusterStateTaskExecutor.TaskContext; import org.elasticsearch.cluster.ClusterStateTaskListener; +import org.elasticsearch.cluster.metadata.ProjectMetadata; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.cluster.service.MasterServiceTaskQueue; import org.elasticsearch.common.Priority; @@ -122,11 +123,12 @@ public ClusterState execute(BatchExecutionContext batch return initialState; } - final var finalMetadata = currentCacheMetadata; - return initialState.copyAndUpdateProject( - initialState.metadata().getProject().id(), - builder -> builder.putCustom(TrainedModelCacheMetadata.NAME, finalMetadata) - ); + return ClusterState.builder(initialState) + .putProjectMetadata( + ProjectMetadata.builder(initialState.metadata().getProject()) + .putCustom(TrainedModelCacheMetadata.NAME, currentCacheMetadata) + ) + .build(); } } }