Skip to content

Commit 5f256cc

Browse files
authored
Reduce use of deprecated Metadata builder method (#124292)
This removes all non-test usage of Metadata.Builder.put(IndexMetadata, boolean) 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.
1 parent da5ab57 commit 5f256cc

File tree

9 files changed

+135
-62
lines changed

9 files changed

+135
-62
lines changed

benchmarks/src/main/java/org/elasticsearch/benchmark/indices/resolution/IndexNameExpressionResolverBenchmark.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
import org.elasticsearch.cluster.metadata.DataStream;
1717
import org.elasticsearch.cluster.metadata.IndexMetadata;
1818
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
19-
import org.elasticsearch.cluster.metadata.Metadata;
19+
import org.elasticsearch.cluster.metadata.ProjectId;
20+
import org.elasticsearch.cluster.metadata.ProjectMetadata;
2021
import org.elasticsearch.cluster.project.DefaultProjectResolver;
2122
import org.elasticsearch.common.settings.Settings;
2223
import org.elasticsearch.common.util.concurrent.ThreadContext;
@@ -63,12 +64,12 @@ public void setUp() {
6364
int numDataStreams = toInt(params[0]);
6465
int numIndices = toInt(params[1]);
6566

66-
Metadata.Builder mb = Metadata.builder();
67+
ProjectMetadata.Builder pmb = ProjectMetadata.builder(ProjectId.DEFAULT);
6768
String[] indices = new String[numIndices + numDataStreams * (numIndices + 1)];
6869
int position = 0;
6970
for (int i = 1; i <= numIndices; i++) {
7071
String indexName = INDEX_PREFIX + i;
71-
createIndexMetadata(indexName, mb);
72+
createIndexMetadata(indexName, pmb);
7273
indices[position++] = indexName;
7374
}
7475

@@ -77,14 +78,14 @@ public void setUp() {
7778
List<Index> backingIndices = new ArrayList<>();
7879
for (int j = 1; j <= numIndices; j++) {
7980
String backingIndexName = DataStream.getDefaultBackingIndexName(dataStreamName, j);
80-
backingIndices.add(createIndexMetadata(backingIndexName, mb).getIndex());
81+
backingIndices.add(createIndexMetadata(backingIndexName, pmb).getIndex());
8182
indices[position++] = backingIndexName;
8283
}
8384
indices[position++] = dataStreamName;
84-
mb.put(DataStream.builder(dataStreamName, backingIndices).build());
85+
pmb.put(DataStream.builder(dataStreamName, backingIndices).build());
8586
}
8687
int mid = indices.length / 2;
87-
clusterState = ClusterState.builder(ClusterName.DEFAULT).metadata(mb).build();
88+
clusterState = ClusterState.builder(ClusterName.DEFAULT).putProjectMetadata(pmb).build();
8889
resolver = new IndexNameExpressionResolver(
8990
new ThreadContext(Settings.EMPTY),
9091
new SystemIndices(List.of()),
@@ -97,13 +98,13 @@ public void setUp() {
9798
mixedRequest = new Request(IndicesOptions.lenientExpandOpenHidden(), mixed);
9899
}
99100

100-
private IndexMetadata createIndexMetadata(String indexName, Metadata.Builder mb) {
101+
private IndexMetadata createIndexMetadata(String indexName, ProjectMetadata.Builder pmb) {
101102
IndexMetadata indexMetadata = IndexMetadata.builder(indexName)
102103
.settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, IndexVersion.current()))
103104
.numberOfShards(1)
104105
.numberOfReplicas(0)
105106
.build();
106-
mb.put(indexMetadata, false);
107+
pmb.put(indexMetadata, false);
107108
return indexMetadata;
108109
}
109110

benchmarks/src/main/java/org/elasticsearch/benchmark/routing/allocation/ShardsAvailabilityHealthIndicatorBenchmark.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
import org.elasticsearch.cluster.ClusterName;
1313
import org.elasticsearch.cluster.ClusterState;
1414
import org.elasticsearch.cluster.metadata.IndexMetadata;
15-
import org.elasticsearch.cluster.metadata.Metadata;
15+
import org.elasticsearch.cluster.metadata.ProjectId;
16+
import org.elasticsearch.cluster.metadata.ProjectMetadata;
1617
import org.elasticsearch.cluster.node.DiscoveryNodes;
1718
import org.elasticsearch.cluster.project.DefaultProjectResolver;
1819
import org.elasticsearch.cluster.routing.IndexRoutingTable;
@@ -96,7 +97,7 @@ public void setUp() throws Exception {
9697

9798
AllocationService allocationService = Allocators.createAllocationService(Settings.EMPTY);
9899

99-
Metadata.Builder mb = Metadata.builder();
100+
ProjectMetadata.Builder pmb = ProjectMetadata.builder(ProjectId.DEFAULT);
100101
RoutingTable.Builder rb = RoutingTable.builder();
101102

102103
DiscoveryNodes.Builder nb = DiscoveryNodes.builder();
@@ -160,12 +161,12 @@ public void setUp() throws Exception {
160161
}
161162

162163
routingTable.add(indexRountingTableBuilder);
163-
mb.put(indexMetadata, false);
164+
pmb.put(indexMetadata, false);
164165
}
165166

166167
ClusterState initialClusterState = ClusterState.builder(ClusterName.DEFAULT)
167-
.metadata(mb)
168-
.routingTable(routingTable)
168+
.putProjectMetadata(pmb)
169+
.putRoutingTable(pmb.getId(), routingTable.build())
169170
.nodes(nb)
170171
.build();
171172

server/src/main/java/org/elasticsearch/cluster/metadata/DataStream.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.elasticsearch.common.time.DateFormatter;
3636
import org.elasticsearch.common.time.DateFormatters;
3737
import org.elasticsearch.common.xcontent.XContentHelper;
38+
import org.elasticsearch.core.FixForMultiProject;
3839
import org.elasticsearch.core.Nullable;
3940
import org.elasticsearch.core.TimeValue;
4041
import org.elasticsearch.core.Tuple;
@@ -1010,7 +1011,28 @@ public DataStream promoteDataStream() {
10101011
* given indices
10111012
*/
10121013
@Nullable
1014+
@Deprecated
10131015
public DataStream snapshot(Set<String> indicesInSnapshot, Metadata.Builder snapshotMetadataBuilder) {
1016+
@FixForMultiProject
1017+
final ProjectId projectId = ProjectId.DEFAULT;
1018+
ProjectMetadata.Builder project = snapshotMetadataBuilder.getProject(projectId);
1019+
if (project == null) {
1020+
project = ProjectMetadata.builder(projectId);
1021+
snapshotMetadataBuilder.put(project);
1022+
}
1023+
return snapshot(indicesInSnapshot, project);
1024+
}
1025+
1026+
/**
1027+
* Reconciles this data stream with a list of indices available in a snapshot. Allows snapshots to store accurate data
1028+
* stream definitions that do not reference backing indices and failure indices not contained in the snapshot.
1029+
*
1030+
* @param indicesInSnapshot List of indices in the snapshot
1031+
* @param snapshotMetadataBuilder a project metadata builder with the current view of the snapshot metadata
1032+
* @return Reconciled {@link DataStream} instance or {@code null} if no reconciled version of this data stream could be built from the
1033+
* given indices
1034+
*/
1035+
public DataStream snapshot(Set<String> indicesInSnapshot, ProjectMetadata.Builder snapshotMetadataBuilder) {
10141036
boolean backingIndicesChanged = false;
10151037
boolean failureIndicesChanged = false;
10161038

@@ -1044,7 +1066,7 @@ public DataStream snapshot(Set<String> indicesInSnapshot, Metadata.Builder snaps
10441066
return builder.setMetadata(metadata == null ? null : new HashMap<>(metadata)).build();
10451067
}
10461068

1047-
private static boolean isAnyIndexMissing(List<Index> indices, Metadata.Builder builder, Set<String> indicesInSnapshot) {
1069+
private static boolean isAnyIndexMissing(List<Index> indices, ProjectMetadata.Builder builder, Set<String> indicesInSnapshot) {
10481070
for (Index index : indices) {
10491071
final String indexName = index.getName();
10501072
if (builder.get(indexName) == null || indicesInSnapshot.contains(indexName) == false) {

server/src/main/java/org/elasticsearch/cluster/metadata/Metadata.java

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import java.util.function.BiPredicate;
7171
import java.util.function.Consumer;
7272
import java.util.function.Function;
73+
import java.util.function.Supplier;
7374
import java.util.function.UnaryOperator;
7475

7576
import static org.elasticsearch.common.settings.Settings.readSettingsFromStream;
@@ -1300,6 +1301,8 @@ public static Metadata readFrom(StreamInput in) throws IOException {
13001301
builder.persistentSettings(readSettingsFromStream(in));
13011302
builder.hashesOfConsistentSettings(DiffableStringMap.readFrom(in));
13021303
if (in.getTransportVersion().before(TransportVersions.MULTI_PROJECT)) {
1304+
final ProjectMetadata.Builder projectBuilder = ProjectMetadata.builder(ProjectId.DEFAULT);
1305+
builder.put(projectBuilder);
13031306
final Function<String, MappingMetadata> mappingLookup;
13041307
final Map<String, MappingMetadata> mappingMetadataMap = in.readMapValues(MappingMetadata::new, MappingMetadata::getSha256);
13051308
if (mappingMetadataMap.isEmpty() == false) {
@@ -1309,11 +1312,11 @@ public static Metadata readFrom(StreamInput in) throws IOException {
13091312
}
13101313
int size = in.readVInt();
13111314
for (int i = 0; i < size; i++) {
1312-
builder.put(IndexMetadata.readFrom(in, mappingLookup), false);
1315+
projectBuilder.put(IndexMetadata.readFrom(in, mappingLookup), false);
13131316
}
13141317
size = in.readVInt();
13151318
for (int i = 0; i < size; i++) {
1316-
builder.put(IndexTemplateMetadata.readFrom(in));
1319+
projectBuilder.put(IndexTemplateMetadata.readFrom(in));
13171320
}
13181321
readBwcCustoms(in, builder);
13191322

@@ -1963,6 +1966,21 @@ public static Metadata fromXContent(XContentParser parser) throws IOException {
19631966
}
19641967
XContentParserUtils.ensureExpectedToken(XContentParser.Token.START_OBJECT, token, parser);
19651968

1969+
/**
1970+
* Used when reading BWC fields from when indices etc used to be directly on metadata
1971+
*/
1972+
final Supplier<ProjectMetadata.Builder> projectBuilderForBwc = () -> {
1973+
// Due to the way we handle repository metadata (we changed it from cluster scoped to project scoped)
1974+
// we may have cases where we have both project scoped XContent (with its own indices, customs etc)
1975+
// and also cluster scoped XContent that needs to be applied to the default project
1976+
// And, in this case there may be multiple projects even while we're applying BWC logic to the default project
1977+
ProjectMetadata.Builder pmb = builder.getProject(ProjectId.DEFAULT);
1978+
if (pmb == null) {
1979+
pmb = ProjectMetadata.builder(ProjectId.DEFAULT);
1980+
builder.put(pmb);
1981+
}
1982+
return pmb;
1983+
};
19661984
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
19671985
if (token == XContentParser.Token.FIELD_NAME) {
19681986
currentFieldName = parser.currentName();
@@ -1988,12 +2006,12 @@ public static Metadata fromXContent(XContentParser parser) throws IOException {
19882006
/* BwC Top-level project things */
19892007
case "indices" -> {
19902008
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
1991-
builder.put(IndexMetadata.Builder.fromXContent(parser), false);
2009+
projectBuilderForBwc.get().put(IndexMetadata.Builder.fromXContent(parser), false);
19922010
}
19932011
}
19942012
case "templates" -> {
19952013
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
1996-
builder.put(IndexTemplateMetadata.Builder.fromXContent(parser, parser.currentName()));
2014+
projectBuilderForBwc.get().put(IndexTemplateMetadata.Builder.fromXContent(parser, parser.currentName()));
19972015
}
19982016
}
19992017
/* Cluster customs (and project customs in older formats) */
@@ -2010,24 +2028,10 @@ public static Metadata fromXContent(XContentParser parser) throws IOException {
20102028
assert PersistentTasksCustomMetadata.TYPE.equals(name)
20112029
: name + " != " + PersistentTasksCustomMetadata.TYPE;
20122030
final var tuple = persistentTasksCustomMetadata.split();
2013-
builder.putProjectCustom(PersistentTasksCustomMetadata.TYPE, tuple.v2());
2031+
projectBuilderForBwc.get().putCustom(PersistentTasksCustomMetadata.TYPE, tuple.v2());
20142032
builder.putCustom(ClusterPersistentTasksCustomMetadata.TYPE, tuple.v1());
20152033
} else {
2016-
if (projectCustom instanceof RepositoriesMetadata repositoriesMetadata) {
2017-
// Repositories at the top level means it is either
2018-
// 1. Serialization from a single project for which we need to create the default project
2019-
// 2. Serialization before repositories metadata migration. In this case, the metadata may
2020-
// contain multiple projects, including the default project, which should be deserialized
2021-
// already with readProjects, i.e. no need to create the default project.
2022-
final ProjectMetadata.Builder defaultProjectBuilder = builder.getProject(ProjectId.DEFAULT);
2023-
if (defaultProjectBuilder == null) {
2024-
builder.putProjectCustom(name, projectCustom);
2025-
} else {
2026-
defaultProjectBuilder.putCustom(RepositoriesMetadata.TYPE, repositoriesMetadata);
2027-
}
2028-
} else {
2029-
builder.putProjectCustom(name, projectCustom);
2030-
}
2034+
projectBuilderForBwc.get().putCustom(name, projectCustom);
20312035
}
20322036
});
20332037
} else {

server/src/main/java/org/elasticsearch/cluster/metadata/SystemIndexMetadataUpgradeService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,12 +223,12 @@ public ClusterState execute(BatchExecutionContext<SystemIndexMetadataUpgradeTask
223223
}
224224

225225
if (updatedMetadata.isEmpty() == false || updatedDataStreams.isEmpty() == false) {
226-
Metadata.Builder builder = Metadata.builder(initialState.metadata());
226+
ProjectMetadata.Builder builder = ProjectMetadata.builder(initialState.metadata().getProject());
227227
updatedMetadata.forEach(idxMeta -> builder.put(idxMeta, true));
228228
updatedDataStreams.forEach(builder::put);
229229
updatedBackingIndices.forEach(idxMeta -> builder.put(idxMeta, true));
230230

231-
return ClusterState.builder(initialState).metadata(builder).build();
231+
return ClusterState.builder(initialState).putProjectMetadata(builder).build();
232232
}
233233
return initialState;
234234
}

server/src/main/java/org/elasticsearch/gateway/LocalAllocateDangledIndices.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import org.elasticsearch.cluster.block.ClusterBlocks;
2121
import org.elasticsearch.cluster.metadata.IndexMetadata;
2222
import org.elasticsearch.cluster.metadata.IndexMetadataVerifier;
23-
import org.elasticsearch.cluster.metadata.Metadata;
23+
import org.elasticsearch.cluster.metadata.ProjectMetadata;
2424
import org.elasticsearch.cluster.node.DiscoveryNode;
2525
import org.elasticsearch.cluster.routing.RoutingTable;
2626
import org.elasticsearch.cluster.routing.allocation.AllocationService;
@@ -118,7 +118,7 @@ public ClusterState execute(ClusterState currentState) {
118118
if (currentState.blocks().disableStatePersistence()) {
119119
return currentState;
120120
}
121-
Metadata.Builder metadata = Metadata.builder(currentState.metadata());
121+
ProjectMetadata.Builder project = ProjectMetadata.builder(currentState.metadata().getProject());
122122
ClusterBlocks.Builder blocks = ClusterBlocks.builder().blocks(currentState.blocks());
123123
RoutingTable.Builder routingTableBuilder = RoutingTable.builder(
124124
allocationService.getShardRoutingRoleStrategy(),
@@ -205,7 +205,7 @@ public ClusterState execute(ClusterState currentState) {
205205
.version(indexMetadata.getVersion() + 1)
206206
.build();
207207
}
208-
metadata.put(newIndexMetadata, false);
208+
project.put(newIndexMetadata, false);
209209
blocks.addBlocks(newIndexMetadata);
210210
if (newIndexMetadata.getState() == IndexMetadata.State.OPEN || isIndexVerifiedBeforeClosed(indexMetadata)) {
211211
routingTableBuilder.addAsFromDangling(newIndexMetadata);
@@ -220,7 +220,7 @@ public ClusterState execute(ClusterState currentState) {
220220

221221
RoutingTable routingTable = routingTableBuilder.build();
222222
ClusterState updatedState = ClusterState.builder(currentState)
223-
.metadata(metadata)
223+
.putProjectMetadata(project)
224224
.blocks(blocks)
225225
.routingTable(routingTable)
226226
.build();

server/src/main/java/org/elasticsearch/snapshots/RestoreService.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.elasticsearch.cluster.metadata.MetadataDataStreamsService;
3939
import org.elasticsearch.cluster.metadata.MetadataDeleteIndexService;
4040
import org.elasticsearch.cluster.metadata.MetadataIndexStateService;
41+
import org.elasticsearch.cluster.metadata.ProjectId;
4142
import org.elasticsearch.cluster.metadata.ProjectMetadata;
4243
import org.elasticsearch.cluster.metadata.RepositoryMetadata;
4344
import org.elasticsearch.cluster.node.DiscoveryNode;
@@ -64,6 +65,7 @@
6465
import org.elasticsearch.common.util.Maps;
6566
import org.elasticsearch.common.util.set.Sets;
6667
import org.elasticsearch.common.xcontent.XContentHelper;
68+
import org.elasticsearch.core.FixForMultiProject;
6769
import org.elasticsearch.core.Nullable;
6870
import org.elasticsearch.core.SuppressForbidden;
6971
import org.elasticsearch.core.Tuple;
@@ -480,14 +482,22 @@ private void startRestore(
480482
).flatMap(Collection::stream).distinct().toList();
481483

482484
final Set<String> explicitlyRequestedSystemIndices = new HashSet<>();
485+
486+
@FixForMultiProject
487+
final ProjectId projectId = ProjectId.DEFAULT;
488+
ProjectMetadata.Builder projectBuilder = metadataBuilder.getProject(projectId);
489+
if (projectBuilder == null) {
490+
projectBuilder = ProjectMetadata.builder(projectId);
491+
metadataBuilder.put(projectBuilder);
492+
}
483493
for (IndexId indexId : repositoryData.resolveIndices(requestedIndicesIncludingSystem).values()) {
484494
IndexMetadata snapshotIndexMetaData = repository.getSnapshotIndexMetaData(repositoryData, snapshotId, indexId);
485495
if (snapshotIndexMetaData.isSystem()) {
486496
if (requestIndices.contains(indexId.getName())) {
487497
explicitlyRequestedSystemIndices.add(indexId.getName());
488498
}
489499
}
490-
metadataBuilder.put(snapshotIndexMetaData, false);
500+
projectBuilder.put(snapshotIndexMetaData, false);
491501
}
492502

493503
assert explicitlyRequestedSystemIndices.size() == 0
@@ -1380,6 +1390,8 @@ public ClusterState execute(ClusterState currentState) {
13801390

13811391
// Updating cluster state
13821392
final Metadata.Builder mdBuilder = Metadata.builder(currentState.metadata());
1393+
@FixForMultiProject
1394+
final ProjectMetadata project = currentState.metadata().getProject();
13831395
final ClusterBlocks.Builder blocks = ClusterBlocks.builder().blocks(currentState.blocks());
13841396
final RoutingTable.Builder rtBuilder = RoutingTable.builder(
13851397
allocationService.getShardRoutingRoleStrategy(),
@@ -1481,7 +1493,7 @@ && isSystemIndex(snapshotIndexMetadata) == false) {
14811493
blocks.updateBlocks(updatedIndexMetadata);
14821494
}
14831495

1484-
mdBuilder.put(updatedIndexMetadata, true);
1496+
mdBuilder.getProject(project.id()).put(updatedIndexMetadata, true);
14851497
final Index renamedIndex = updatedIndexMetadata.getIndex();
14861498
for (int shard = 0; shard < snapshotIndexMetadata.getNumberOfShards(); shard++) {
14871499
shards.put(

0 commit comments

Comments
 (0)