/*
* Copyright (c) 2014 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.management.backup;
import java.util.List;
import java.util.TreeSet;
public class BackupFileSet extends TreeSet<BackupFile> {
int quorumSize;
public BackupFileSet(int quorumSize) {
this.quorumSize = quorumSize;
}
public BackupFileSet subsetOf(String tag, BackupType type, String node) {
BackupFileSet set = new BackupFileSet(this.quorumSize);
for (BackupFile file : this) {
if (file.matches(tag, type, node)) {
set.add(file);
}
}
return set;
}
public void addAll(List<BackupSetInfo> infos, String node) {
for (BackupSetInfo info : infos) {
this.add(new BackupFile(info, node));
}
}
public TreeSet<String> uniqueNodes() {
TreeSet<String> uniqueNodes = new TreeSet<>();
for (BackupFile file : this) {
uniqueNodes.add(file.node);
}
return uniqueNodes;
}
public TreeSet<String> uniqueTags() {
TreeSet<String> tagSet = new TreeSet<>();
for (BackupFile file : this) {
tagSet.add(file.tag);
}
return tagSet;
}
/**
* Given a list of files for a tag, check if they can form a valid backup set
*/
public boolean isValid() {
if (size() == 0) {
return false;
}
String backupTag = this.first().tag;
BackupFileSet zkFiles = subsetOf(backupTag, BackupType.zk, null);
BackupFileSet dbFiles = subsetOf(backupTag, BackupType.db, null);
BackupFileSet geodbFiles = subsetOf(backupTag, BackupType.geodb, null);
BackupFileSet geodbmultivdcFiles = subsetOf(backupTag, BackupType.geodbmultivdc, null);
BackupFileSet infoFile = subsetOf(backupTag, BackupType.info, null);
if (zkFiles.size() == 0 || dbFiles.size() < this.quorumSize || geodbFiles.size() < this.quorumSize
&& geodbmultivdcFiles.size() < this.quorumSize || infoFile.size() == 0) {
return false;
}
return true;
}
}