Skip to content

Commit f6ce935

Browse files
authored
fix GET _ilm response with uninitialized ILM metadata (#34881)
ILM would return a resource-not-found exception when requesting policies while the IndexLifecycleMetaData is not initialized. The behavior here should not be as extreme since it is not the user's fault. This commit changes the behavior so that it succeeds and returns no policies when no policy names are explicitely specified, otherwise keep the same behavior of throwing an exception
1 parent f76ced4 commit f6ce935

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/indexlifecycle/action/TransportGetLifecycleAction.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
import java.util.ArrayList;
3030
import java.util.Arrays;
31+
import java.util.Collections;
3132
import java.util.List;
3233

3334
public class TransportGetLifecycleAction extends TransportMasterNodeAction<Request, Response> {
@@ -53,7 +54,12 @@ protected Response newResponse() {
5354
protected void masterOperation(Request request, ClusterState state, ActionListener<Response> listener) {
5455
IndexLifecycleMetadata metadata = clusterService.state().metaData().custom(IndexLifecycleMetadata.TYPE);
5556
if (metadata == null) {
56-
listener.onFailure(new ResourceNotFoundException("Lifecycle policy not found: {}", Arrays.toString(request.getPolicyNames())));
57+
if (request.getPolicyNames().length == 0) {
58+
listener.onResponse(new Response(Collections.emptyList()));
59+
} else {
60+
listener.onFailure(new ResourceNotFoundException("Lifecycle policy not found: {}",
61+
Arrays.toString(request.getPolicyNames())));
62+
}
5763
} else {
5864
List<LifecyclePolicyResponseItem> requestedPolicies;
5965
// if no policies explicitly provided, behave as if `*` was specified

x-pack/plugin/ilm/src/test/java/org/elasticsearch/xpack/indexlifecycle/IndexLifecycleInitialisationTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import java.util.Collections;
5555
import java.util.List;
5656
import java.util.Map;
57+
import java.util.concurrent.ExecutionException;
5758
import java.util.stream.Collectors;
5859

5960
import static org.elasticsearch.client.Requests.clusterHealthRequest;
@@ -64,6 +65,7 @@
6465
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
6566
import static org.elasticsearch.xpack.core.indexlifecycle.LifecyclePolicyTestsUtils.newLockableLifecyclePolicy;
6667
import static org.hamcrest.CoreMatchers.not;
68+
import static org.hamcrest.Matchers.containsString;
6769
import static org.hamcrest.Matchers.equalTo;
6870
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
6971
import static org.hamcrest.Matchers.lessThanOrEqualTo;
@@ -145,6 +147,15 @@ public void testSingleNodeCluster() throws Exception {
145147
logger.info("Starting server1");
146148
final String server_1 = internalCluster().startNode();
147149
final String node1 = getLocalNodeId(server_1);
150+
151+
// test get-lifecycle behavior when IndexLifecycleMetaData is null
152+
GetLifecycleAction.Response getUninitializedLifecycleResponse = client().execute(GetLifecycleAction.INSTANCE,
153+
new GetLifecycleAction.Request()).get();
154+
assertThat(getUninitializedLifecycleResponse.getPolicies().size(), equalTo(0));
155+
ExecutionException exception = expectThrows(ExecutionException.class,() -> client()
156+
.execute(GetLifecycleAction.INSTANCE, new GetLifecycleAction.Request("non-existent-policy")).get());
157+
assertThat(exception.getMessage(), containsString("Lifecycle policy not found: [non-existent-policy]"));
158+
148159
logger.info("Creating lifecycle [test_lifecycle]");
149160
PutLifecycleAction.Request putLifecycleRequest = new PutLifecycleAction.Request(lifecyclePolicy);
150161
long lowerBoundModifiedDate = Instant.now().toEpochMilli();

0 commit comments

Comments
 (0)