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.
This commit is contained in:
Henning Andersen 2020-03-10 08:02:02 +01:00 committed by Henning Andersen
parent 1cb0a4399d
commit a4d481f2bb
2 changed files with 37 additions and 2 deletions

View File

@ -5,6 +5,7 @@
*/
package org.elasticsearch.xpack.core.ilm;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.client.Client;
import org.elasticsearch.cluster.ClusterState;
@ -26,7 +27,12 @@ public class FreezeStep extends AsyncRetryDuringSnapshotActionStep {
public void performDuringNoSnapshot(IndexMetaData indexMetaData, ClusterState currentState, Listener listener) {
getClient().admin().indices().execute(FreezeIndexAction.INSTANCE,
new FreezeRequest(indexMetaData.getIndex().getName()).masterNodeTimeout(getMasterTimeout(currentState)),
ActionListener.wrap(response -> listener.onResponse(true), listener::onFailure));
ActionListener.wrap(response -> {
if (response.isAcknowledged() == false) {
throw new ElasticsearchException("freeze index request failed to be acknowledged");
}
listener.onResponse(true);
}, listener::onFailure));
}
@Override

View File

@ -12,6 +12,7 @@ import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.protocol.xpack.frozen.FreezeRequest;
import org.elasticsearch.protocol.xpack.frozen.FreezeResponse;
import org.elasticsearch.xpack.core.frozen.action.FreezeIndexAction;
import org.elasticsearch.xpack.core.ilm.Step.StepKey;
import org.mockito.Mockito;
@ -73,7 +74,7 @@ public class FreezeStepTests extends AbstractStepMasterTimeoutTestCase<FreezeSte
assertNotNull(request);
assertEquals(1, request.indices().length);
assertEquals(indexMetaData.getIndex().getName(), request.indices()[0]);
listener.onResponse(null);
listener.onResponse(new FreezeResponse(true, true));
return null;
}).when(indicesClient).execute(Mockito.any(), Mockito.any(), Mockito.any());
@ -127,4 +128,32 @@ public class FreezeStepTests extends AbstractStepMasterTimeoutTestCase<FreezeSte
assertThat(exceptionThrown.get(), equalTo(true));
}
public void testNotAcknowledged() {
IndexMetaData indexMetaData = getIndexMetaData();
Mockito.doAnswer(invocation -> {
@SuppressWarnings("unchecked")
ActionListener<AcknowledgedResponse> listener = (ActionListener<AcknowledgedResponse>) invocation.getArguments()[2];
listener.onResponse(new FreezeResponse(false, false));
return null;
}).when(indicesClient).execute(Mockito.any(), Mockito.any(), Mockito.any());
SetOnce<Boolean> exceptionThrown = new SetOnce<>();
FreezeStep step = createRandomInstance();
step.performAction(indexMetaData, emptyClusterState(), null, new AsyncActionStep.Listener() {
@Override
public void onResponse(boolean complete) {
throw new AssertionError("Unexpected method call");
}
@Override
public void onFailure(Exception e) {
assertEquals("freeze index request failed to be acknowledged", e.getMessage());
exceptionThrown.set(true);
}
});
assertThat(exceptionThrown.get(), equalTo(true));
}
}