/* * 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; } }