Skip to content

Commit c7ec0b8

Browse files
committed
Include in-progress snapshot for a policy with get SLM policy… (#45245)
This commit adds the "in_progress" key to the SLM get policy API, returning a policy that looks like: ```json { "daily-snapshots" : { "version" : 1, "modified_date" : "2019-08-05T18:41:48.778Z", "modified_date_millis" : 1565030508778, "policy" : { "name" : "<production-snap-{now/d}>", "schedule" : "0 30 1 * * ?", "repository" : "repo", "config" : { "indices" : [ "foo-*", "important" ], "ignore_unavailable" : true, "include_global_state" : false }, "retention" : { "expire_after" : "10m" } }, "last_success" : { "snapshot_name" : "production-snap-2019.08.05-oxctmnobqye3luim4uejhg", "time_string" : "2019-08-05T18:42:23.257Z", "time" : 1565030543257 }, "next_execution" : "2019-08-06T01:30:00.000Z", "next_execution_millis" : 1565055000000, "in_progress" : { "name" : "production-snap-2019.08.05-oxctmnobqye3luim4uejhg", "uuid" : "t8Idqt6JQxiZrzp0Vt7z6g", "state" : "STARTED", "start_time" : "2019-08-05T18:42:22.998Z", "start_time_millis" : 1565030542998 } } } ``` These are only visible while the snapshot is being taken (or failed), since it reads from the cluster state rather than from the repository itself.
1 parent 9384774 commit c7ec0b8

File tree

7 files changed

+332
-19
lines changed

7 files changed

+332
-19
lines changed

client/rest-high-level/src/main/java/org/elasticsearch/client/slm/SnapshotLifecyclePolicyMetadata.java

+99-2
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@
2121

2222
import org.elasticsearch.common.Nullable;
2323
import org.elasticsearch.common.ParseField;
24+
import org.elasticsearch.common.Strings;
2425
import org.elasticsearch.common.xcontent.ConstructingObjectParser;
2526
import org.elasticsearch.common.xcontent.ToXContentObject;
2627
import org.elasticsearch.common.xcontent.XContentBuilder;
2728
import org.elasticsearch.common.xcontent.XContentParser;
29+
import org.elasticsearch.snapshots.SnapshotId;
2830

2931
import java.io.IOException;
3032
import java.util.Objects;
@@ -39,6 +41,7 @@ public class SnapshotLifecyclePolicyMetadata implements ToXContentObject {
3941
static final ParseField LAST_FAILURE = new ParseField("last_failure");
4042
static final ParseField NEXT_EXECUTION_MILLIS = new ParseField("next_execution_millis");
4143
static final ParseField NEXT_EXECUTION = new ParseField("next_execution");
44+
static final ParseField SNAPSHOT_IN_PROGRESS = new ParseField("in_progress");
4245

4346
private final SnapshotLifecyclePolicy policy;
4447
private final long version;
@@ -48,6 +51,8 @@ public class SnapshotLifecyclePolicyMetadata implements ToXContentObject {
4851
private final SnapshotInvocationRecord lastSuccess;
4952
@Nullable
5053
private final SnapshotInvocationRecord lastFailure;
54+
@Nullable
55+
private final SnapshotInProgress snapshotInProgress;
5156

5257
@SuppressWarnings("unchecked")
5358
public static final ConstructingObjectParser<SnapshotLifecyclePolicyMetadata, String> PARSER =
@@ -59,8 +64,9 @@ public class SnapshotLifecyclePolicyMetadata implements ToXContentObject {
5964
SnapshotInvocationRecord lastSuccess = (SnapshotInvocationRecord) a[3];
6065
SnapshotInvocationRecord lastFailure = (SnapshotInvocationRecord) a[4];
6166
long nextExecution = (long) a[5];
67+
SnapshotInProgress sip = (SnapshotInProgress) a[6];
6268

63-
return new SnapshotLifecyclePolicyMetadata(policy, version, modifiedDate, lastSuccess, lastFailure, nextExecution);
69+
return new SnapshotLifecyclePolicyMetadata(policy, version, modifiedDate, lastSuccess, lastFailure, nextExecution, sip);
6470
});
6571

6672
static {
@@ -70,6 +76,7 @@ public class SnapshotLifecyclePolicyMetadata implements ToXContentObject {
7076
PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), SnapshotInvocationRecord::parse, LAST_SUCCESS);
7177
PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), SnapshotInvocationRecord::parse, LAST_FAILURE);
7278
PARSER.declareLong(ConstructingObjectParser.constructorArg(), NEXT_EXECUTION_MILLIS);
79+
PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), SnapshotInProgress::parse, SNAPSHOT_IN_PROGRESS);
7380
}
7481

7582
public static SnapshotLifecyclePolicyMetadata parse(XContentParser parser, String id) {
@@ -78,13 +85,15 @@ public static SnapshotLifecyclePolicyMetadata parse(XContentParser parser, Strin
7885

7986
public SnapshotLifecyclePolicyMetadata(SnapshotLifecyclePolicy policy, long version, long modifiedDate,
8087
SnapshotInvocationRecord lastSuccess, SnapshotInvocationRecord lastFailure,
81-
long nextExecution) {
88+
long nextExecution,
89+
@Nullable SnapshotInProgress snapshotInProgress) {
8290
this.policy = policy;
8391
this.version = version;
8492
this.modifiedDate = modifiedDate;
8593
this.lastSuccess = lastSuccess;
8694
this.lastFailure = lastFailure;
8795
this.nextExecution = nextExecution;
96+
this.snapshotInProgress = snapshotInProgress;
8897
}
8998

9099
public SnapshotLifecyclePolicy getPolicy() {
@@ -115,6 +124,11 @@ public long getNextExecution() {
115124
return this.nextExecution;
116125
}
117126

127+
@Nullable
128+
public SnapshotInProgress getSnapshotInProgress() {
129+
return this.snapshotInProgress;
130+
}
131+
118132
@Override
119133
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
120134
builder.startObject();
@@ -128,6 +142,9 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
128142
builder.field(LAST_FAILURE.getPreferredName(), lastFailure);
129143
}
130144
builder.timeField(NEXT_EXECUTION_MILLIS.getPreferredName(), NEXT_EXECUTION.getPreferredName(), nextExecution);
145+
if (snapshotInProgress != null) {
146+
builder.field(SNAPSHOT_IN_PROGRESS.getPreferredName(), snapshotInProgress);
147+
}
131148
builder.endObject();
132149
return builder;
133150
}
@@ -154,4 +171,84 @@ public boolean equals(Object obj) {
154171
Objects.equals(nextExecution, other.nextExecution);
155172
}
156173

174+
public static class SnapshotInProgress implements ToXContentObject {
175+
private static final ParseField NAME = new ParseField("name");
176+
private static final ParseField UUID = new ParseField("uuid");
177+
private static final ParseField STATE = new ParseField("state");
178+
private static final ParseField START_TIME = new ParseField("start_time_millis");
179+
private static final ParseField FAILURE = new ParseField("failure");
180+
181+
private static final ConstructingObjectParser<SnapshotInProgress, Void> PARSER =
182+
new ConstructingObjectParser<>("snapshot_in_progress", true, a -> {
183+
SnapshotId id = new SnapshotId((String) a[0], (String) a[1]);
184+
String state = (String) a[2];
185+
long start = (long) a[3];
186+
String failure = (String) a[4];
187+
return new SnapshotInProgress(id, state, start, failure);
188+
});
189+
190+
static {
191+
PARSER.declareString(ConstructingObjectParser.constructorArg(), NAME);
192+
PARSER.declareString(ConstructingObjectParser.constructorArg(), UUID);
193+
PARSER.declareString(ConstructingObjectParser.constructorArg(), STATE);
194+
PARSER.declareLong(ConstructingObjectParser.constructorArg(), START_TIME);
195+
PARSER.declareString(ConstructingObjectParser.optionalConstructorArg(), FAILURE);
196+
}
197+
198+
private final SnapshotId snapshotId;
199+
private final String state;
200+
private final long startTime;
201+
private final String failure;
202+
203+
public SnapshotInProgress(SnapshotId snapshotId, String state, long startTime, @Nullable String failure) {
204+
this.snapshotId = snapshotId;
205+
this.state = state;
206+
this.startTime = startTime;
207+
this.failure = failure;
208+
}
209+
210+
private static SnapshotInProgress parse(XContentParser parser, String name) {
211+
return PARSER.apply(parser, null);
212+
}
213+
214+
@Override
215+
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
216+
builder.startObject();
217+
builder.field(NAME.getPreferredName(), snapshotId.getName());
218+
builder.field(UUID.getPreferredName(), snapshotId.getUUID());
219+
builder.field(STATE.getPreferredName(), state);
220+
builder.timeField(START_TIME.getPreferredName(), "start_time", startTime);
221+
if (failure != null) {
222+
builder.field(FAILURE.getPreferredName(), failure);
223+
}
224+
builder.endObject();
225+
return builder;
226+
}
227+
228+
@Override
229+
public int hashCode() {
230+
return Objects.hash(snapshotId, state, startTime, failure);
231+
}
232+
233+
@Override
234+
public boolean equals(Object obj) {
235+
if (obj == null) {
236+
return false;
237+
}
238+
239+
if (obj.getClass() != getClass()) {
240+
return false;
241+
}
242+
SnapshotInProgress other = (SnapshotInProgress) obj;
243+
return Objects.equals(snapshotId, other.snapshotId) &&
244+
Objects.equals(state, other.state) &&
245+
startTime == other.startTime &&
246+
Objects.equals(failure, other.failure);
247+
}
248+
249+
@Override
250+
public String toString() {
251+
return Strings.toString(this);
252+
}
253+
}
157254
}

client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/ILMDocumentationIT.java

+2
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,8 @@ public void onFailure(Exception e) {
854854
long nextPolicyExecutionDate = policyMeta.getNextExecution();
855855
SnapshotInvocationRecord lastSuccess = policyMeta.getLastSuccess();
856856
SnapshotInvocationRecord lastFailure = policyMeta.getLastFailure();
857+
SnapshotLifecyclePolicyMetadata.SnapshotInProgress inProgress =
858+
policyMeta.getSnapshotInProgress();
857859
SnapshotLifecyclePolicy retrievedPolicy = policyMeta.getPolicy(); // <2>
858860
String id = retrievedPolicy.getId();
859861
String snapshotNameFormat = retrievedPolicy.getName();

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/slm/SnapshotLifecyclePolicy.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@
4747
public class SnapshotLifecyclePolicy extends AbstractDiffable<SnapshotLifecyclePolicy>
4848
implements Writeable, Diffable<SnapshotLifecyclePolicy>, ToXContentObject {
4949

50+
public static final String POLICY_ID_METADATA_FIELD = "policy";
51+
5052
private final String id;
5153
private final String name;
5254
private final String schedule;
@@ -59,7 +61,6 @@ public class SnapshotLifecyclePolicy extends AbstractDiffable<SnapshotLifecycleP
5961
private static final ParseField CONFIG = new ParseField("config");
6062
private static final IndexNameExpressionResolver.DateMathExpressionResolver DATE_MATH_RESOLVER =
6163
new IndexNameExpressionResolver.DateMathExpressionResolver();
62-
private static final String POLICY_ID_METADATA_FIELD = "policy";
6364
private static final String METADATA_FIELD_NAME = "metadata";
6465

6566
@SuppressWarnings("unchecked")

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/slm/SnapshotLifecyclePolicyItem.java

+106-3
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,17 @@
66

77
package org.elasticsearch.xpack.core.slm;
88

9+
import org.elasticsearch.cluster.SnapshotsInProgress;
910
import org.elasticsearch.common.Nullable;
11+
import org.elasticsearch.common.ParseField;
1012
import org.elasticsearch.common.Strings;
1113
import org.elasticsearch.common.io.stream.StreamInput;
1214
import org.elasticsearch.common.io.stream.StreamOutput;
1315
import org.elasticsearch.common.io.stream.Writeable;
1416
import org.elasticsearch.common.xcontent.ToXContentFragment;
17+
import org.elasticsearch.common.xcontent.ToXContentObject;
1518
import org.elasticsearch.common.xcontent.XContentBuilder;
19+
import org.elasticsearch.snapshots.SnapshotId;
1620

1721
import java.io.IOException;
1822
import java.util.Objects;
@@ -24,21 +28,27 @@
2428
*/
2529
public class SnapshotLifecyclePolicyItem implements ToXContentFragment, Writeable {
2630

31+
private static final ParseField SNAPSHOT_IN_PROGRESS = new ParseField("in_progress");
32+
2733
private final SnapshotLifecyclePolicy policy;
2834
private final long version;
2935
private final long modifiedDate;
36+
@Nullable
37+
private final SnapshotInProgress snapshotInProgress;
3038

3139
@Nullable
3240
private final SnapshotInvocationRecord lastSuccess;
3341

3442
@Nullable
3543
private final SnapshotInvocationRecord lastFailure;
36-
public SnapshotLifecyclePolicyItem(SnapshotLifecyclePolicyMetadata policyMetadata) {
44+
public SnapshotLifecyclePolicyItem(SnapshotLifecyclePolicyMetadata policyMetadata,
45+
@Nullable SnapshotInProgress snapshotInProgress) {
3746
this.policy = policyMetadata.getPolicy();
3847
this.version = policyMetadata.getVersion();
3948
this.modifiedDate = policyMetadata.getModifiedDate();
4049
this.lastSuccess = policyMetadata.getLastSuccess();
4150
this.lastFailure = policyMetadata.getLastFailure();
51+
this.snapshotInProgress = snapshotInProgress;
4252
}
4353

4454
public SnapshotLifecyclePolicyItem(StreamInput in) throws IOException {
@@ -47,17 +57,20 @@ public SnapshotLifecyclePolicyItem(StreamInput in) throws IOException {
4757
this.modifiedDate = in.readVLong();
4858
this.lastSuccess = in.readOptionalWriteable(SnapshotInvocationRecord::new);
4959
this.lastFailure = in.readOptionalWriteable(SnapshotInvocationRecord::new);
60+
this.snapshotInProgress = in.readOptionalWriteable(SnapshotInProgress::new);
5061
}
5162

5263
// For testing
5364

5465
SnapshotLifecyclePolicyItem(SnapshotLifecyclePolicy policy, long version, long modifiedDate,
55-
SnapshotInvocationRecord lastSuccess, SnapshotInvocationRecord lastFailure) {
66+
SnapshotInvocationRecord lastSuccess, SnapshotInvocationRecord lastFailure,
67+
@Nullable SnapshotInProgress snapshotInProgress) {
5668
this.policy = policy;
5769
this.version = version;
5870
this.modifiedDate = modifiedDate;
5971
this.lastSuccess = lastSuccess;
6072
this.lastFailure = lastFailure;
73+
this.snapshotInProgress = snapshotInProgress;
6174
}
6275
public SnapshotLifecyclePolicy getPolicy() {
6376
return policy;
@@ -79,13 +92,19 @@ public SnapshotInvocationRecord getLastFailure() {
7992
return lastFailure;
8093
}
8194

95+
@Nullable
96+
public SnapshotInProgress getSnapshotInProgress() {
97+
return this.snapshotInProgress;
98+
}
99+
82100
@Override
83101
public void writeTo(StreamOutput out) throws IOException {
84102
policy.writeTo(out);
85103
out.writeVLong(version);
86104
out.writeVLong(modifiedDate);
87105
out.writeOptionalWriteable(lastSuccess);
88106
out.writeOptionalWriteable(lastFailure);
107+
out.writeOptionalWriteable(snapshotInProgress);
89108
}
90109

91110
@Override
@@ -106,7 +125,8 @@ public boolean equals(Object obj) {
106125
version == other.version &&
107126
modifiedDate == other.modifiedDate &&
108127
Objects.equals(lastSuccess, other.lastSuccess) &&
109-
Objects.equals(lastFailure, other.lastFailure);
128+
Objects.equals(lastFailure, other.lastFailure) &&
129+
Objects.equals(snapshotInProgress, other.snapshotInProgress);
110130
}
111131

112132
@Override
@@ -124,6 +144,9 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
124144
}
125145
builder.timeField(SnapshotLifecyclePolicyMetadata.NEXT_EXECUTION_MILLIS.getPreferredName(),
126146
SnapshotLifecyclePolicyMetadata.NEXT_EXECUTION.getPreferredName(), policy.calculateNextExecution());
147+
if (snapshotInProgress != null) {
148+
builder.field(SNAPSHOT_IN_PROGRESS.getPreferredName(), snapshotInProgress);
149+
}
127150
builder.endObject();
128151
return builder;
129152
}
@@ -132,4 +155,84 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
132155
public String toString() {
133156
return Strings.toString(this);
134157
}
158+
159+
public static class SnapshotInProgress implements ToXContentObject, Writeable {
160+
private static final ParseField NAME = new ParseField("name");
161+
private static final ParseField UUID = new ParseField("uuid");
162+
private static final ParseField STATE = new ParseField("state");
163+
private static final ParseField START_TIME = new ParseField("start_time_millis");
164+
private static final ParseField FAILURE = new ParseField("failure");
165+
166+
private final SnapshotId snapshotId;
167+
private final SnapshotsInProgress.State state;
168+
private final long startTime;
169+
private final String failure;
170+
171+
public SnapshotInProgress(SnapshotId snapshotId, SnapshotsInProgress.State state, long startTime, @Nullable String failure) {
172+
this.snapshotId = snapshotId;
173+
this.state = state;
174+
this.startTime = startTime;
175+
this.failure = failure;
176+
}
177+
178+
SnapshotInProgress(StreamInput in) throws IOException {
179+
this.snapshotId = new SnapshotId(in);
180+
this.state = in.readEnum(SnapshotsInProgress.State.class);
181+
this.startTime = in.readVLong();
182+
this.failure = in.readOptionalString();
183+
}
184+
185+
public static SnapshotInProgress fromEntry(SnapshotsInProgress.Entry entry) {
186+
return new SnapshotInProgress(entry.snapshot().getSnapshotId(),
187+
entry.state(), entry.startTime(), entry.failure());
188+
}
189+
190+
@Override
191+
public void writeTo(StreamOutput out) throws IOException {
192+
this.snapshotId.writeTo(out);
193+
out.writeEnum(this.state);
194+
out.writeVLong(this.startTime);
195+
out.writeOptionalString(this.failure);
196+
}
197+
198+
@Override
199+
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
200+
builder.startObject();
201+
builder.field(NAME.getPreferredName(), snapshotId.getName());
202+
builder.field(UUID.getPreferredName(), snapshotId.getUUID());
203+
builder.field(STATE.getPreferredName(), state);
204+
builder.timeField(START_TIME.getPreferredName(), "start_time", startTime);
205+
if (failure != null) {
206+
builder.field(FAILURE.getPreferredName(), failure);
207+
}
208+
builder.endObject();
209+
return builder;
210+
}
211+
212+
@Override
213+
public int hashCode() {
214+
return Objects.hash(snapshotId, state, startTime, failure);
215+
}
216+
217+
@Override
218+
public boolean equals(Object obj) {
219+
if (obj == null) {
220+
return false;
221+
}
222+
223+
if (obj.getClass() != getClass()) {
224+
return false;
225+
}
226+
SnapshotInProgress other = (SnapshotInProgress) obj;
227+
return Objects.equals(snapshotId, other.snapshotId) &&
228+
Objects.equals(state, other.state) &&
229+
startTime == other.startTime &&
230+
Objects.equals(failure, other.failure);
231+
}
232+
233+
@Override
234+
public String toString() {
235+
return Strings.toString(this);
236+
}
237+
}
135238
}

0 commit comments

Comments
 (0)