Skip to content

Commit 7afd97e

Browse files
authored
Expose masterNodeTimeout to feature state reset impls (elastic#136802)
Resetting a feature state involves several master-node actions. Today these actions cannot access the timeout specified in the original REST request, so they must invent their own timeouts. In practice they all use the (trappy) default timeout of 30s, which may be too short for some situations. This commit adds the plumbing needed to pass the timeout from the REST request down to a place where it can be accessed by the individual implementations, and applies it to the delete-index requests. Relates elastic#107984
1 parent 9a6dba3 commit 7afd97e

File tree

10 files changed

+97
-28
lines changed

10 files changed

+97
-28
lines changed

modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/SystemDataStreamIT.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.elasticsearch.common.network.NetworkModule;
3737
import org.elasticsearch.common.settings.Settings;
3838
import org.elasticsearch.common.xcontent.XContentHelper;
39+
import org.elasticsearch.core.TimeValue;
3940
import org.elasticsearch.index.mapper.DateFieldMapper;
4041
import org.elasticsearch.index.mapper.extras.MapperExtrasPlugin;
4142
import org.elasticsearch.indices.ExecutorNames;
@@ -366,6 +367,7 @@ public void cleanup() {
366367
internalCluster().clusterService(),
367368
TestProjectResolvers.DEFAULT_PROJECT_ONLY,
368369
internalCluster().client(),
370+
TEST_REQUEST_TIMEOUT,
369371
stateStatusPlainActionFuture
370372
);
371373
stateStatusPlainActionFuture.actionGet();
@@ -446,6 +448,7 @@ public void cleanUpFeature(
446448
ClusterService clusterService,
447449
ProjectResolver projectResolver,
448450
Client client,
451+
TimeValue masterNodeTimeout,
449452
ActionListener<ResetFeatureStateStatus> listener
450453
) {
451454
Collection<SystemDataStreamDescriptor> dataStreamDescriptors = getSystemDataStreamDescriptors();
@@ -466,11 +469,23 @@ public void cleanUpFeature(
466469
DeleteDataStreamAction.INSTANCE,
467470
request,
468471
ActionListener.wrap(
469-
response -> SystemIndexPlugin.super.cleanUpFeature(clusterService, projectResolver, client, listener),
472+
response -> SystemIndexPlugin.super.cleanUpFeature(
473+
clusterService,
474+
projectResolver,
475+
client,
476+
masterNodeTimeout,
477+
listener
478+
),
470479
e -> {
471480
Throwable unwrapped = ExceptionsHelper.unwrapCause(e);
472481
if (unwrapped instanceof ResourceNotFoundException) {
473-
SystemIndexPlugin.super.cleanUpFeature(clusterService, projectResolver, client, listener);
482+
SystemIndexPlugin.super.cleanUpFeature(
483+
clusterService,
484+
projectResolver,
485+
client,
486+
masterNodeTimeout,
487+
listener
488+
);
474489
} else {
475490
listener.onFailure(e);
476491
}
@@ -480,7 +495,7 @@ public void cleanUpFeature(
480495
} catch (Exception e) {
481496
Throwable unwrapped = ExceptionsHelper.unwrapCause(e);
482497
if (unwrapped instanceof ResourceNotFoundException) {
483-
SystemIndexPlugin.super.cleanUpFeature(clusterService, projectResolver, client, listener);
498+
SystemIndexPlugin.super.cleanUpFeature(clusterService, projectResolver, client, masterNodeTimeout, listener);
484499
} else {
485500
listener.onFailure(e);
486501
}

modules/data-streams/src/internalClusterTest/java/org/elasticsearch/datastreams/lifecycle/CrudSystemDataStreamLifecycleIT.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ public void cleanup() {
183183
internalCluster().clusterService(),
184184
TestProjectResolvers.DEFAULT_PROJECT_ONLY,
185185
internalCluster().client(),
186+
TEST_REQUEST_TIMEOUT,
186187
stateStatusPlainActionFuture
187188
);
188189
stateStatusPlainActionFuture.actionGet();
@@ -241,6 +242,7 @@ public void cleanUpFeature(
241242
ClusterService clusterService,
242243
ProjectResolver projectResolver,
243244
Client client,
245+
TimeValue masterNodeTimeout,
244246
ActionListener<ResetFeatureStateStatus> listener
245247
) {
246248
Collection<SystemDataStreamDescriptor> dataStreamDescriptors = getSystemDataStreamDescriptors();
@@ -258,11 +260,23 @@ public void cleanUpFeature(
258260
DeleteDataStreamAction.INSTANCE,
259261
request,
260262
ActionListener.wrap(
261-
response -> SystemIndexPlugin.super.cleanUpFeature(clusterService, projectResolver, client, listener),
263+
response -> SystemIndexPlugin.super.cleanUpFeature(
264+
clusterService,
265+
projectResolver,
266+
client,
267+
masterNodeTimeout,
268+
listener
269+
),
262270
e -> {
263271
Throwable unwrapped = ExceptionsHelper.unwrapCause(e);
264272
if (unwrapped instanceof ResourceNotFoundException) {
265-
SystemIndexPlugin.super.cleanUpFeature(clusterService, projectResolver, client, listener);
273+
SystemIndexPlugin.super.cleanUpFeature(
274+
clusterService,
275+
projectResolver,
276+
client,
277+
masterNodeTimeout,
278+
listener
279+
);
266280
} else {
267281
listener.onFailure(e);
268282
}
@@ -272,7 +286,7 @@ public void cleanUpFeature(
272286
} catch (Exception e) {
273287
Throwable unwrapped = ExceptionsHelper.unwrapCause(e);
274288
if (unwrapped instanceof ResourceNotFoundException) {
275-
SystemIndexPlugin.super.cleanUpFeature(clusterService, projectResolver, client, listener);
289+
SystemIndexPlugin.super.cleanUpFeature(clusterService, projectResolver, client, masterNodeTimeout, listener);
276290
} else {
277291
listener.onFailure(e);
278292
}

server/src/internalClusterTest/java/org/elasticsearch/snapshots/FeatureStateResetApiIT.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.elasticsearch.cluster.project.ProjectResolver;
2020
import org.elasticsearch.cluster.service.ClusterService;
2121
import org.elasticsearch.common.settings.Settings;
22+
import org.elasticsearch.core.TimeValue;
2223
import org.elasticsearch.index.IndexNotFoundException;
2324
import org.elasticsearch.indices.AssociatedIndexDescriptor;
2425
import org.elasticsearch.indices.SystemIndexDescriptor;
@@ -220,6 +221,7 @@ public void cleanUpFeature(
220221
ClusterService clusterService,
221222
ProjectResolver projectResolver,
222223
Client client,
224+
TimeValue masterNodeTimeout,
223225
ActionListener<ResetFeatureStateResponse.ResetFeatureStateStatus> listener
224226
) {
225227
if (isEvil()) {

server/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/features/TransportResetFeatureStateAction.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,13 @@ protected void masterOperation(
8181
)
8282
) {
8383
for (final var feature : features) {
84-
feature.getCleanUpFunction().apply(clusterService, projectResolver, client, listeners.acquire(e -> {
85-
assert e != null : feature.getName();
86-
synchronized (responses) {
87-
responses.add(e);
88-
}
89-
}));
84+
feature.getCleanUpFunction()
85+
.apply(clusterService, projectResolver, client, request.masterNodeTimeout(), listeners.acquire(e -> {
86+
assert e != null : feature.getName();
87+
synchronized (responses) {
88+
responses.add(e);
89+
}
90+
}));
9091
}
9192
}
9293
}

server/src/main/java/org/elasticsearch/indices/SystemIndices.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.elasticsearch.core.CheckedConsumer;
3737
import org.elasticsearch.core.Nullable;
3838
import org.elasticsearch.core.Predicates;
39+
import org.elasticsearch.core.TimeValue;
3940
import org.elasticsearch.core.Tuple;
4041
import org.elasticsearch.core.UpdateForV10;
4142
import org.elasticsearch.index.Index;
@@ -751,7 +752,7 @@ public static void validateFeatureName(String name, String plugin) {
751752
* details about what constitutes a system feature.
752753
*
753754
* <p>This class has a static
754-
* {@link #cleanUpFeature(Collection, Collection, String, ClusterService, ProjectResolver, Client, ActionListener)} method
755+
* {@link #cleanUpFeature(Collection, Collection, String, ClusterService, ProjectResolver, Client, TimeValue, ActionListener)} method
755756
* that is the default implementation for resetting feature state.
756757
*/
757758
public static class Feature {
@@ -808,13 +809,14 @@ public Feature(String name, String description, Collection<SystemIndexDescriptor
808809
indexDescriptors,
809810
Collections.emptyList(),
810811
Collections.emptyList(),
811-
(clusterService, projectResolver, client, listener) -> cleanUpFeature(
812+
(clusterService, projectResolver, client, masterNodeTimeout, listener) -> cleanUpFeature(
812813
indexDescriptors,
813814
Collections.emptyList(),
814815
name,
815816
clusterService,
816817
projectResolver,
817818
client,
819+
masterNodeTimeout,
818820
listener
819821
),
820822
Feature::noopPreMigrationFunction,
@@ -841,13 +843,14 @@ public Feature(
841843
indexDescriptors,
842844
dataStreamDescriptors,
843845
Collections.emptyList(),
844-
(clusterService, projectResolver, client, listener) -> cleanUpFeature(
846+
(clusterService, projectResolver, client, masterNodeTimeout, listener) -> cleanUpFeature(
845847
indexDescriptors,
846848
Collections.emptyList(),
847849
name,
848850
clusterService,
849851
projectResolver,
850852
client,
853+
masterNodeTimeout,
851854
listener
852855
),
853856
Feature::noopPreMigrationFunction,
@@ -918,10 +921,12 @@ private static void cleanUpFeatureForIndices(
918921
String name,
919922
Client client,
920923
String[] indexNames,
924+
TimeValue masterNodeTimeout,
921925
final ActionListener<ResetFeatureStateStatus> listener
922926
) {
923927
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest();
924928
deleteIndexRequest.indices(indexNames);
929+
deleteIndexRequest.masterNodeTimeout(masterNodeTimeout);
925930
client.execute(TransportDeleteIndexAction.TYPE, deleteIndexRequest, new ActionListener<>() {
926931
@Override
927932
public void onResponse(AcknowledgedResponse acknowledgedResponse) {
@@ -944,6 +949,7 @@ public void onFailure(Exception e) {
944949
* @param clusterService A clusterService, for retrieving cluster metadata
945950
* @param projectResolver The project resolver
946951
* @param client A client, for issuing delete requests
952+
* @param masterNodeTimeout Timeout for tasks enqueued on the master node
947953
* @param listener A listener to return success or failure of cleanup
948954
*/
949955
public static void cleanUpFeature(
@@ -953,6 +959,7 @@ public static void cleanUpFeature(
953959
ClusterService clusterService,
954960
ProjectResolver projectResolver,
955961
Client client,
962+
TimeValue masterNodeTimeout,
956963
final ActionListener<ResetFeatureStateStatus> listener
957964
) {
958965
final ProjectMetadata project = projectResolver.getProjectMetadata(clusterService.state());
@@ -985,7 +992,7 @@ public static void cleanUpFeature(
985992
.flatMap(descriptor -> descriptor.getMatchingIndices(project).stream())
986993
.toArray(String[]::new);
987994
if (associatedIndices.length > 0) {
988-
cleanUpFeatureForIndices(name, client, associatedIndices, listeners.acquire(handleResponse));
995+
cleanUpFeatureForIndices(name, client, associatedIndices, masterNodeTimeout, listeners.acquire(handleResponse));
989996
}
990997

991998
// One descriptor at a time, create an originating client and clean up the feature
@@ -1000,6 +1007,7 @@ public static void cleanUpFeature(
10001007
name,
10011008
clientWithOrigin,
10021009
matchingIndices.toArray(Strings.EMPTY_ARRAY),
1010+
masterNodeTimeout,
10031011
listeners.acquire(handleResponse)
10041012
);
10051013
}
@@ -1044,6 +1052,7 @@ void apply(
10441052
ClusterService clusterService,
10451053
ProjectResolver projectResolver,
10461054
Client client,
1055+
TimeValue masterNodeTimeout,
10471056
ActionListener<ResetFeatureStateStatus> listener
10481057
);
10491058
}

server/src/main/java/org/elasticsearch/plugins/SystemIndexPlugin.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.elasticsearch.cluster.project.ProjectResolver;
1717
import org.elasticsearch.cluster.service.ClusterService;
1818
import org.elasticsearch.common.settings.Settings;
19+
import org.elasticsearch.core.TimeValue;
1920
import org.elasticsearch.indices.AssociatedIndexDescriptor;
2021
import org.elasticsearch.indices.SystemDataStreamDescriptor;
2122
import org.elasticsearch.indices.SystemIndexDescriptor;
@@ -42,9 +43,9 @@
4243
* <p>A SystemIndexPlugin may also specify “associated indices,” which hold plugin state in user space. These indices are not managed or
4344
* protected, but they are included in snapshots of the feature.
4445
*
45-
* <p>An implementation of SystemIndexPlugin may override {@link #cleanUpFeature(ClusterService, ProjectResolver, Client, ActionListener)}
46-
* in order to provide a “factory reset” of the plugin state. This can be useful for testing. The default method will simply retrieve a list
47-
* of system and associated indices and delete them.
46+
* <p>An implementation of SystemIndexPlugin may override {@link #cleanUpFeature(ClusterService, ProjectResolver, Client, TimeValue,
47+
* ActionListener)} in order to provide a “factory reset” of the plugin state. This can be useful for testing. The default method will
48+
* simply retrieve a list of system and associated indices and delete them.
4849
*
4950
* <p>An implementation may also override {@link #prepareForIndicesMigration(ProjectMetadata, Client, ActionListener)} and
5051
* {@link #indicesMigrationComplete(Map, Client, ActionListener)} in order to take special action before and after a
@@ -100,12 +101,14 @@ default Collection<AssociatedIndexDescriptor> getAssociatedIndexDescriptors() {
100101
* @param clusterService Cluster service to provide cluster state
101102
* @param projectResolver Project resolver
102103
* @param client A client, for executing actions
104+
* @param masterNodeTimeout Timeout for tasks enqueued on the master node
103105
* @param listener Listener for post-cleanup result
104106
*/
105107
default void cleanUpFeature(
106108
ClusterService clusterService,
107109
ProjectResolver projectResolver,
108110
Client client,
111+
TimeValue masterNodeTimeout,
109112
ActionListener<ResetFeatureStateResponse.ResetFeatureStateStatus> listener
110113
) {
111114
SystemIndices.Feature.cleanUpFeature(
@@ -115,6 +118,7 @@ default void cleanUpFeature(
115118
clusterService,
116119
projectResolver,
117120
client,
121+
masterNodeTimeout,
118122
listener
119123
);
120124
}

x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/LocalStateCompositeXPackPlugin.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.elasticsearch.common.util.PageCacheRecycler;
4242
import org.elasticsearch.common.util.concurrent.ThreadContext;
4343
import org.elasticsearch.core.IOUtils;
44+
import org.elasticsearch.core.TimeValue;
4445
import org.elasticsearch.env.Environment;
4546
import org.elasticsearch.features.NodeFeature;
4647
import org.elasticsearch.http.HttpPreRequest;
@@ -724,6 +725,7 @@ public void cleanUpFeature(
724725
ClusterService clusterService,
725726
ProjectResolver projectResolver,
726727
Client client,
728+
TimeValue masterNodeTimeout,
727729
ActionListener<ResetFeatureStateStatus> finalListener
728730
) {
729731
List<SystemIndexPlugin> systemPlugins = filterPlugins(SystemIndexPlugin.class);
@@ -741,7 +743,7 @@ public void cleanUpFeature(
741743
}
742744
})
743745
);
744-
systemPlugins.forEach(plugin -> plugin.cleanUpFeature(clusterService, projectResolver, client, allListeners));
746+
systemPlugins.forEach(plugin -> plugin.cleanUpFeature(clusterService, projectResolver, client, masterNodeTimeout, allListeners));
745747
}
746748

747749
@Override

x-pack/plugin/fleet/src/main/java/org/elasticsearch/xpack/fleet/Fleet.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ public void cleanUpFeature(
316316
ClusterService clusterService,
317317
ProjectResolver projectResolver,
318318
Client client,
319+
TimeValue masterNodeTimeout,
319320
ActionListener<ResetFeatureStateStatus> listener
320321
) {
321322
Collection<SystemDataStreamDescriptor> dataStreamDescriptors = getSystemDataStreamDescriptors();
@@ -335,11 +336,23 @@ public void cleanUpFeature(
335336
DeleteDataStreamAction.INSTANCE,
336337
request,
337338
ActionListener.wrap(
338-
response -> SystemIndexPlugin.super.cleanUpFeature(clusterService, projectResolver, client, listener),
339+
response -> SystemIndexPlugin.super.cleanUpFeature(
340+
clusterService,
341+
projectResolver,
342+
client,
343+
masterNodeTimeout,
344+
listener
345+
),
339346
e -> {
340347
Throwable unwrapped = ExceptionsHelper.unwrapCause(e);
341348
if (unwrapped instanceof ResourceNotFoundException) {
342-
SystemIndexPlugin.super.cleanUpFeature(clusterService, projectResolver, client, listener);
349+
SystemIndexPlugin.super.cleanUpFeature(
350+
clusterService,
351+
projectResolver,
352+
client,
353+
masterNodeTimeout,
354+
listener
355+
);
343356
} else {
344357
listener.onFailure(e);
345358
}
@@ -349,13 +362,13 @@ public void cleanUpFeature(
349362
} catch (Exception e) {
350363
Throwable unwrapped = ExceptionsHelper.unwrapCause(e);
351364
if (unwrapped instanceof ResourceNotFoundException) {
352-
SystemIndexPlugin.super.cleanUpFeature(clusterService, projectResolver, client, listener);
365+
SystemIndexPlugin.super.cleanUpFeature(clusterService, projectResolver, client, masterNodeTimeout, listener);
353366
} else {
354367
listener.onFailure(e);
355368
}
356369
}
357370
} else {
358-
SystemIndexPlugin.super.cleanUpFeature(clusterService, projectResolver, client, listener);
371+
SystemIndexPlugin.super.cleanUpFeature(clusterService, projectResolver, client, masterNodeTimeout, listener);
359372
}
360373
}
361374

0 commit comments

Comments
 (0)