Skip to content

Commit f5dc38c

Browse files
committed
Refactor IndexAbstraction to not use IndexMetadata
Most users of an `IndexAbstraction` instance doesn't need to use the `IndexMetadata` instances that `getIndices()` and `getWriteIndex()` returns. Cluster state variables/parameters can be used in places that access to `IndexMetadata` is required. By changing the `getIndices()` and `getWriteIndex()` methods to return `Index` instance, the indices lookup can be reused across different cluster states. This should be possible in cases that don't change an index hidden status or open and closes indices or when adding / removing aliases, data streams or indices. This change should allow for elastic#79004
1 parent 04e5823 commit f5dc38c

File tree

45 files changed

+254
-220
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+254
-220
lines changed

server/src/internalClusterTest/java/org/elasticsearch/aliases/IndexAliasesIT.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.elasticsearch.cluster.metadata.AliasMetadata;
2424
import org.elasticsearch.cluster.metadata.IndexAbstraction;
2525
import org.elasticsearch.cluster.metadata.IndexMetadata;
26+
import org.elasticsearch.cluster.metadata.Metadata;
2627
import org.elasticsearch.common.StopWatch;
2728
import org.elasticsearch.common.settings.Settings;
2829
import org.elasticsearch.core.TimeValue;
@@ -665,8 +666,9 @@ public void testSameAlias() {
665666
assertThat(stopWatch.stop().lastTaskTime().millis(), lessThan(timeout.millis()));
666667

667668
logger.info("--> verify that filter was updated");
668-
IndexAbstraction ia = internalCluster().clusterService().state().metadata().getIndicesLookup().get("alias1");
669-
AliasMetadata aliasMetadata = AliasMetadata.getFirstAliasMetadata(ia);
669+
Metadata metadata = internalCluster().clusterService().state().metadata();
670+
IndexAbstraction ia = metadata.getIndicesLookup().get("alias1");
671+
AliasMetadata aliasMetadata = AliasMetadata.getFirstAliasMetadata(metadata, ia);
670672
assertThat(aliasMetadata.getFilter().toString(), equalTo("{\"term\":{\"name\":{\"value\":\"bar\",\"boost\":1.0}}}"));
671673

672674
logger.info("--> deleting alias1");

server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.elasticsearch.common.io.stream.StreamOutput;
3333
import org.elasticsearch.common.io.stream.Writeable;
3434
import org.elasticsearch.common.util.concurrent.CountDown;
35+
import org.elasticsearch.index.Index;
3536
import org.elasticsearch.xcontent.ParseField;
3637
import org.elasticsearch.xcontent.ToXContentObject;
3738
import org.elasticsearch.xcontent.XContentBuilder;
@@ -504,7 +505,7 @@ static void resolveIndices(String[] names, IndicesOptions indicesOptions, Metada
504505
includeDataStreams);
505506
SortedMap<String, IndexAbstraction> lookup = metadata.getIndicesLookup();
506507
for (String s : resolvedIndexAbstractions) {
507-
enrichIndexAbstraction(s, lookup, indices, aliases, dataStreams);
508+
enrichIndexAbstraction(metadata, s, lookup, indices, aliases, dataStreams);
508509
}
509510
indices.sort(Comparator.comparing(ResolvedIndexAbstraction::getName));
510511
aliases.sort(Comparator.comparing(ResolvedIndexAbstraction::getName));
@@ -529,42 +530,41 @@ private static void mergeResults(Map<String, Response> remoteResponses, List<Res
529530
}
530531
}
531532

532-
private static void enrichIndexAbstraction(String indexAbstraction, SortedMap<String, IndexAbstraction> lookup,
533+
private static void enrichIndexAbstraction(Metadata metadata, String indexAbstraction, SortedMap<String, IndexAbstraction> lookup,
533534
List<ResolvedIndex> indices, List<ResolvedAlias> aliases,
534535
List<ResolvedDataStream> dataStreams) {
535536
IndexAbstraction ia = lookup.get(indexAbstraction);
536537
if (ia != null) {
537538
switch (ia.getType()) {
538539
case CONCRETE_INDEX:
539-
IndexAbstraction.Index index = (IndexAbstraction.Index) ia;
540-
541-
String[] aliasNames = index.getWriteIndex().getAliases().keySet().stream().sorted().toArray(String[]::new);
540+
IndexMetadata writeIndex = metadata.index(ia.getWriteIndex());
541+
String[] aliasNames = writeIndex.getAliases().keySet().stream().sorted().toArray(String[]::new);
542542

543543
List<String> attributes = new ArrayList<>();
544-
attributes.add(index.getWriteIndex().getState() == IndexMetadata.State.OPEN ? "open" : "closed");
544+
attributes.add(writeIndex.getState() == IndexMetadata.State.OPEN ? "open" : "closed");
545545
if (ia.isHidden()) {
546546
attributes.add("hidden");
547547
}
548-
final boolean isFrozen = Boolean.parseBoolean(ia.getWriteIndex().getSettings().get("index.frozen"));
548+
final boolean isFrozen = Boolean.parseBoolean(writeIndex.getSettings().get("index.frozen"));
549549
if (isFrozen) {
550550
attributes.add("frozen");
551551
}
552552
attributes.sort(String::compareTo);
553553

554554
indices.add(new ResolvedIndex(
555-
index.getName(),
555+
ia.getName(),
556556
aliasNames,
557557
attributes.toArray(Strings.EMPTY_ARRAY),
558-
index.getParentDataStream() == null ? null : index.getParentDataStream().getName()));
558+
ia.getParentDataStream() == null ? null : ia.getParentDataStream().getName()));
559559
break;
560560
case ALIAS:
561-
String[] indexNames = ia.getIndices().stream().map(i -> i.getIndex().getName()).toArray(String[]::new);
561+
String[] indexNames = ia.getIndices().stream().map(Index::getName).toArray(String[]::new);
562562
Arrays.sort(indexNames);
563563
aliases.add(new ResolvedAlias(ia.getName(), indexNames));
564564
break;
565565
case DATA_STREAM:
566566
IndexAbstraction.DataStream dataStream = (IndexAbstraction.DataStream) ia;
567-
String[] backingIndices = dataStream.getIndices().stream().map(i -> i.getIndex().getName()).toArray(String[]::new);
567+
String[] backingIndices = dataStream.getIndices().stream().map(Index::getName).toArray(String[]::new);
568568
dataStreams.add(new ResolvedDataStream(
569569
dataStream.getName(),
570570
backingIndices,

server/src/main/java/org/elasticsearch/action/admin/indices/rollover/MetadataRolloverService.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.elasticsearch.common.Strings;
2828
import org.elasticsearch.common.inject.Inject;
2929
import org.elasticsearch.common.settings.Settings;
30+
import org.elasticsearch.index.Index;
3031
import org.elasticsearch.indices.SystemDataStreamDescriptor;
3132
import org.elasticsearch.indices.SystemIndices;
3233
import org.elasticsearch.snapshots.SnapshotInProgressException;
@@ -126,7 +127,7 @@ public NameResolution resolveRolloverNames(ClusterState currentState, String rol
126127
final IndexAbstraction indexAbstraction = currentState.metadata().getIndicesLookup().get(rolloverTarget);
127128
switch (indexAbstraction.getType()) {
128129
case ALIAS:
129-
return resolveAliasRolloverNames((IndexAbstraction.Alias) indexAbstraction, newIndexName);
130+
return resolveAliasRolloverNames(currentState.metadata(), indexAbstraction, newIndexName);
130131
case DATA_STREAM:
131132
return resolveDataStreamRolloverNames(currentState.getMetadata(), (IndexAbstraction.DataStream) indexAbstraction);
132133
default:
@@ -148,8 +149,8 @@ public static class NameResolution {
148149
}
149150
}
150151

151-
private NameResolution resolveAliasRolloverNames(IndexAbstraction.Alias alias, String newIndexName) {
152-
final IndexMetadata writeIndex = alias.getWriteIndex();
152+
private NameResolution resolveAliasRolloverNames(Metadata metadata, IndexAbstraction alias, String newIndexName) {
153+
final IndexMetadata writeIndex = metadata.index(alias.getWriteIndex());
153154
final String sourceProvidedName = writeIndex.getSettings().get(IndexMetadata.SETTING_INDEX_PROVIDED_NAME,
154155
writeIndex.getIndex().getName());
155156
final String sourceIndexName = writeIndex.getIndex().getName();
@@ -162,20 +163,20 @@ private NameResolution resolveAliasRolloverNames(IndexAbstraction.Alias alias, S
162163

163164
private NameResolution resolveDataStreamRolloverNames(Metadata metadata, IndexAbstraction.DataStream dataStream) {
164165
final DataStream ds = dataStream.getDataStream();
165-
final IndexMetadata originalWriteIndex = dataStream.getWriteIndex();
166+
final IndexMetadata originalWriteIndex = metadata.index(dataStream.getWriteIndex());
166167
final DataStream rolledDataStream = ds.rollover(metadata, "uuid");
167168
return new NameResolution(originalWriteIndex.getIndex().getName(), null, rolledDataStream.getWriteIndex().getName());
168169
}
169170

170171
private RolloverResult rolloverAlias(ClusterState currentState, IndexAbstraction.Alias alias, String aliasName,
171172
String newIndexName, CreateIndexRequest createIndexRequest, List<Condition<?>> metConditions,
172173
boolean silent, boolean onlyValidate) throws Exception {
173-
final NameResolution names = resolveAliasRolloverNames(alias, newIndexName);
174+
final NameResolution names = resolveAliasRolloverNames(currentState.metadata(), alias, newIndexName);
174175
final String sourceIndexName = names.sourceName;
175176
final String rolloverIndexName = names.rolloverName;
176177
final String unresolvedName = names.unresolvedName;
177178
final Metadata metadata = currentState.metadata();
178-
final IndexMetadata writeIndex = alias.getWriteIndex();
179+
final IndexMetadata writeIndex = currentState.metadata().index(alias.getWriteIndex());
179180
final AliasMetadata aliasMetadata = writeIndex.getAliases().get(alias.getName());
180181
final boolean explicitWriteIndex = Boolean.TRUE.equals(aliasMetadata.writeIndex());
181182
final Boolean isHidden = IndexMetadata.INDEX_HIDDEN_SETTING.exists(createIndexRequest.settings()) ?
@@ -228,11 +229,11 @@ private RolloverResult rolloverDataStream(ClusterState currentState, IndexAbstra
228229
}
229230

230231
final DataStream ds = dataStream.getDataStream();
231-
final IndexMetadata originalWriteIndex = dataStream.getWriteIndex();
232+
final Index originalWriteIndex = dataStream.getWriteIndex();
232233
DataStream rolledDataStream = ds.rollover(currentState.metadata(), "uuid");
233234
createIndexService.validateIndexName(rolledDataStream.getWriteIndex().getName(), currentState); // fails if the index already exists
234235
if (onlyValidate) {
235-
return new RolloverResult(rolledDataStream.getWriteIndex().getName(), originalWriteIndex.getIndex().getName(), currentState);
236+
return new RolloverResult(rolledDataStream.getWriteIndex().getName(), originalWriteIndex.getName(), currentState);
236237
}
237238

238239
CreateIndexClusterStateUpdateRequest createIndexClusterStateRequest = prepareDataStreamCreateIndexRequest(
@@ -247,11 +248,11 @@ private RolloverResult rolloverDataStream(ClusterState currentState, IndexAbstra
247248
RolloverInfo rolloverInfo = new RolloverInfo(dataStreamName, metConditions, threadPool.absoluteTimeInMillis());
248249
newState = ClusterState.builder(newState)
249250
.metadata(Metadata.builder(newState.metadata())
250-
.put(IndexMetadata.builder(newState.metadata().index(originalWriteIndex.getIndex()))
251+
.put(IndexMetadata.builder(newState.metadata().index(originalWriteIndex))
251252
.putRolloverInfo(rolloverInfo)))
252253
.build();
253254

254-
return new RolloverResult(rolledDataStream.getWriteIndex().getName(), originalWriteIndex.getIndex().getName(), newState);
255+
return new RolloverResult(rolledDataStream.getWriteIndex().getName(), originalWriteIndex.getName(), newState);
255256
}
256257

257258
static String generateRolloverIndexName(String sourceIndexName, IndexNameExpressionResolver indexNameExpressionResolver) {

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,12 +225,13 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
225225
return builder;
226226
}
227227

228-
public static AliasMetadata getFirstAliasMetadata(IndexAbstraction ia) {
228+
public static AliasMetadata getFirstAliasMetadata(Metadata metadata, IndexAbstraction ia) {
229229
if (ia.getType() != IndexAbstraction.Type.ALIAS) {
230230
throw new IllegalArgumentException("unexpected type: [" + ia.getType() + "]");
231231
}
232232

233-
return ia.getIndices().get(0).getAliases().get(ia.getName());
233+
IndexMetadata firstIndex = metadata.index(ia.getIndices().get(0));
234+
return firstIndex.getAliases().get(ia.getName());
234235
}
235236

236237
public static class Builder {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ public DataStream addBackingIndex(Metadata clusterMetadata, Index index) {
281281
}
282282

283283
// ensure that no aliases reference index
284-
IndexMetadata im = clusterMetadata.getIndicesLookup().get(index.getName()).getWriteIndex();
284+
IndexMetadata im = clusterMetadata.index(clusterMetadata.getIndicesLookup().get(index.getName()).getWriteIndex());
285285
if (im.getAliases().size() > 0) {
286286
throw new IllegalArgumentException(
287287
String.format(Locale.ROOT,

0 commit comments

Comments
 (0)