Skip to content

Commit 149f161

Browse files
authored
[8.18] Bug Fix: System Data Streams Should Be Restorable (elastic#124651) (elastic#124912)
* Bug Fix: System Data Streams Should Be Restorable (elastic#124651) This PR adds a new MetadataDeleteDataStreamService that allows us to delete system data streams prior to a restore operation. This fixes a bug where system data streams were previously un-restorable. (cherry picked from commit cb3c357) # Conflicts: # modules/data-streams/src/main/java/org/elasticsearch/datastreams/action/DeleteDataStreamTransportAction.java # server/src/main/java/org/elasticsearch/snapshots/RestoreService.java # server/src/test/java/org/elasticsearch/cluster/metadata/MetadataDataStreamsServiceTests.java * Fix test bug, mute test
1 parent 7cef9a0 commit 149f161

File tree

8 files changed

+640
-77
lines changed

8 files changed

+640
-77
lines changed

docs/changelog/124651.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 124651
2+
summary: "Fix system data streams to be restorable from a snapshot"
3+
area: Infra/Core
4+
type: bug
5+
issues: [89261]

modules/data-streams/src/main/java/org/elasticsearch/datastreams/action/DeleteDataStreamTransportAction.java

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,16 @@
2020
import org.elasticsearch.cluster.ClusterStateUpdateTask;
2121
import org.elasticsearch.cluster.block.ClusterBlockException;
2222
import org.elasticsearch.cluster.block.ClusterBlockLevel;
23-
import org.elasticsearch.cluster.metadata.DataStream;
2423
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
25-
import org.elasticsearch.cluster.metadata.Metadata;
26-
import org.elasticsearch.cluster.metadata.MetadataDeleteIndexService;
24+
import org.elasticsearch.cluster.metadata.MetadataDataStreamsService;
2725
import org.elasticsearch.cluster.service.ClusterService;
2826
import org.elasticsearch.common.Priority;
2927
import org.elasticsearch.common.Strings;
3028
import org.elasticsearch.common.settings.Settings;
3129
import org.elasticsearch.common.util.concurrent.EsExecutors;
3230
import org.elasticsearch.core.SuppressForbidden;
33-
import org.elasticsearch.index.Index;
3431
import org.elasticsearch.indices.SystemIndices;
3532
import org.elasticsearch.injection.guice.Inject;
36-
import org.elasticsearch.snapshots.SnapshotInProgressException;
37-
import org.elasticsearch.snapshots.SnapshotsService;
3833
import org.elasticsearch.tasks.Task;
3934
import org.elasticsearch.threadpool.ThreadPool;
4035
import org.elasticsearch.transport.TransportService;
@@ -44,6 +39,7 @@
4439
import java.util.List;
4540
import java.util.Set;
4641
import java.util.function.Consumer;
42+
import java.util.stream.Collectors;
4743

4844
import static org.elasticsearch.action.datastreams.DataStreamsActionUtil.getDataStreamNames;
4945

@@ -134,7 +130,6 @@ static ClusterState removeDataStream(
134130
for (String dataStreamName : dataStreams) {
135131
systemDataStreamAccessValidator.accept(dataStreamName);
136132
}
137-
Set<String> snapshottingDataStreams = SnapshotsService.snapshottingDataStreams(currentState, dataStreams);
138133

139134
if (dataStreams.isEmpty()) {
140135
if (request.isWildcardExpressionsOriginallySpecified()) {
@@ -144,33 +139,11 @@ static ClusterState removeDataStream(
144139
}
145140
}
146141

147-
if (snapshottingDataStreams.isEmpty() == false) {
148-
throw new SnapshotInProgressException(
149-
"Cannot delete data streams that are being snapshotted: "
150-
+ snapshottingDataStreams
151-
+ ". Try again after snapshot finishes or cancel the currently running snapshot."
152-
);
153-
}
154-
155-
Set<Index> backingIndicesToRemove = new HashSet<>();
156-
for (String dataStreamName : dataStreams) {
157-
DataStream dataStream = currentState.metadata().dataStreams().get(dataStreamName);
158-
assert dataStream != null;
159-
backingIndicesToRemove.addAll(dataStream.getIndices());
160-
backingIndicesToRemove.addAll(dataStream.getFailureIndices());
161-
}
162-
163-
// first delete the data streams and then the indices:
164-
// (this to avoid data stream validation from failing when deleting an index that is part of a data stream
165-
// without updating the data stream)
166-
// TODO: change order when delete index api also updates the data stream the index to be removed is member of
167-
Metadata.Builder metadata = Metadata.builder(currentState.metadata());
168-
for (String ds : dataStreams) {
169-
LOGGER.info("removing data stream [{}]", ds);
170-
metadata.removeDataStream(ds);
171-
}
172-
currentState = ClusterState.builder(currentState).metadata(metadata).build();
173-
return MetadataDeleteIndexService.deleteIndices(currentState, backingIndicesToRemove, settings);
142+
return MetadataDataStreamsService.deleteDataStreams(
143+
currentState,
144+
dataStreams.stream().map(currentState.metadata().dataStreams()::get).collect(Collectors.toSet()),
145+
settings
146+
);
174147
}
175148

176149
@Override

server/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ dependencies {
8282
}
8383
internalClusterTestImplementation(project(':modules:reindex'))
8484
internalClusterTestImplementation(project(':modules:mapper-extras'))
85+
internalClusterTestImplementation(project(':modules:data-streams'))
8586
}
8687

8788
spotless {

server/src/internalClusterTest/java/org/elasticsearch/action/admin/indices/create/AutoCreateSystemIndexIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.elasticsearch.indices.TestSystemIndexPlugin;
2929
import org.elasticsearch.plugins.Plugin;
3030
import org.elasticsearch.plugins.SystemIndexPlugin;
31-
import org.elasticsearch.snapshots.SystemIndicesSnapshotIT;
31+
import org.elasticsearch.snapshots.SystemResourceSnapshotIT;
3232
import org.elasticsearch.test.ESIntegTestCase;
3333
import org.elasticsearch.xcontent.XContentType;
3434
import org.junit.After;
@@ -298,7 +298,7 @@ public Collection<SystemIndexDescriptor> getSystemIndexDescriptors(Settings sett
298298

299299
@Override
300300
public String getFeatureName() {
301-
return SystemIndicesSnapshotIT.SystemIndexTestPlugin.class.getSimpleName();
301+
return SystemResourceSnapshotIT.SystemIndexTestPlugin.class.getSimpleName();
302302
}
303303

304304
@Override

0 commit comments

Comments
 (0)