Skip to content

Commit 27dfc58

Browse files
authored
Take include_aliases flag into account when restoring data stream aliases (#73595)
Take RestoreSnapshotRequest#includeAliases() into account when restoring data stream aliases from a snapshot into a cluster. Relates to #66163
1 parent 6b2322f commit 27dfc58

File tree

2 files changed

+63
-18
lines changed

2 files changed

+63
-18
lines changed

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

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ private void startRestore(SnapshotInfo snapshotInfo,
310310

311311
// Get data stream metadata for requested data streams
312312
Tuple<Map<String, DataStream>, Map<String, DataStreamAlias>> result =
313-
getDataStreamsToRestore(repository, snapshotId, snapshotInfo, globalMetadata, requestIndices);
313+
getDataStreamsToRestore(repository, snapshotId, snapshotInfo, globalMetadata, requestIndices, request.includeAliases());
314314
Map<String, DataStream> dataStreamsToRestore = result.v1();
315315
Map<String, DataStreamAlias> dataStreamAliasesToRestore = result.v2();
316316

@@ -442,40 +442,44 @@ private Tuple<Map<String, DataStream>, Map<String, DataStreamAlias>> getDataStre
442442
SnapshotId snapshotId,
443443
SnapshotInfo snapshotInfo,
444444
Metadata globalMetadata,
445-
List<String> requestIndices) {
445+
List<String> requestIndices,
446+
boolean includeAliases) {
446447
Map<String, DataStream> dataStreams;
447448
Map<String, DataStreamAlias> dataStreamAliases;
448449
List<String> requestedDataStreams = filterIndices(snapshotInfo.dataStreams(), requestIndices.toArray(String[]::new),
449450
IndicesOptions.fromOptions(true, true, true, true));
450451
if (requestedDataStreams.isEmpty()) {
451-
dataStreams = Collections.emptyMap();
452-
dataStreamAliases = Collections.emptyMap();
452+
dataStreams = Map.of();
453+
dataStreamAliases = Map.of();
453454
} else {
454455
if (globalMetadata == null) {
455456
globalMetadata = repository.getSnapshotGlobalMetadata(snapshotId);
456457
}
457458
final Map<String, DataStream> dataStreamsInSnapshot = globalMetadata.dataStreams();
458-
final Map<String, DataStreamAlias> dataStreamAliasesInSnapshot = globalMetadata.dataStreamAliases();
459459
dataStreams = new HashMap<>(requestedDataStreams.size());
460-
dataStreamAliases = new HashMap<>();
461460
for (String requestedDataStream : requestedDataStreams) {
462461
final DataStream dataStreamInSnapshot = dataStreamsInSnapshot.get(requestedDataStream);
463462
assert dataStreamInSnapshot != null : "DataStream [" + requestedDataStream + "] not found in snapshot";
464463
dataStreams.put(requestedDataStream, dataStreamInSnapshot);
465-
466464
}
467-
for (DataStreamAlias alias : dataStreamAliasesInSnapshot.values()) {
468-
List<String> intersectingDataStreams = alias.getDataStreams().stream()
469-
.filter(requestedDataStreams::contains)
470-
.collect(Collectors.toList());
471-
String writeDateStream = alias.getWriteDataStream();
472-
if (intersectingDataStreams.contains(writeDateStream) == false) {
473-
writeDateStream = null;
474-
}
475-
if (intersectingDataStreams.isEmpty() == false) {
476-
DataStreamAlias copy = new DataStreamAlias(alias.getName(), intersectingDataStreams, writeDateStream);
477-
dataStreamAliases.put(alias.getName(), copy);
465+
if (includeAliases) {
466+
dataStreamAliases = new HashMap<>();
467+
final Map<String, DataStreamAlias> dataStreamAliasesInSnapshot = globalMetadata.dataStreamAliases();
468+
for (DataStreamAlias alias : dataStreamAliasesInSnapshot.values()) {
469+
List<String> intersectingDataStreams = alias.getDataStreams().stream()
470+
.filter(requestedDataStreams::contains)
471+
.collect(Collectors.toList());
472+
String writeDateStream = alias.getWriteDataStream();
473+
if (intersectingDataStreams.contains(writeDateStream) == false) {
474+
writeDateStream = null;
475+
}
476+
if (intersectingDataStreams.isEmpty() == false) {
477+
DataStreamAlias copy = new DataStreamAlias(alias.getName(), intersectingDataStreams, writeDateStream);
478+
dataStreamAliases.put(alias.getName(), copy);
479+
}
478480
}
481+
} else {
482+
dataStreamAliases = Map.of();
479483
}
480484
}
481485
return new Tuple<>(dataStreams, dataStreamAliases);

x-pack/plugin/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/DataStreamsSnapshotsIT.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import java.util.stream.Collectors;
5858

5959
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
60+
import static org.hamcrest.Matchers.anEmptyMap;
6061
import static org.hamcrest.Matchers.contains;
6162
import static org.hamcrest.Matchers.containsInAnyOrder;
6263
import static org.hamcrest.Matchers.containsString;
@@ -469,6 +470,46 @@ public void testSnapshotAndRestoreAll() throws Exception {
469470
assertAcked(client().execute(DeleteDataStreamAction.INSTANCE, new DeleteDataStreamAction.Request(new String[] { "ds" })).get());
470471
}
471472

473+
public void testSnapshotAndRestoreIncludeAliasesFalse() throws Exception {
474+
CreateSnapshotRequest createSnapshotRequest = new CreateSnapshotRequest(REPO, SNAPSHOT);
475+
createSnapshotRequest.waitForCompletion(true);
476+
createSnapshotRequest.includeGlobalState(false);
477+
CreateSnapshotResponse createSnapshotResponse = client.admin().cluster().createSnapshot(createSnapshotRequest).actionGet();
478+
479+
RestStatus status = createSnapshotResponse.getSnapshotInfo().status();
480+
assertEquals(RestStatus.OK, status);
481+
assertThat(getSnapshot(REPO, SNAPSHOT).indices(), containsInAnyOrder(dsBackingIndexName, otherDsBackingIndexName));
482+
483+
assertAcked(client.execute(DeleteDataStreamAction.INSTANCE, new DeleteDataStreamAction.Request(new String[] { "*" })).get());
484+
assertAcked(client.admin().indices().prepareDelete("*").setIndicesOptions(IndicesOptions.LENIENT_EXPAND_OPEN_CLOSED_HIDDEN));
485+
486+
RestoreSnapshotRequest restoreSnapshotRequest = new RestoreSnapshotRequest(REPO, SNAPSHOT);
487+
restoreSnapshotRequest.waitForCompletion(true);
488+
restoreSnapshotRequest.includeGlobalState(true);
489+
restoreSnapshotRequest.includeAliases(false);
490+
RestoreSnapshotResponse restoreSnapshotResponse = client.admin().cluster().restoreSnapshot(restoreSnapshotRequest).actionGet();
491+
assertEquals(2, restoreSnapshotResponse.getRestoreInfo().successfulShards());
492+
493+
assertEquals(DOCUMENT_SOURCE, client.prepareGet(dsBackingIndexName, id).get().getSourceAsMap());
494+
SearchHit[] hits = client.prepareSearch("ds").get().getHits().getHits();
495+
assertEquals(1, hits.length);
496+
assertEquals(DOCUMENT_SOURCE, hits[0].getSourceAsMap());
497+
498+
GetDataStreamAction.Response ds = client.execute(
499+
GetDataStreamAction.INSTANCE,
500+
new GetDataStreamAction.Request(new String[] { "*" })
501+
).get();
502+
assertEquals(2, ds.getDataStreams().size());
503+
assertEquals(1, ds.getDataStreams().get(0).getDataStream().getIndices().size());
504+
assertEquals(dsBackingIndexName, ds.getDataStreams().get(0).getDataStream().getIndices().get(0).getName());
505+
assertEquals(1, ds.getDataStreams().get(1).getDataStream().getIndices().size());
506+
assertEquals(otherDsBackingIndexName, ds.getDataStreams().get(1).getDataStream().getIndices().get(0).getName());
507+
508+
GetAliasesResponse getAliasesResponse = client.admin().indices().getAliases(new GetAliasesRequest("*")).actionGet();
509+
assertThat(getAliasesResponse.getDataStreamAliases(), anEmptyMap());
510+
assertAcked(client().execute(DeleteDataStreamAction.INSTANCE, new DeleteDataStreamAction.Request(new String[] { "ds" })).get());
511+
}
512+
472513
public void testRename() throws Exception {
473514
CreateSnapshotResponse createSnapshotResponse = client.admin()
474515
.cluster()

0 commit comments

Comments
 (0)