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:
parent
1cb0a4399d
commit
a4d481f2bb
|
@ -5,6 +5,7 @@
|
||||||
*/
|
*/
|
||||||
package org.elasticsearch.xpack.core.ilm;
|
package org.elasticsearch.xpack.core.ilm;
|
||||||
|
|
||||||
|
import org.elasticsearch.ElasticsearchException;
|
||||||
import org.elasticsearch.action.ActionListener;
|
import org.elasticsearch.action.ActionListener;
|
||||||
import org.elasticsearch.client.Client;
|
import org.elasticsearch.client.Client;
|
||||||
import org.elasticsearch.cluster.ClusterState;
|
import org.elasticsearch.cluster.ClusterState;
|
||||||
|
@ -26,7 +27,12 @@ public class FreezeStep extends AsyncRetryDuringSnapshotActionStep {
|
||||||
public void performDuringNoSnapshot(IndexMetaData indexMetaData, ClusterState currentState, Listener listener) {
|
public void performDuringNoSnapshot(IndexMetaData indexMetaData, ClusterState currentState, Listener listener) {
|
||||||
getClient().admin().indices().execute(FreezeIndexAction.INSTANCE,
|
getClient().admin().indices().execute(FreezeIndexAction.INSTANCE,
|
||||||
new FreezeRequest(indexMetaData.getIndex().getName()).masterNodeTimeout(getMasterTimeout(currentState)),
|
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
|
@Override
|
||||||
|
|
|
@ -12,6 +12,7 @@ import org.elasticsearch.action.ActionListener;
|
||||||
import org.elasticsearch.action.support.master.AcknowledgedResponse;
|
import org.elasticsearch.action.support.master.AcknowledgedResponse;
|
||||||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||||
import org.elasticsearch.protocol.xpack.frozen.FreezeRequest;
|
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.frozen.action.FreezeIndexAction;
|
||||||
import org.elasticsearch.xpack.core.ilm.Step.StepKey;
|
import org.elasticsearch.xpack.core.ilm.Step.StepKey;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
|
@ -73,7 +74,7 @@ public class FreezeStepTests extends AbstractStepMasterTimeoutTestCase<FreezeSte
|
||||||
assertNotNull(request);
|
assertNotNull(request);
|
||||||
assertEquals(1, request.indices().length);
|
assertEquals(1, request.indices().length);
|
||||||
assertEquals(indexMetaData.getIndex().getName(), request.indices()[0]);
|
assertEquals(indexMetaData.getIndex().getName(), request.indices()[0]);
|
||||||
listener.onResponse(null);
|
listener.onResponse(new FreezeResponse(true, true));
|
||||||
return null;
|
return null;
|
||||||
}).when(indicesClient).execute(Mockito.any(), Mockito.any(), Mockito.any());
|
}).when(indicesClient).execute(Mockito.any(), Mockito.any(), Mockito.any());
|
||||||
|
|
||||||
|
@ -127,4 +128,32 @@ public class FreezeStepTests extends AbstractStepMasterTimeoutTestCase<FreezeSte
|
||||||
|
|
||||||
assertThat(exceptionThrown.get(), equalTo(true));
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue