diff --git a/docs/changelog/97248.yaml b/docs/changelog/97248.yaml new file mode 100644 index 0000000000000..c81f515c97105 --- /dev/null +++ b/docs/changelog/97248.yaml @@ -0,0 +1,6 @@ +pr: 97248 +summary: Move get lifecycle API to Management thread pool and make cancellable +area: ILM+SLM +type: enhancement +issues: + - 96568 diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/action/GetLifecycleAction.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/action/GetLifecycleAction.java index fb082b75212e9..df163ee97d19a 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/action/GetLifecycleAction.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/action/GetLifecycleAction.java @@ -16,6 +16,9 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; +import org.elasticsearch.tasks.CancellableTask; +import org.elasticsearch.tasks.Task; +import org.elasticsearch.tasks.TaskId; import org.elasticsearch.xcontent.ToXContentObject; import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xpack.core.ilm.LifecyclePolicy; @@ -23,6 +26,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.Objects; public class GetLifecycleAction extends ActionType { @@ -113,6 +117,11 @@ public Request() { policyNames = Strings.EMPTY_ARRAY; } + @Override + public Task createTask(long id, String type, String action, TaskId parentTaskId, Map headers) { + return new CancellableTask(id, type, action, "get-lifecycle-task", parentTaskId, headers); + } + public String[] getPolicyNames() { return policyNames; } diff --git a/x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/ilm/action/RestGetLifecycleAction.java b/x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/ilm/action/RestGetLifecycleAction.java index d61c5a24b1fd4..23a01ec834ddc 100644 --- a/x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/ilm/action/RestGetLifecycleAction.java +++ b/x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/ilm/action/RestGetLifecycleAction.java @@ -11,6 +11,7 @@ import org.elasticsearch.common.Strings; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestRequest; +import org.elasticsearch.rest.action.RestCancellableNodeClient; import org.elasticsearch.rest.action.RestToXContentListener; import org.elasticsearch.xpack.core.ilm.action.GetLifecycleAction; @@ -37,6 +38,10 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient getLifecycleRequest.timeout(restRequest.paramAsTime("timeout", getLifecycleRequest.timeout())); getLifecycleRequest.masterNodeTimeout(restRequest.paramAsTime("master_timeout", getLifecycleRequest.masterNodeTimeout())); - return channel -> client.execute(GetLifecycleAction.INSTANCE, getLifecycleRequest, new RestToXContentListener<>(channel)); + return channel -> new RestCancellableNodeClient(client, restRequest.getHttpChannel()).execute( + GetLifecycleAction.INSTANCE, + getLifecycleRequest, + new RestToXContentListener<>(channel) + ); } } diff --git a/x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/ilm/action/TransportGetLifecycleAction.java b/x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/ilm/action/TransportGetLifecycleAction.java index 73e4ee94d676f..59715e1584515 100644 --- a/x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/ilm/action/TransportGetLifecycleAction.java +++ b/x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/ilm/action/TransportGetLifecycleAction.java @@ -18,6 +18,7 @@ import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.regex.Regex; +import org.elasticsearch.tasks.CancellableTask; import org.elasticsearch.tasks.Task; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.transport.TransportService; @@ -55,12 +56,18 @@ public TransportGetLifecycleAction( Request::new, indexNameExpressionResolver, Response::new, - ThreadPool.Names.SAME + ThreadPool.Names.MANAGEMENT ); } @Override protected void masterOperation(Task task, Request request, ClusterState state, ActionListener listener) { + assert task instanceof CancellableTask : "get lifecycle requests should be cancellable"; + final CancellableTask cancellableTask = (CancellableTask) task; + if (cancellableTask.notifyIfCancelled(listener)) { + return; + } + IndexLifecycleMetadata metadata = clusterService.state().metadata().custom(IndexLifecycleMetadata.TYPE); if (metadata == null) { if (request.getPolicyNames().length == 0) { @@ -88,6 +95,9 @@ protected void masterOperation(Task task, Request request, ClusterState state, A for (String name : names) { if (Regex.isSimpleMatchPattern(name)) { for (Map.Entry entry : metadata.getPolicyMetadatas().entrySet()) { + if (cancellableTask.notifyIfCancelled(listener)) { + return; + } LifecyclePolicyMetadata policyMetadata = entry.getValue(); if (Regex.simpleMatch(name, entry.getKey())) { policyResponseItemMap.put(