blob: 4170861e0b1e7ff18a92325ea199e45c3c0f1a7c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.apache.solr.core.snapshots;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.solr.common.cloud.Replica;
import org.apache.solr.common.params.CoreAdminParams;
import org.apache.solr.common.util.NamedList;
import org.noggit.JSONWriter;
/**
* This class defines the meta-data about a collection level snapshot
*/
public class CollectionSnapshotMetaData implements JSONWriter.Writable {
public static class CoreSnapshotMetaData implements JSONWriter.Writable {
private final String coreName;
private final String indexDirPath;
private final long generationNumber;
private final boolean leader;
private final String shardId;
private final Collection<String> files;
public CoreSnapshotMetaData(String coreName, String indexDirPath, long generationNumber, String shardId, boolean leader, Collection<String> files) {
this.coreName = coreName;
this.indexDirPath = indexDirPath;
this.generationNumber = generationNumber;
this.shardId = shardId;
this.leader = leader;
this.files = files;
}
@SuppressWarnings({"unchecked", "rawtypes"})
public CoreSnapshotMetaData(NamedList resp) {
this.coreName = (String)resp.get(CoreAdminParams.CORE);
this.indexDirPath = (String)resp.get(SolrSnapshotManager.INDEX_DIR_PATH);
this.generationNumber = (Long)resp.get(SolrSnapshotManager.GENERATION_NUM);
this.shardId = (String)resp.get(SolrSnapshotManager.SHARD_ID);
this.leader = (Boolean)resp.get(SolrSnapshotManager.LEADER);
this.files = (Collection<String>)resp.get(SolrSnapshotManager.FILE_LIST);
}
public String getCoreName() {
return coreName;
}
public String getIndexDirPath() {
return indexDirPath;
}
public long getGenerationNumber() {
return generationNumber;
}
public Collection<String> getFiles() {
return files;
}
public String getShardId() {
return shardId;
}
public boolean isLeader() {
return leader;
}
@Override
public void write(JSONWriter arg0) {
LinkedHashMap<String, Object> info = new LinkedHashMap<String, Object>();
info.put(CoreAdminParams.CORE, getCoreName());
info.put(SolrSnapshotManager.INDEX_DIR_PATH, getIndexDirPath());
info.put(SolrSnapshotManager.GENERATION_NUM, getGenerationNumber());
info.put(SolrSnapshotManager.SHARD_ID, getShardId());
info.put(SolrSnapshotManager.LEADER, isLeader());
info.put(SolrSnapshotManager.FILE_LIST, getFiles());
arg0.write(info);
}
@SuppressWarnings({"rawtypes", "unchecked"})
public NamedList toNamedList() {
NamedList result = new NamedList();
result.add(CoreAdminParams.CORE, getCoreName());
result.add(SolrSnapshotManager.INDEX_DIR_PATH, getIndexDirPath());
result.add(SolrSnapshotManager.GENERATION_NUM, getGenerationNumber());
result.add(SolrSnapshotManager.SHARD_ID, getShardId());
result.add(SolrSnapshotManager.LEADER, isLeader());
result.add(SolrSnapshotManager.FILE_LIST, getFiles());
return result;
}
}
public static enum SnapshotStatus {
Successful, InProgress, Failed;
}
private final String name;
private final SnapshotStatus status;
private final Date creationDate;
private final List<CoreSnapshotMetaData> replicaSnapshots;
public CollectionSnapshotMetaData(String name) {
this(name, SnapshotStatus.InProgress, new Date(), Collections.<CoreSnapshotMetaData>emptyList());
}
public CollectionSnapshotMetaData(String name, SnapshotStatus status, Date creationTime, List<CoreSnapshotMetaData> replicaSnapshots) {
this.name = name;
this.status = status;
this.creationDate = creationTime;
this.replicaSnapshots = replicaSnapshots;
}
@SuppressWarnings("unchecked")
public CollectionSnapshotMetaData(Map<String, Object> data) {
this.name = (String)data.get(CoreAdminParams.NAME);
this.status = SnapshotStatus.valueOf((String)data.get(SolrSnapshotManager.SNAPSHOT_STATUS));
this.creationDate = new Date((Long)data.get(SolrSnapshotManager.CREATION_DATE));
this.replicaSnapshots = new ArrayList<>();
List<Object> r = (List<Object>) data.get(SolrSnapshotManager.SNAPSHOT_REPLICAS);
for (Object x : r) {
Map<String, Object> info = (Map<String, Object>)x;
String coreName = (String)info.get(CoreAdminParams.CORE);
String indexDirPath = (String)info.get(SolrSnapshotManager.INDEX_DIR_PATH);
long generationNumber = (Long) info.get(SolrSnapshotManager.GENERATION_NUM);
String shardId = (String)info.get(SolrSnapshotManager.SHARD_ID);
boolean leader = (Boolean) info.get(SolrSnapshotManager.LEADER);
Collection<String> files = (Collection<String>)info.get(SolrSnapshotManager.FILE_LIST);
replicaSnapshots.add(new CoreSnapshotMetaData(coreName, indexDirPath, generationNumber, shardId, leader, files));
}
}
@SuppressWarnings("unchecked")
public CollectionSnapshotMetaData(NamedList<Object> data) {
this.name = (String)data.get(CoreAdminParams.NAME);
String statusStr = (String)data.get(SolrSnapshotManager.SNAPSHOT_STATUS);
this.creationDate = new Date((Long)data.get(SolrSnapshotManager.CREATION_DATE));
this.status = SnapshotStatus.valueOf(statusStr);
this.replicaSnapshots = new ArrayList<>();
NamedList<Object> r = (NamedList<Object>) data.get(SolrSnapshotManager.SNAPSHOT_REPLICAS);
for (Map.Entry<String,Object> x : r) {
NamedList<Object> info = (NamedList<Object>)x.getValue();
String coreName = (String)info.get(CoreAdminParams.CORE);
String indexDirPath = (String)info.get(SolrSnapshotManager.INDEX_DIR_PATH);
long generationNumber = (Long) info.get(SolrSnapshotManager.GENERATION_NUM);
String shardId = (String)info.get(SolrSnapshotManager.SHARD_ID);
boolean leader = (Boolean) info.get(SolrSnapshotManager.LEADER);
Collection<String> files = (Collection<String>)info.get(SolrSnapshotManager.FILE_LIST);
replicaSnapshots.add(new CoreSnapshotMetaData(coreName, indexDirPath, generationNumber, shardId, leader, files));
}
}
public String getName() {
return name;
}
public SnapshotStatus getStatus() {
return status;
}
public Date getCreationDate() {
return creationDate;
}
public List<CoreSnapshotMetaData> getReplicaSnapshots() {
return replicaSnapshots;
}
public List<CoreSnapshotMetaData> getReplicaSnapshotsForShard(String shardId) {
List<CoreSnapshotMetaData> result = new ArrayList<>();
for (CoreSnapshotMetaData d : replicaSnapshots) {
if (d.getShardId().equals(shardId)) {
result.add(d);
}
}
return result;
}
public boolean isSnapshotExists(String shardId, Replica r) {
for (CoreSnapshotMetaData d : replicaSnapshots) {
if (d.getShardId().equals(shardId) && d.getCoreName().equals(r.getCoreName())) {
return true;
}
}
return false;
}
public Collection<String> getShards() {
Set<String> result = new HashSet<>();
for (CoreSnapshotMetaData d : replicaSnapshots) {
result.add(d.getShardId());
}
return result;
}
@Override
public void write(JSONWriter arg0) {
LinkedHashMap<String, Object> result = new LinkedHashMap<>();
result.put(CoreAdminParams.NAME, this.name);
result.put(SolrSnapshotManager.SNAPSHOT_STATUS, this.status.toString());
result.put(SolrSnapshotManager.CREATION_DATE, this.getCreationDate().getTime());
result.put(SolrSnapshotManager.SNAPSHOT_REPLICAS, this.replicaSnapshots);
arg0.write(result);
}
@SuppressWarnings({"rawtypes", "unchecked"})
public NamedList toNamedList() {
NamedList result = new NamedList();
result.add(CoreAdminParams.NAME, this.name);
result.add(SolrSnapshotManager.SNAPSHOT_STATUS, this.status.toString());
result.add(SolrSnapshotManager.CREATION_DATE, this.getCreationDate().getTime());
NamedList replicas = new NamedList();
for (CoreSnapshotMetaData x : replicaSnapshots) {
replicas.add(x.getCoreName(), x.toNamedList());
}
result.add(SolrSnapshotManager.SNAPSHOT_REPLICAS, replicas);
return result;
}
}