[7.x] Re-read policy phase JSON when using ILM's move-to-step… (#49011)
When using the move-to-step API, we should reread the phase JSON from the latest version of the ILM policy. This allows a user to move to the same step while re-reading the policy's latest version. For example, when changing rollover criteria. While manually messing around with some other things I discovered that we only reread the policy when using the retry API, not the move-to-step API. This commit changes the move-to-step API to always read the latest version of the policy.
This commit is contained in:
parent
40776eedaf
commit
5eb37c29fe
|
@ -6,6 +6,7 @@
|
||||||
package org.elasticsearch.xpack.core.ilm;
|
package org.elasticsearch.xpack.core.ilm;
|
||||||
|
|
||||||
import org.elasticsearch.client.Client;
|
import org.elasticsearch.client.Client;
|
||||||
|
import org.elasticsearch.common.Nullable;
|
||||||
import org.elasticsearch.common.ParseField;
|
import org.elasticsearch.common.ParseField;
|
||||||
import org.elasticsearch.common.Strings;
|
import org.elasticsearch.common.Strings;
|
||||||
import org.elasticsearch.common.io.stream.StreamInput;
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
|
@ -56,7 +57,7 @@ public class RolloverAction implements LifecycleAction {
|
||||||
return PARSER.apply(parser, null);
|
return PARSER.apply(parser, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public RolloverAction(ByteSizeValue maxSize, TimeValue maxAge, Long maxDocs) {
|
public RolloverAction(@Nullable ByteSizeValue maxSize, @Nullable TimeValue maxAge, @Nullable Long maxDocs) {
|
||||||
if (maxSize == null && maxAge == null && maxDocs == null) {
|
if (maxSize == null && maxAge == null && maxDocs == null) {
|
||||||
throw new IllegalArgumentException("At least one rollover condition must be set.");
|
throw new IllegalArgumentException("At least one rollover condition must be set.");
|
||||||
}
|
}
|
||||||
|
|
|
@ -817,6 +817,42 @@ public class TimeSeriesLifecycleActionsIT extends ESRestTestCase {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testMoveToStepRereadsPolicy() throws Exception {
|
||||||
|
createNewSingletonPolicy("hot", new RolloverAction(null, TimeValue.timeValueHours(1), null), TimeValue.ZERO);
|
||||||
|
|
||||||
|
createIndexWithSettings("test-1", Settings.builder()
|
||||||
|
.put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1)
|
||||||
|
.put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0)
|
||||||
|
.put(LifecycleSettings.LIFECYCLE_NAME, policy)
|
||||||
|
.put(RolloverAction.LIFECYCLE_ROLLOVER_ALIAS, "alias"),
|
||||||
|
true);
|
||||||
|
|
||||||
|
assertBusy(() -> assertThat(getStepKeyForIndex("test-1"), equalTo(new StepKey("hot", "rollover", "check-rollover-ready"))));
|
||||||
|
|
||||||
|
createNewSingletonPolicy("hot", new RolloverAction(null, TimeValue.timeValueSeconds(1), null), TimeValue.ZERO);
|
||||||
|
|
||||||
|
// Move to the same step, which should re-read the policy
|
||||||
|
Request moveToStepRequest = new Request("POST", "_ilm/move/test-1");
|
||||||
|
moveToStepRequest.setJsonEntity("{\n" +
|
||||||
|
" \"current_step\": { \n" +
|
||||||
|
" \"phase\": \"hot\",\n" +
|
||||||
|
" \"action\": \"rollover\",\n" +
|
||||||
|
" \"name\": \"check-rollover-ready\"\n" +
|
||||||
|
" },\n" +
|
||||||
|
" \"next_step\": { \n" +
|
||||||
|
" \"phase\": \"hot\",\n" +
|
||||||
|
" \"action\": \"rollover\",\n" +
|
||||||
|
" \"name\": \"check-rollover-ready\"\n" +
|
||||||
|
" }\n" +
|
||||||
|
"}");
|
||||||
|
assertOK(client().performRequest(moveToStepRequest));
|
||||||
|
|
||||||
|
// Make sure we actually rolled over
|
||||||
|
assertBusy(() -> {
|
||||||
|
indexExists("test-000002");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public void testCanStopILMWithPolicyUsingNonexistentPolicy() throws Exception {
|
public void testCanStopILMWithPolicyUsingNonexistentPolicy() throws Exception {
|
||||||
createIndexWithSettings(index, Settings.builder().put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1)
|
createIndexWithSettings(index, Settings.builder().put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1)
|
||||||
.put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0)
|
.put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0)
|
||||||
|
|
|
@ -317,13 +317,11 @@ public class IndexLifecycleRunner {
|
||||||
* @param nextStepKey The next step to move the index into
|
* @param nextStepKey The next step to move the index into
|
||||||
* @param nowSupplier The current-time supplier for updating when steps changed
|
* @param nowSupplier The current-time supplier for updating when steps changed
|
||||||
* @param stepRegistry The steps registry to check a step-key's existence in the index's current policy
|
* @param stepRegistry The steps registry to check a step-key's existence in the index's current policy
|
||||||
* @param forcePhaseDefinitionRefresh When true, step information will be recompiled from the latest version of the
|
|
||||||
* policy. Otherwise, existing phase definition is used.
|
|
||||||
* @return The updated cluster state where the index moved to <code>nextStepKey</code>
|
* @return The updated cluster state where the index moved to <code>nextStepKey</code>
|
||||||
*/
|
*/
|
||||||
static ClusterState moveClusterStateToStep(String indexName, ClusterState currentState, StepKey currentStepKey,
|
static ClusterState moveClusterStateToStep(String indexName, ClusterState currentState, StepKey currentStepKey,
|
||||||
StepKey nextStepKey, LongSupplier nowSupplier,
|
StepKey nextStepKey, LongSupplier nowSupplier,
|
||||||
PolicyStepsRegistry stepRegistry, boolean forcePhaseDefinitionRefresh) {
|
PolicyStepsRegistry stepRegistry) {
|
||||||
IndexMetaData idxMeta = currentState.getMetaData().index(indexName);
|
IndexMetaData idxMeta = currentState.getMetaData().index(indexName);
|
||||||
validateTransition(idxMeta, currentStepKey, nextStepKey, stepRegistry);
|
validateTransition(idxMeta, currentStepKey, nextStepKey, stepRegistry);
|
||||||
|
|
||||||
|
@ -333,7 +331,7 @@ public class IndexLifecycleRunner {
|
||||||
indexName, currentStepKey, nextStepKey, policy);
|
indexName, currentStepKey, nextStepKey, policy);
|
||||||
|
|
||||||
return IndexLifecycleRunner.moveClusterStateToNextStep(idxMeta.getIndex(), currentState, currentStepKey,
|
return IndexLifecycleRunner.moveClusterStateToNextStep(idxMeta.getIndex(), currentState, currentStepKey,
|
||||||
nextStepKey, nowSupplier, forcePhaseDefinitionRefresh);
|
nextStepKey, nowSupplier, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void validateTransition(IndexMetaData idxMeta, StepKey currentStepKey, StepKey nextStepKey, PolicyStepsRegistry stepRegistry) {
|
static void validateTransition(IndexMetaData idxMeta, StepKey currentStepKey, StepKey nextStepKey, PolicyStepsRegistry stepRegistry) {
|
||||||
|
|
|
@ -88,7 +88,7 @@ public class IndexLifecycleService
|
||||||
|
|
||||||
public ClusterState moveClusterStateToStep(ClusterState currentState, String indexName, StepKey currentStepKey, StepKey nextStepKey) {
|
public ClusterState moveClusterStateToStep(ClusterState currentState, String indexName, StepKey currentStepKey, StepKey nextStepKey) {
|
||||||
return IndexLifecycleRunner.moveClusterStateToStep(indexName, currentState, currentStepKey, nextStepKey,
|
return IndexLifecycleRunner.moveClusterStateToStep(indexName, currentState, currentStepKey, nextStepKey,
|
||||||
nowSupplier, policyRegistry, false);
|
nowSupplier, policyRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ClusterState moveClusterStateToPreviouslyFailedStep(ClusterState currentState, String[] indices) {
|
public ClusterState moveClusterStateToPreviouslyFailedStep(ClusterState currentState, String[] indices) {
|
||||||
|
|
|
@ -839,7 +839,7 @@ public class IndexLifecycleRunnerTests extends ESTestCase {
|
||||||
ClusterState clusterState = buildClusterState(indexName, indexSettingsBuilder, lifecycleState.build(), policyMetadatas);
|
ClusterState clusterState = buildClusterState(indexName, indexSettingsBuilder, lifecycleState.build(), policyMetadatas);
|
||||||
Index index = clusterState.metaData().index(indexName).getIndex();
|
Index index = clusterState.metaData().index(indexName).getIndex();
|
||||||
ClusterState newClusterState = IndexLifecycleRunner.moveClusterStateToStep(indexName, clusterState, currentStepKey,
|
ClusterState newClusterState = IndexLifecycleRunner.moveClusterStateToStep(indexName, clusterState, currentStepKey,
|
||||||
nextStepKey, () -> now, stepRegistry, false);
|
nextStepKey, () -> now, stepRegistry);
|
||||||
assertClusterStateOnNextStep(clusterState, index, currentStepKey, nextStepKey, newClusterState, now);
|
assertClusterStateOnNextStep(clusterState, index, currentStepKey, nextStepKey, newClusterState, now);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -861,7 +861,7 @@ public class IndexLifecycleRunnerTests extends ESTestCase {
|
||||||
ClusterState clusterState = buildClusterState(indexName, indexSettingsBuilder, lifecycleState.build(), Collections.emptyList());
|
ClusterState clusterState = buildClusterState(indexName, indexSettingsBuilder, lifecycleState.build(), Collections.emptyList());
|
||||||
IllegalArgumentException exception = expectThrows(IllegalArgumentException.class,
|
IllegalArgumentException exception = expectThrows(IllegalArgumentException.class,
|
||||||
() -> IndexLifecycleRunner.moveClusterStateToStep(indexName, clusterState, currentStepKey,
|
() -> IndexLifecycleRunner.moveClusterStateToStep(indexName, clusterState, currentStepKey,
|
||||||
nextStepKey, () -> now, stepRegistry, false));
|
nextStepKey, () -> now, stepRegistry));
|
||||||
assertThat(exception.getMessage(), equalTo("index [my_index] is not associated with an Index Lifecycle Policy"));
|
assertThat(exception.getMessage(), equalTo("index [my_index] is not associated with an Index Lifecycle Policy"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -884,7 +884,7 @@ public class IndexLifecycleRunnerTests extends ESTestCase {
|
||||||
ClusterState clusterState = buildClusterState(indexName, indexSettingsBuilder, lifecycleState.build(), Collections.emptyList());
|
ClusterState clusterState = buildClusterState(indexName, indexSettingsBuilder, lifecycleState.build(), Collections.emptyList());
|
||||||
IllegalArgumentException exception = expectThrows(IllegalArgumentException.class,
|
IllegalArgumentException exception = expectThrows(IllegalArgumentException.class,
|
||||||
() -> IndexLifecycleRunner.moveClusterStateToStep(indexName, clusterState, notCurrentStepKey,
|
() -> IndexLifecycleRunner.moveClusterStateToStep(indexName, clusterState, notCurrentStepKey,
|
||||||
nextStepKey, () -> now, stepRegistry, false));
|
nextStepKey, () -> now, stepRegistry));
|
||||||
assertThat(exception.getMessage(), equalTo("index [my_index] is not on current step " +
|
assertThat(exception.getMessage(), equalTo("index [my_index] is not on current step " +
|
||||||
"[{\"phase\":\"not_current_phase\",\"action\":\"not_current_action\",\"name\":\"not_current_step\"}]"));
|
"[{\"phase\":\"not_current_phase\",\"action\":\"not_current_action\",\"name\":\"not_current_step\"}]"));
|
||||||
}
|
}
|
||||||
|
@ -907,7 +907,7 @@ public class IndexLifecycleRunnerTests extends ESTestCase {
|
||||||
ClusterState clusterState = buildClusterState(indexName, indexSettingsBuilder, lifecycleState.build(), Collections.emptyList());
|
ClusterState clusterState = buildClusterState(indexName, indexSettingsBuilder, lifecycleState.build(), Collections.emptyList());
|
||||||
IllegalArgumentException exception = expectThrows(IllegalArgumentException.class,
|
IllegalArgumentException exception = expectThrows(IllegalArgumentException.class,
|
||||||
() -> IndexLifecycleRunner.moveClusterStateToStep(indexName, clusterState, currentStepKey,
|
() -> IndexLifecycleRunner.moveClusterStateToStep(indexName, clusterState, currentStepKey,
|
||||||
nextStepKey, () -> now, stepRegistry, false));
|
nextStepKey, () -> now, stepRegistry));
|
||||||
assertThat(exception.getMessage(),
|
assertThat(exception.getMessage(),
|
||||||
equalTo("step [{\"phase\":\"next_phase\",\"action\":\"next_action\",\"name\":\"next_step\"}] " +
|
equalTo("step [{\"phase\":\"next_phase\",\"action\":\"next_action\",\"name\":\"next_step\"}] " +
|
||||||
"for index [my_index] with policy [my_policy] does not exist"));
|
"for index [my_index] with policy [my_policy] does not exist"));
|
||||||
|
|
Loading…
Reference in New Issue