}
// System.out.println("stateMap: " + bestPossStateMap);
for (String resourceName : idealStates.keySet()) {
ExternalView extView = extViews.get(resourceName);
if (extView == null) {
LOG.info("externalView for " + resourceName + " is not available");
return false;
}
// step 0: remove empty map and DROPPED state from best possible state
Map<String, Map<String, String>> bpStateMap =
ResourceAssignment.stringMapsFromReplicaMaps(bestPossOutput.getResourceAssignment(
ResourceId.from(resourceName)).getResourceMap());
Iterator<Entry<String, Map<String, String>>> iter = bpStateMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, Map<String, String>> entry = iter.next();
Map<String, String> instanceStateMap = entry.getValue();
if (instanceStateMap.isEmpty()) {
iter.remove();
} else {
// remove instances with DROPPED state
Iterator<Map.Entry<String, String>> insIter = instanceStateMap.entrySet().iterator();
while (insIter.hasNext()) {
Map.Entry<String, String> insEntry = insIter.next();
String state = insEntry.getValue();
if (state.equalsIgnoreCase(HelixDefinedState.DROPPED.toString())) {
insIter.remove();
}
}
}
}
// System.err.println("resource: " + resourceName + ", bpStateMap: " + bpStateMap);
// step 1: externalView and bestPossibleState has equal size
int extViewSize = extView.getRecord().getMapFields().size();
int bestPossStateSize =
bestPossOutput.getResourceAssignment(ResourceId.from(resourceName))
.getMappedPartitionIds().size();
if (extViewSize != bestPossStateSize) {
LOG.info("exterView size (" + extViewSize + ") is different from bestPossState size ("
+ bestPossStateSize + ") for resource: " + resourceName);
// System.err.println("exterView size (" + extViewSize
// + ") is different from bestPossState size (" + bestPossStateSize
// + ") for resource: " + resourceName);
// System.out.println("extView: " + extView.getRecord().getMapFields());
// System.out.println("bestPossState: " +
// bestPossOutput.getResourceMap(resourceName));
return false;
}
// step 2: every entry in external view is contained in best possible state
for (String partition : extView.getRecord().getMapFields().keySet()) {
Map<String, String> evInstanceStateMap = extView.getRecord().getMapField(partition);
Map<String, String> bpInstanceStateMap =
ResourceAssignment.stringMapFromReplicaMap(bestPossOutput.getResourceAssignment(
ResourceId.from(resourceName)).getReplicaMap(PartitionId.from(partition)));
boolean result =