/* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch licenses this file to you under * the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.elasticsearch.action.admin.cluster.snapshots.status; import org.elasticsearch.action.support.broadcast.BroadcastShardResponse; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.index.snapshots.IndexShardSnapshotStatus; import java.io.IOException; public class SnapshotIndexShardStatus extends BroadcastShardResponse implements ToXContent { private SnapshotIndexShardStage stage = SnapshotIndexShardStage.INIT; private SnapshotStats stats; private String nodeId; private String failure; private SnapshotIndexShardStatus() { } SnapshotIndexShardStatus(ShardId shardId, SnapshotIndexShardStage stage) { super(shardId); this.stage = stage; this.stats = new SnapshotStats(); } SnapshotIndexShardStatus(ShardId shardId, IndexShardSnapshotStatus indexShardStatus) { this(shardId, indexShardStatus, null); } SnapshotIndexShardStatus(ShardId shardId, IndexShardSnapshotStatus indexShardStatus, String nodeId) { super(shardId); switch (indexShardStatus.stage()) { case INIT: stage = SnapshotIndexShardStage.INIT; break; case STARTED: stage = SnapshotIndexShardStage.STARTED; break; case FINALIZE: stage = SnapshotIndexShardStage.FINALIZE; break; case DONE: stage = SnapshotIndexShardStage.DONE; break; case FAILURE: stage = SnapshotIndexShardStage.FAILURE; break; default: throw new IllegalArgumentException("Unknown stage type " + indexShardStatus.stage()); } stats = new SnapshotStats(indexShardStatus); failure = indexShardStatus.failure(); this.nodeId = nodeId; } /** * Returns snapshot stage */ public SnapshotIndexShardStage getStage() { return stage; } /** * Returns snapshot stats */ public SnapshotStats getStats() { return stats; } /** * Returns node id of the node where snapshot is currently running */ public String getNodeId() { return nodeId; } /** * Returns reason for snapshot failure */ public String getFailure() { return failure; } public static SnapshotIndexShardStatus readShardSnapshotStatus(StreamInput in) throws IOException { SnapshotIndexShardStatus shardStatus = new SnapshotIndexShardStatus(); shardStatus.readFrom(in); return shardStatus; } @Override public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); out.writeByte(stage.value()); stats.writeTo(out); out.writeOptionalString(nodeId); out.writeOptionalString(failure); } @Override public void readFrom(StreamInput in) throws IOException { super.readFrom(in); stage = SnapshotIndexShardStage.fromValue(in.readByte()); stats = SnapshotStats.readSnapshotStats(in); nodeId = in.readOptionalString(); failure = in.readOptionalString(); } static final class Fields { static final String STAGE = "stage"; static final String REASON = "reason"; static final String NODE = "node"; } @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(Integer.toString(getShardId().getId())); builder.field(Fields.STAGE, getStage()); stats.toXContent(builder, params); if (getNodeId() != null) { builder.field(Fields.NODE, getNodeId()); } if (getFailure() != null) { builder.field(Fields.REASON, getFailure()); } builder.endObject(); return builder; } }