From b8871bd4de612d6314fcd3af85ea5b8e2281bd69 Mon Sep 17 00:00:00 2001 From: Lee Hinman Date: Wed, 18 Mar 2026 12:09:10 -0600 Subject: [PATCH 1/5] Use marked repository name in `DataStreamLifecycleConvertToFrozen` As a result of #144248 we mark the repository name to use for frozen conversion in the custom metadata of the backing index, so that a consistent repository is used for the whole process. This commit enhances the conversion faculties to use this repository name. --- .../data-streams/src/main/java/module-info.java | 1 + x-pack/plugin/core/build.gradle | 1 + .../plugin/core/src/main/java/module-info.java | 1 + .../DataStreamLifecycleConvertToFrozen.java | 16 +++++++++++++++- ...ifecycleConvertToFrozenMarkReadOnlyTests.java | 7 +++++++ 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/modules/data-streams/src/main/java/module-info.java b/modules/data-streams/src/main/java/module-info.java index 35280353b0826..a790fb01828b3 100644 --- a/modules/data-streams/src/main/java/module-info.java +++ b/modules/data-streams/src/main/java/module-info.java @@ -20,6 +20,7 @@ exports org.elasticsearch.datastreams.lifecycle; exports org.elasticsearch.datastreams.lifecycle.transitions.steps to org.elasticsearch.server; exports org.elasticsearch.datastreams.options.action to org.elasticsearch.server; + exports org.elasticsearch.datastreams; provides org.elasticsearch.features.FeatureSpecification with org.elasticsearch.datastreams.DataStreamFeatures; } diff --git a/x-pack/plugin/core/build.gradle b/x-pack/plugin/core/build.gradle index 65910dd111437..366df33b2ad63 100644 --- a/x-pack/plugin/core/build.gradle +++ b/x-pack/plugin/core/build.gradle @@ -80,6 +80,7 @@ dependencies { api "com.unboundid:unboundid-ldapsdk:${versions.ldapsdk}" implementation project(":x-pack:plugin:core:template-resources") + implementation project(':modules:data-streams') testImplementation "org.elasticsearch:mocksocket:${versions.mocksocket}" testImplementation project(path: ':modules:reindex') diff --git a/x-pack/plugin/core/src/main/java/module-info.java b/x-pack/plugin/core/src/main/java/module-info.java index a7613425feb74..2b636c58949f7 100644 --- a/x-pack/plugin/core/src/main/java/module-info.java +++ b/x-pack/plugin/core/src/main/java/module-info.java @@ -28,6 +28,7 @@ requires org.slf4j; requires com.ibm.icu; requires org.elasticsearch.exponentialhistogram; + requires org.elasticsearch.datastreams; exports org.elasticsearch.index.engine.frozen; exports org.elasticsearch.license; diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/datastreams/DataStreamLifecycleConvertToFrozen.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/datastreams/DataStreamLifecycleConvertToFrozen.java index 94b122f0eb707..73d921b7d4684 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/datastreams/DataStreamLifecycleConvertToFrozen.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/datastreams/DataStreamLifecycleConvertToFrozen.java @@ -19,6 +19,9 @@ import org.elasticsearch.cluster.metadata.ProjectMetadata; import org.elasticsearch.cluster.metadata.RepositoriesMetadata; import org.elasticsearch.common.Strings; +import org.elasticsearch.core.Nullable; +import org.elasticsearch.datastreams.DataStreamsPlugin; +import org.elasticsearch.datastreams.lifecycle.DataStreamLifecycleService; import org.elasticsearch.license.LicenseUtils; import org.elasticsearch.license.XPackLicenseState; import org.elasticsearch.repositories.RepositoriesService; @@ -141,7 +144,7 @@ boolean isEligibleForConvertToFrozen() { return false; } - String repositoryName = resolveRepositoryName(projectState); + final String repositoryName = getRepositoryForFrozen(projectMetadata, indexName); if (Strings.hasText(repositoryName) == false) { logger.debug("Default repository not configured, skipping convert-to-frozen steps for index [{}]", indexName); throw new ElasticsearchException( @@ -168,6 +171,17 @@ boolean isEligibleForConvertToFrozen() { return true; } + /** + * Return the repository name to use for converting this index to a searchable snapshot, or else null if it is not set. + */ + @Nullable + private static String getRepositoryForFrozen(ProjectMetadata projectMetadata, String indexName) { + return Optional.ofNullable(projectMetadata.index(indexName)) + .map(im -> im.getCustomData(DataStreamsPlugin.LIFECYCLE_CUSTOM_INDEX_METADATA_KEY)) + .map(custom -> custom.get(DataStreamLifecycleService.FROZEN_CANDIDATE_REPOSITORY_METADATA_KEY)) + .orElse(null); + } + /** * Resolves the repository name to use for the snapshot and searchable snapshot steps. */ diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/datastreams/DataStreamLifecycleConvertToFrozenMarkReadOnlyTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/datastreams/DataStreamLifecycleConvertToFrozenMarkReadOnlyTests.java index af99d53ee7338..b687ed064dcbd 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/datastreams/DataStreamLifecycleConvertToFrozenMarkReadOnlyTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/datastreams/DataStreamLifecycleConvertToFrozenMarkReadOnlyTests.java @@ -28,6 +28,8 @@ import org.elasticsearch.cluster.metadata.RepositoryMetadata; import org.elasticsearch.cluster.project.TestProjectResolvers; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.datastreams.DataStreamsPlugin; +import org.elasticsearch.datastreams.lifecycle.DataStreamLifecycleService; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexVersion; import org.elasticsearch.license.License; @@ -42,6 +44,7 @@ import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicReference; import static org.elasticsearch.cluster.metadata.IndexMetadata.APIBlock.WRITE; @@ -405,6 +408,10 @@ private ProjectState createProjectStateWithRepo(String repoName, boolean registe .settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, IndexVersion.current()).build()) .numberOfShards(1) .numberOfReplicas(0) + .putCustom( + DataStreamsPlugin.LIFECYCLE_CUSTOM_INDEX_METADATA_KEY, + Map.of(DataStreamLifecycleService.FROZEN_CANDIDATE_REPOSITORY_METADATA_KEY, repoName) + ) .build(), false ); From 1f512a58125d33ff607b50921be484c469d3c161 Mon Sep 17 00:00:00 2001 From: Lee Hinman Date: Wed, 18 Mar 2026 12:13:17 -0600 Subject: [PATCH 2/5] Remove unused resolveRespositoryName method --- .../datastreams/DataStreamLifecycleConvertToFrozen.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/datastreams/DataStreamLifecycleConvertToFrozen.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/datastreams/DataStreamLifecycleConvertToFrozen.java index 73d921b7d4684..afc3af1db0a5c 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/datastreams/DataStreamLifecycleConvertToFrozen.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/datastreams/DataStreamLifecycleConvertToFrozen.java @@ -24,7 +24,6 @@ import org.elasticsearch.datastreams.lifecycle.DataStreamLifecycleService; import org.elasticsearch.license.LicenseUtils; import org.elasticsearch.license.XPackLicenseState; -import org.elasticsearch.repositories.RepositoriesService; import java.util.ArrayList; import java.util.Arrays; @@ -182,13 +181,6 @@ private static String getRepositoryForFrozen(ProjectMetadata projectMetadata, St .orElse(null); } - /** - * Resolves the repository name to use for the snapshot and searchable snapshot steps. - */ - private static String resolveRepositoryName(ProjectState projectState) { - return RepositoriesService.DEFAULT_REPOSITORY_SETTING.get(projectState.cluster().metadata().settings()); - } - /** * Validates the response from the add index block request. If the response indicates that the block was successfully added, * this method returns normally. If the response indicates a failure, this method throws an exception with details about the failure. From ae3d57e15ea0ee48c325a914fb208359df0a5f3c Mon Sep 17 00:00:00 2001 From: Lee Hinman Date: Wed, 18 Mar 2026 12:44:08 -0600 Subject: [PATCH 3/5] Try a different way of specifying dependencies --- x-pack/plugin/core/build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugin/core/build.gradle b/x-pack/plugin/core/build.gradle index 366df33b2ad63..b9b6257a85d45 100644 --- a/x-pack/plugin/core/build.gradle +++ b/x-pack/plugin/core/build.gradle @@ -28,6 +28,7 @@ esplugin { classname ='org.elasticsearch.xpack.core.XPackPlugin' hasNativeController =false requiresKeystore =false + extendedPlugins = ['data-streams'] } tasks.withType(AbstractDependenciesTask).configureEach { @@ -80,7 +81,7 @@ dependencies { api "com.unboundid:unboundid-ldapsdk:${versions.ldapsdk}" implementation project(":x-pack:plugin:core:template-resources") - implementation project(':modules:data-streams') + compileOnly project(':modules:data-streams') testImplementation "org.elasticsearch:mocksocket:${versions.mocksocket}" testImplementation project(path: ':modules:reindex') From 2463a7ab91e3187d0e676ab9287f7c56491fde5f Mon Sep 17 00:00:00 2001 From: Lee Hinman Date: Thu, 26 Mar 2026 10:40:34 -0600 Subject: [PATCH 4/5] Spotless --- .../xpack/dlm/frozen/DataStreamLifecycleConvertToFrozen.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugin/dlm-frozen-transition/src/main/java/org/elasticsearch/xpack/dlm/frozen/DataStreamLifecycleConvertToFrozen.java b/x-pack/plugin/dlm-frozen-transition/src/main/java/org/elasticsearch/xpack/dlm/frozen/DataStreamLifecycleConvertToFrozen.java index 75e8ac44273d4..17062eeee5495 100644 --- a/x-pack/plugin/dlm-frozen-transition/src/main/java/org/elasticsearch/xpack/dlm/frozen/DataStreamLifecycleConvertToFrozen.java +++ b/x-pack/plugin/dlm-frozen-transition/src/main/java/org/elasticsearch/xpack/dlm/frozen/DataStreamLifecycleConvertToFrozen.java @@ -34,11 +34,11 @@ import org.elasticsearch.cluster.metadata.ProjectMetadata; import org.elasticsearch.cluster.metadata.RepositoriesMetadata; import org.elasticsearch.common.Strings; +import org.elasticsearch.common.settings.Settings; import org.elasticsearch.core.Nullable; +import org.elasticsearch.core.TimeValue; import org.elasticsearch.datastreams.DataStreamsPlugin; import org.elasticsearch.datastreams.lifecycle.DataStreamLifecycleService; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.core.TimeValue; import org.elasticsearch.index.IndexNotFoundException; import org.elasticsearch.license.LicenseUtils; import org.elasticsearch.license.XPackLicenseState; From 51784a7af10c907088b0436d90bd6559b4f3c326 Mon Sep 17 00:00:00 2001 From: Lee Hinman Date: Thu, 26 Mar 2026 10:43:12 -0600 Subject: [PATCH 5/5] Remove unnecessary requires --- x-pack/plugin/core/src/main/java/module-info.java | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/plugin/core/src/main/java/module-info.java b/x-pack/plugin/core/src/main/java/module-info.java index 3e2ae7117b5e6..ff116d2ce7d27 100644 --- a/x-pack/plugin/core/src/main/java/module-info.java +++ b/x-pack/plugin/core/src/main/java/module-info.java @@ -28,7 +28,6 @@ requires org.slf4j; requires com.ibm.icu; requires org.elasticsearch.exponentialhistogram; - requires org.elasticsearch.datastreams; exports org.elasticsearch.index.engine.frozen; exports org.elasticsearch.license;