return options;
}
public static void main(String[] args) throws Exception {
setupParser();
OptionSet options = getValidOptions(args);
// Required args
String currentClusterXML = (String) options.valueOf("current-cluster");
String currentStoresXML = (String) options.valueOf("current-stores");
String interimClusterXML = new String(currentClusterXML);
if(options.has("interim-cluster")) {
interimClusterXML = (String) options.valueOf("interim-cluster");
}
String finalStoresXML = new String(currentStoresXML);
if(options.has("final-stores")) {
finalStoresXML = (String) options.valueOf("final-stores");
}
Cluster currentCluster = new ClusterMapper().readCluster(new File(currentClusterXML));
List<StoreDefinition> currentStoreDefs = new StoreDefinitionsMapper().readStoreList(new File(currentStoresXML));
RebalanceUtils.validateClusterStores(currentCluster, currentStoreDefs);
Cluster interimCluster = new ClusterMapper().readCluster(new File(interimClusterXML));
List<StoreDefinition> finalStoreDefs = new StoreDefinitionsMapper().readStoreList(new File(finalStoresXML));
RebalanceUtils.validateClusterStores(interimCluster, finalStoreDefs);
RebalanceUtils.validateCurrentInterimCluster(currentCluster, interimCluster);
// Optional administrivia args
int attempts = CmdUtils.valueOf(options,
"attempts",
Repartitioner.DEFAULT_REPARTITION_ATTEMPTS);
String outputDir = null;
if(options.has("output-dir")) {
outputDir = (String) options.valueOf("output-dir");
}
// Optional repartitioning args
boolean disableNodeBalancing = options.has("disable-node-balancing");
boolean disableZoneBalancing = options.has("disable-zone-balancing");
boolean enableRandomSwaps = options.has("enable-random-swaps");
int randomSwapAttempts = CmdUtils.valueOf(options,
"random-swap-attempts",
Repartitioner.DEFAULT_RANDOM_SWAP_ATTEMPTS);
int randomSwapSuccesses = CmdUtils.valueOf(options,
"random-swap-successes",
Repartitioner.DEFAULT_RANDOM_SWAP_SUCCESSES);
List<Integer> randomSwapZoneIds = CmdUtils.valuesOf(options,
"random-swap-zoneids",
Repartitioner.DEFAULT_RANDOM_SWAP_ZONE_IDS);
boolean enableGreedySwaps = options.has("enable-greedy-swaps");
int greedySwapAttempts = CmdUtils.valueOf(options,
"greedy-swap-attempts",
Repartitioner.DEFAULT_GREEDY_SWAP_ATTEMPTS);
int greedyMaxPartitionsPerNode = CmdUtils.valueOf(options,
"greedy-max-partitions-per-node",
Repartitioner.DEFAULT_GREEDY_MAX_PARTITIONS_PER_NODE);
int greedyMaxPartitionsPerZone = CmdUtils.valueOf(options,
"greedy-max-partitions-per-zone",
Repartitioner.DEFAULT_GREEDY_MAX_PARTITIONS_PER_ZONE);
List<Integer> greedySwapZoneIds = CmdUtils.valuesOf(options,
"greedy-swap-zoneids",
Repartitioner.DEFAULT_GREEDY_SWAP_ZONE_IDS);
int maxContiguousPartitionsPerZone = CmdUtils.valueOf(options,
"max-contiguous-partitions",
Repartitioner.DEFAULT_MAX_CONTIGUOUS_PARTITIONS);
// Sanity check optional repartitioning args
if(disableNodeBalancing && !enableRandomSwaps && !enableGreedySwaps
&& maxContiguousPartitionsPerZone == 0) {
printUsageAndDie("Did not enable any forms for repartitioning.");
}
if((options.has("random-swap-attempts") || options.has("random-swap-successes"))
&& !enableRandomSwaps) {
printUsageAndDie("Provided arguments for generate random swaps but did not enable the feature");
}
if((options.has("greedy-swap-attempts") || options.has("greedy-max-partitions-per-node") || options.has("greedy-max-partitions-per-zone"))
&& !enableGreedySwaps) {
printUsageAndDie("Provided arguments for generate greedy swaps but did not enable the feature");
}
Repartitioner.repartition(currentCluster,