Skip to content

Commit

Permalink
Ensure SLM stats does not block an in-place upgrade from 7.4 (… (#48412)
Browse files Browse the repository at this point in the history
7.5+ for SLM requires [stats] object to exist in the cluster state.
When doing an in-place upgrade from 7.4 to 7.5+ [stats] does not exist
in cluster state, result in an exception on startup [1].

This commit moves the [stats] to be an optional object in the parser
and if not found will default to an empty stats object.

[1] Caused by: java.lang.IllegalArgumentException: Required [stats]
  • Loading branch information
jakelandis committed Oct 23, 2019
1 parent aca2631 commit 3e58589
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public class SnapshotLifecycleMetadata implements XPackMetaDataCustom {
throw new IllegalArgumentException("ordered " + POLICIES_FIELD.getPreferredName() + " are not supported");
}, POLICIES_FIELD);
PARSER.declareString(ConstructingObjectParser.constructorArg(), OPERATION_MODE_FIELD);
PARSER.declareObject(ConstructingObjectParser.constructorArg(), (v, o) -> SnapshotLifecycleStats.parse(v), STATS_FIELD);
PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), (v, o) -> SnapshotLifecycleStats.parse(v), STATS_FIELD);
}

private final Map<String, SnapshotLifecyclePolicyMetadata> snapshotConfigurations;
Expand All @@ -74,7 +74,7 @@ public SnapshotLifecycleMetadata(Map<String, SnapshotLifecyclePolicyMetadata> sn
SnapshotLifecycleStats slmStats) {
this.snapshotConfigurations = new HashMap<>(snapshotConfigurations);
this.operationMode = operationMode;
this.slmStats = slmStats;
this.slmStats = slmStats != null ? slmStats : new SnapshotLifecycleStats();
}

public SnapshotLifecycleMetadata(StreamInput in) throws IOException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,16 @@
import org.elasticsearch.client.Request;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.ResponseException;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.util.concurrent.ThreadContext;
import org.elasticsearch.common.xcontent.DeprecationHandler;
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
import org.elasticsearch.common.xcontent.ObjectPath;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.elasticsearch.common.xcontent.support.XContentMapValues;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.rest.action.document.RestGetAction;
Expand All @@ -21,13 +28,16 @@
import org.elasticsearch.test.StreamsUtils;
import org.elasticsearch.test.rest.ESRestTestCase;
import org.elasticsearch.upgrades.AbstractFullClusterRestartTestCase;
import org.elasticsearch.xpack.core.slm.SnapshotLifecyclePolicy;
import org.elasticsearch.xpack.slm.SnapshotLifecycleStats;
import org.hamcrest.Matcher;
import org.junit.Before;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
Expand Down Expand Up @@ -293,6 +303,39 @@ public void testRollupAfterRestart() throws Exception {
assertRollUpJob("rollup-job-test");
}
}

public void testSlmStats() throws IOException {
SnapshotLifecyclePolicy slmPolicy = new SnapshotLifecyclePolicy("test-policy", "test-policy", "* * * 31 FEB ? *", "test-repo",
Collections.singletonMap("indices", Collections.singletonList("*")), null);
if (isRunningAgainstOldCluster() && getOldClusterVersion().onOrAfter(Version.V_7_4_0)) {
Request createRepoRequest = new Request("PUT", "_snapshot/test-repo");
String repoCreateJson = "{" +
" \"type\": \"fs\"," +
" \"settings\": {" +
" \"location\": \"test-repo\"" +
" }" +
"}";
createRepoRequest.setJsonEntity(repoCreateJson);
Request createSlmPolicyRequest = new Request("PUT", "_slm/policy/test-policy");
try (XContentBuilder builder = JsonXContent.contentBuilder()) {
String createSlmPolicyJson = Strings.toString(slmPolicy.toXContent(builder, null));
createSlmPolicyRequest.setJsonEntity(createSlmPolicyJson);
}

client().performRequest(createRepoRequest);
client().performRequest(createSlmPolicyRequest);
}

if (isRunningAgainstOldCluster() == false || getOldClusterVersion().onOrAfter(Version.V_7_5_0)) {
Response response = client().performRequest(new Request("GET", "_slm/stats"));
XContentType xContentType = XContentType.fromMediaTypeOrFormat(response.getEntity().getContentType().getValue());
try (XContentParser parser = xContentType.xContent().createParser(NamedXContentRegistry.EMPTY,
DeprecationHandler.THROW_UNSUPPORTED_OPERATION, response.getEntity().getContent())) {
assertEquals(new SnapshotLifecycleStats(), SnapshotLifecycleStats.parse(parser));
}
}

}

public void testRollupIDSchemeAfterRestart() throws Exception {
assumeTrue("Rollup can be tested with 6.3.0 and onwards", getOldClusterVersion().onOrAfter(Version.V_6_3_0));
Expand Down

0 comments on commit 3e58589

Please sign in to comment.