Skip to content

Commit 6bd3509

Browse files
ILM Freeze step retry when not acknowledged (#53287)
A freeze operation can partially fail in multiple places, including the close verification step. This left the index in an unfrozen but partially closed state. Now throw an exception to retry the freeze step instead.
1 parent 4b17ef8 commit 6bd3509

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/FreezeStep.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package org.elasticsearch.xpack.core.ilm;
77

8+
import org.elasticsearch.ElasticsearchException;
89
import org.elasticsearch.action.ActionListener;
910
import org.elasticsearch.client.Client;
1011
import org.elasticsearch.cluster.ClusterState;
@@ -26,7 +27,12 @@ public FreezeStep(StepKey key, StepKey nextStepKey, Client client) {
2627
public void performDuringNoSnapshot(IndexMetaData indexMetaData, ClusterState currentState, Listener listener) {
2728
getClient().admin().indices().execute(FreezeIndexAction.INSTANCE,
2829
new FreezeRequest(indexMetaData.getIndex().getName()).masterNodeTimeout(getMasterTimeout(currentState)),
29-
ActionListener.wrap(response -> listener.onResponse(true), listener::onFailure));
30+
ActionListener.wrap(response -> {
31+
if (response.isAcknowledged() == false) {
32+
throw new ElasticsearchException("freeze index request failed to be acknowledged");
33+
}
34+
listener.onResponse(true);
35+
}, listener::onFailure));
3036
}
3137

3238
@Override

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

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.elasticsearch.action.support.master.AcknowledgedResponse;
1313
import org.elasticsearch.cluster.metadata.IndexMetaData;
1414
import org.elasticsearch.protocol.xpack.frozen.FreezeRequest;
15+
import org.elasticsearch.protocol.xpack.frozen.FreezeResponse;
1516
import org.elasticsearch.xpack.core.frozen.action.FreezeIndexAction;
1617
import org.elasticsearch.xpack.core.ilm.Step.StepKey;
1718
import org.mockito.Mockito;
@@ -73,7 +74,7 @@ public void testFreeze() {
7374
assertNotNull(request);
7475
assertEquals(1, request.indices().length);
7576
assertEquals(indexMetaData.getIndex().getName(), request.indices()[0]);
76-
listener.onResponse(null);
77+
listener.onResponse(new FreezeResponse(true, true));
7778
return null;
7879
}).when(indicesClient).execute(Mockito.any(), Mockito.any(), Mockito.any());
7980

@@ -127,4 +128,32 @@ public void onFailure(Exception e) {
127128

128129
assertThat(exceptionThrown.get(), equalTo(true));
129130
}
131+
132+
public void testNotAcknowledged() {
133+
IndexMetaData indexMetaData = getIndexMetaData();
134+
135+
Mockito.doAnswer(invocation -> {
136+
@SuppressWarnings("unchecked")
137+
ActionListener<AcknowledgedResponse> listener = (ActionListener<AcknowledgedResponse>) invocation.getArguments()[2];
138+
listener.onResponse(new FreezeResponse(false, false));
139+
return null;
140+
}).when(indicesClient).execute(Mockito.any(), Mockito.any(), Mockito.any());
141+
142+
SetOnce<Boolean> exceptionThrown = new SetOnce<>();
143+
FreezeStep step = createRandomInstance();
144+
step.performAction(indexMetaData, emptyClusterState(), null, new AsyncActionStep.Listener() {
145+
@Override
146+
public void onResponse(boolean complete) {
147+
throw new AssertionError("Unexpected method call");
148+
}
149+
150+
@Override
151+
public void onFailure(Exception e) {
152+
assertEquals("freeze index request failed to be acknowledged", e.getMessage());
153+
exceptionThrown.set(true);
154+
}
155+
});
156+
157+
assertThat(exceptionThrown.get(), equalTo(true));
158+
}
130159
}

0 commit comments

Comments
 (0)