Skip to content

Commit 7077ae2

Browse files
authored
Remove usages of Metadata.Builder#indexGraveyard (#129041)
And replace 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. Concerns both the getter and the setter.
1 parent 0850bd7 commit 7077ae2

File tree

7 files changed

+49
-42
lines changed

7 files changed

+49
-42
lines changed

server/src/main/java/org/elasticsearch/action/admin/indices/dangling/delete/TransportDeleteDanglingIndexAction.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import org.elasticsearch.cluster.block.ClusterBlockException;
3030
import org.elasticsearch.cluster.metadata.IndexGraveyard;
3131
import org.elasticsearch.cluster.metadata.IndexMetadata;
32-
import org.elasticsearch.cluster.metadata.Metadata;
32+
import org.elasticsearch.cluster.metadata.ProjectMetadata;
3333
import org.elasticsearch.cluster.service.ClusterService;
3434
import org.elasticsearch.common.settings.Settings;
3535
import org.elasticsearch.core.SuppressForbidden;
@@ -126,9 +126,9 @@ private void submitUnbatchedTask(@SuppressWarnings("SameParameterValue") String
126126
}
127127

128128
private ClusterState deleteDanglingIndex(ClusterState currentState, Index indexToDelete) {
129-
final Metadata metaData = currentState.getMetadata();
129+
final var project = currentState.metadata().getProject();
130130

131-
for (Map.Entry<String, IndexMetadata> each : metaData.getProject().indices().entrySet()) {
131+
for (Map.Entry<String, IndexMetadata> each : project.indices().entrySet()) {
132132
if (indexToDelete.getUUID().equals(each.getValue().getIndexUUID())) {
133133
throw new IllegalArgumentException(
134134
"Refusing to delete dangling index "
@@ -143,18 +143,13 @@ private ClusterState deleteDanglingIndex(ClusterState currentState, Index indexT
143143
// By definition, a dangling index is an index not present in the cluster state and with no tombstone,
144144
// so we shouldn't reach this point if these conditions aren't met. For super-safety, however, check
145145
// that a tombstone doesn't already exist for this index.
146-
if (metaData.getProject().indexGraveyard().containsIndex(indexToDelete)) {
146+
if (project.indexGraveyard().containsIndex(indexToDelete)) {
147147
return currentState;
148148
}
149149

150-
Metadata.Builder metaDataBuilder = Metadata.builder(metaData);
151-
152-
final IndexGraveyard newGraveyard = IndexGraveyard.builder(metaDataBuilder.indexGraveyard())
153-
.addTombstone(indexToDelete)
154-
.build(settings);
155-
metaDataBuilder.indexGraveyard(newGraveyard);
156-
157-
return ClusterState.builder(currentState).metadata(metaDataBuilder.build()).build();
150+
final IndexGraveyard newGraveyard = IndexGraveyard.builder(project.indexGraveyard()).addTombstone(indexToDelete).build(settings);
151+
final ProjectMetadata updatedProject = ProjectMetadata.builder(project).indexGraveyard(newGraveyard).build();
152+
return ClusterState.builder(currentState).putProjectMetadata(updatedProject).build();
158153
}
159154

160155
@Override

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1780,17 +1780,6 @@ public Builder removeReservedState(ReservedStateMetadata metadata) {
17801780
return this;
17811781
}
17821782

1783-
@Deprecated(forRemoval = true)
1784-
public Builder indexGraveyard(final IndexGraveyard indexGraveyard) {
1785-
getSingleProject().indexGraveyard(indexGraveyard);
1786-
return this;
1787-
}
1788-
1789-
@Deprecated(forRemoval = true)
1790-
public IndexGraveyard indexGraveyard() {
1791-
return getSingleProject().indexGraveyard();
1792-
}
1793-
17941783
@Deprecated(forRemoval = true)
17951784
public Builder updateSettings(Settings settings, String... indices) {
17961785
getSingleProject().updateSettings(settings, indices);

server/src/test/java/org/elasticsearch/cluster/ClusterChangedEventTests.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -702,20 +702,24 @@ private static ClusterState nextState(
702702
final ClusterState.Builder builder = ClusterState.builder(previousState);
703703
builder.stateUUID(UUIDs.randomBase64UUID());
704704
final Metadata.Builder metaBuilder = Metadata.builder(previousState.metadata());
705+
// The refactorings required to pass an explicit project ID to this method (and the state creation methods) is not worth it.
706+
final var previousProject = previousState.metadata().projects().values().iterator().next();
707+
final ProjectMetadata.Builder projectBuilder = ProjectMetadata.builder(previousProject);
705708
if (changeClusterUUID || addedIndices.size() > 0 || deletedIndices.size() > 0) {
706709
// there is some change in metadata cluster state
707710
if (changeClusterUUID) {
708711
metaBuilder.clusterUUID(UUIDs.randomBase64UUID());
709712
}
710713
for (Index index : addedIndices) {
711-
metaBuilder.put(createIndexMetadata(index), true);
714+
projectBuilder.put(createIndexMetadata(index), true);
712715
}
713716
for (Index index : deletedIndices) {
714-
metaBuilder.remove(index.getName());
715-
IndexGraveyard.Builder graveyardBuilder = IndexGraveyard.builder(metaBuilder.indexGraveyard());
717+
projectBuilder.remove(index.getName());
718+
IndexGraveyard.Builder graveyardBuilder = IndexGraveyard.builder(projectBuilder.indexGraveyard());
716719
graveyardBuilder.addTombstone(index);
717-
metaBuilder.indexGraveyard(graveyardBuilder.build());
720+
projectBuilder.indexGraveyard(graveyardBuilder.build());
718721
}
722+
metaBuilder.put(projectBuilder);
719723
builder.metadata(metaBuilder);
720724
}
721725
if (numNodesToRemove > 0) {

server/src/test/java/org/elasticsearch/cluster/coordination/ElasticsearchNodeCommandTests.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@
1313
import org.elasticsearch.cluster.metadata.IndexGraveyard;
1414
import org.elasticsearch.cluster.metadata.IndexMetadata;
1515
import org.elasticsearch.cluster.metadata.Metadata;
16+
import org.elasticsearch.cluster.metadata.ProjectId;
17+
import org.elasticsearch.cluster.metadata.ProjectMetadata;
1618
import org.elasticsearch.common.UUIDs;
1719
import org.elasticsearch.common.bytes.BytesReference;
20+
import org.elasticsearch.core.FixForMultiProject;
1821
import org.elasticsearch.index.Index;
1922
import org.elasticsearch.indices.IndicesModule;
2023
import org.elasticsearch.test.ESTestCase;
@@ -93,8 +96,8 @@ private void runLoadStateTest(boolean hasMissingCustoms, boolean preserveUnknown
9396
}
9497

9598
private Metadata randomMeta() {
96-
Metadata.Builder mdBuilder = Metadata.builder();
97-
mdBuilder.generateClusterUuidIfNeeded();
99+
@FixForMultiProject // Pass random project ID when usages are namespaced.
100+
ProjectMetadata.Builder projectBuilder = ProjectMetadata.builder(ProjectId.DEFAULT);
98101
int numDelIndices = randomIntBetween(0, 5);
99102
final IndexGraveyard.Builder graveyard = IndexGraveyard.builder();
100103
for (int i = 0; i < numDelIndices; i++) {
@@ -105,11 +108,11 @@ private Metadata randomMeta() {
105108
for (int i = 0; i < numDataStreams; i++) {
106109
String dataStreamName = "name" + 1;
107110
IndexMetadata backingIndex = createFirstBackingIndex(dataStreamName).build();
108-
mdBuilder.put(newInstance(dataStreamName, List.of(backingIndex.getIndex())));
111+
projectBuilder.put(newInstance(dataStreamName, List.of(backingIndex.getIndex())));
109112
}
110113
}
111-
mdBuilder.indexGraveyard(graveyard.build());
112-
return mdBuilder.build();
114+
projectBuilder.indexGraveyard(graveyard.build());
115+
return Metadata.builder().generateClusterUuidIfNeeded().put(projectBuilder).build();
113116
}
114117

115118
@Override

server/src/test/java/org/elasticsearch/cluster/metadata/MetadataTests.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.elasticsearch.common.util.set.Sets;
3535
import org.elasticsearch.common.xcontent.ChunkedToXContent;
3636
import org.elasticsearch.common.xcontent.XContentHelper;
37+
import org.elasticsearch.core.FixForMultiProject;
3738
import org.elasticsearch.core.Nullable;
3839
import org.elasticsearch.core.Predicates;
3940
import org.elasticsearch.core.SuppressForbidden;
@@ -607,27 +608,35 @@ public void testUnknownFieldIndexMetadata() throws IOException {
607608
}
608609

609610
public void testMetadataGlobalStateChangesOnIndexDeletions() {
611+
final var projectId = randomProjectIdOrDefault();
610612
IndexGraveyard.Builder builder = IndexGraveyard.builder();
611613
builder.addTombstone(new Index("idx1", UUIDs.randomBase64UUID()));
612-
final Metadata metadata1 = Metadata.builder().indexGraveyard(builder.build()).build();
613-
builder = IndexGraveyard.builder(metadata1.getProject().indexGraveyard());
614+
final Metadata metadata1 = Metadata.builder().put(ProjectMetadata.builder(projectId).indexGraveyard(builder.build())).build();
615+
builder = IndexGraveyard.builder(metadata1.getProject(projectId).indexGraveyard());
614616
builder.addTombstone(new Index("idx2", UUIDs.randomBase64UUID()));
615-
final Metadata metadata2 = Metadata.builder(metadata1).indexGraveyard(builder.build()).build();
617+
final Metadata metadata2 = Metadata.builder(metadata1)
618+
.put(ProjectMetadata.builder(metadata1.getProject(projectId)).indexGraveyard(builder.build()))
619+
.build();
616620
assertFalse("metadata not equal after adding index deletions", Metadata.isGlobalStateEquals(metadata1, metadata2));
617621
final Metadata metadata3 = Metadata.builder(metadata2).build();
618622
assertTrue("metadata equal when not adding index deletions", Metadata.isGlobalStateEquals(metadata2, metadata3));
619623
}
620624

621625
public void testXContentWithIndexGraveyard() throws IOException {
626+
@FixForMultiProject // XContent serialization and parsing with a random project ID currently only works when serializing in MP mode
627+
final var projectId = ProjectId.DEFAULT;
622628
final IndexGraveyard graveyard = IndexGraveyardTests.createRandom();
623-
final Metadata originalMeta = Metadata.builder().indexGraveyard(graveyard).build();
629+
final Metadata originalMeta = Metadata.builder().put(ProjectMetadata.builder(projectId).indexGraveyard(graveyard)).build();
624630
final XContentBuilder builder = JsonXContent.contentBuilder();
625631
builder.startObject();
626632
Metadata.FORMAT.toXContent(builder, originalMeta);
627633
builder.endObject();
628634
try (XContentParser parser = createParser(JsonXContent.jsonXContent, BytesReference.bytes(builder))) {
629635
final Metadata fromXContentMeta = Metadata.fromXContent(parser);
630-
assertThat(fromXContentMeta.getProject().indexGraveyard(), equalTo(originalMeta.getProject().indexGraveyard()));
636+
assertThat(
637+
fromXContentMeta.getProject(projectId).indexGraveyard(),
638+
equalTo(originalMeta.getProject(projectId).indexGraveyard())
639+
);
631640
}
632641
}
633642

@@ -975,15 +984,16 @@ public void testGlobalStateEqualsCoordinationMetadata() {
975984
}
976985

977986
public void testSerializationWithIndexGraveyard() throws IOException {
987+
final var projectId = randomProjectIdOrDefault();
978988
final IndexGraveyard graveyard = IndexGraveyardTests.createRandom();
979-
final Metadata originalMeta = Metadata.builder().indexGraveyard(graveyard).build();
989+
final Metadata originalMeta = Metadata.builder().put(ProjectMetadata.builder(projectId).indexGraveyard(graveyard)).build();
980990
final BytesStreamOutput out = new BytesStreamOutput();
981991
originalMeta.writeTo(out);
982992
NamedWriteableRegistry namedWriteableRegistry = new NamedWriteableRegistry(ClusterModule.getNamedWriteables());
983993
final Metadata fromStreamMeta = Metadata.readFrom(
984994
new NamedWriteableAwareStreamInput(out.bytes().streamInput(), namedWriteableRegistry)
985995
);
986-
assertThat(fromStreamMeta.getProject().indexGraveyard(), equalTo(fromStreamMeta.getProject().indexGraveyard()));
996+
assertThat(fromStreamMeta.getProject(projectId).indexGraveyard(), equalTo(originalMeta.getProject(projectId).indexGraveyard()));
987997
}
988998

989999
public void testFindMappings() throws IOException {

server/src/test/java/org/elasticsearch/gateway/DanglingIndicesStateTests.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@
1313
import org.elasticsearch.cluster.metadata.IndexGraveyard;
1414
import org.elasticsearch.cluster.metadata.IndexMetadata;
1515
import org.elasticsearch.cluster.metadata.Metadata;
16+
import org.elasticsearch.cluster.metadata.ProjectId;
17+
import org.elasticsearch.cluster.metadata.ProjectMetadata;
1618
import org.elasticsearch.cluster.service.ClusterService;
1719
import org.elasticsearch.common.settings.Settings;
20+
import org.elasticsearch.core.FixForMultiProject;
1821
import org.elasticsearch.env.NodeEnvironment;
1922
import org.elasticsearch.index.Index;
2023
import org.elasticsearch.index.IndexVersion;
@@ -85,7 +88,8 @@ public void testDanglingIndicesNotReportedWhenTombstonePresent() throws Exceptio
8588
MetaStateWriterUtils.writeIndex(env, "test_write", dangledIndex);
8689

8790
final IndexGraveyard graveyard = IndexGraveyard.builder().addTombstone(dangledIndex.getIndex()).build();
88-
final Metadata metadata = Metadata.builder().indexGraveyard(graveyard).build();
91+
@FixForMultiProject // Use random project ID
92+
final Metadata metadata = Metadata.builder().put(ProjectMetadata.builder(ProjectId.DEFAULT).indexGraveyard(graveyard)).build();
8993

9094
DanglingIndicesState danglingState = createDanglingIndicesState(metaStateService, metadata);
9195

server/src/test/java/org/elasticsearch/indices/IndicesServiceTests.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.elasticsearch.common.settings.Setting;
3434
import org.elasticsearch.common.settings.Settings;
3535
import org.elasticsearch.common.util.concurrent.EsExecutors;
36+
import org.elasticsearch.core.FixForMultiProject;
3637
import org.elasticsearch.core.TimeValue;
3738
import org.elasticsearch.env.NodeEnvironment;
3839
import org.elasticsearch.env.ShardLockObtainFailedException;
@@ -546,8 +547,9 @@ public void testIndexAndTombstoneWithSameNameOnStartup() throws Exception {
546547
.build();
547548
final Index tombstonedIndex = new Index(indexName, UUIDs.randomBase64UUID());
548549
final IndexGraveyard graveyard = IndexGraveyard.builder().addTombstone(tombstonedIndex).build();
549-
final Metadata metadata = Metadata.builder().put(indexMetadata, true).indexGraveyard(graveyard).build();
550-
final ClusterState clusterState = new ClusterState.Builder(new ClusterName("testCluster")).metadata(metadata).build();
550+
@FixForMultiProject // Use random project-id
551+
final var project = ProjectMetadata.builder(ProjectId.DEFAULT).put(indexMetadata, true).indexGraveyard(graveyard).build();
552+
final ClusterState clusterState = new ClusterState.Builder(new ClusterName("testCluster")).putProjectMetadata(project).build();
551553
// if all goes well, this won't throw an exception, otherwise, it will throw an IllegalStateException
552554
indicesService.verifyIndexIsDeleted(tombstonedIndex, clusterState);
553555
}

0 commit comments

Comments
 (0)