in helix-core/src/main/java/org/apache/helix/tools/ClusterVerifiers/BestPossibleExternalViewVerifier.java [247:379]
protected synchronized boolean verifyState() {
try {
PropertyKey.Builder keyBuilder = _accessor.keyBuilder();
_dataProvider.requireFullRefresh();
_dataProvider.refresh(_accessor);
_dataProvider.setClusterEventId("ClusterStateVerifier");
Map<String, IdealState> idealStates = new HashMap<>(_dataProvider.getIdealStates());
// filter out all resources that use Task state model
idealStates.entrySet()
.removeIf(pair -> pair.getValue().getStateModelDefRef().equals(TaskConstants.STATE_MODEL_NAME));
// verify live instances.
if (_expectLiveInstances != null && !_expectLiveInstances.isEmpty()) {
Set<String> actualLiveNodes = _dataProvider.getLiveInstances().keySet();
if (!_expectLiveInstances.equals(actualLiveNodes)) {
LOG.warn("Live instances are not as expected. Actual live nodes: " + actualLiveNodes
.toString());
return false;
}
}
Map<String, ExternalView> extViews =
_accessor.getChildValuesMap(keyBuilder.externalViews(), true);
if (extViews == null) {
extViews = Collections.emptyMap();
}
// Filter resources if requested
if (_resources != null && !_resources.isEmpty()) {
// Find if there are waged-enabled resources among the requested resources
boolean hasRequestedWagedResources = _resources.stream().anyMatch(
resourceEntry -> WagedValidationUtil.isWagedEnabled(idealStates.get(resourceEntry)));
Set<String> resourcesToRetain = new HashSet<>(_resources);
if (hasRequestedWagedResources) {
// If waged-enabled resources are found, retain all the waged-enabled resources and the
// user requested resources.
resourcesToRetain.addAll(idealStates.keySet().stream().filter(
resourceEntry -> WagedValidationUtil.isWagedEnabled(idealStates.get(resourceEntry)))
.collect(Collectors.toSet()));
}
idealStates.keySet().retainAll(resourcesToRetain);
extViews.keySet().retainAll(resourcesToRetain);
}
// if externalView is not empty and idealState doesn't exist
// add empty idealState for the resource
for (String resource : extViews.keySet()) {
if (!idealStates.containsKey(resource)) {
ExternalView ev = extViews.get(resource);
IdealState is = new IdealState(resource);
is.getRecord().setSimpleFields(ev.getRecord().getSimpleFields());
idealStates.put(resource, is);
}
}
// calculate best possible state
BestPossibleStateOutput bestPossOutput = calcBestPossState(_dataProvider, idealStates);
Map<String, Map<Partition, Map<String, String>>> bestPossStateMap =
bestPossOutput.getStateMap();
// set error states
if (_errStates != null) {
for (String resourceName : _errStates.keySet()) {
Map<String, String> partErrStates = _errStates.get(resourceName);
for (String partitionName : partErrStates.keySet()) {
String instanceName = partErrStates.get(partitionName);
if (!bestPossStateMap.containsKey(resourceName)) {
bestPossStateMap.put(resourceName, new HashMap<Partition, Map<String, String>>());
}
Partition partition = new Partition(partitionName);
if (!bestPossStateMap.get(resourceName).containsKey(partition)) {
bestPossStateMap.get(resourceName).put(partition, new HashMap<String, String>());
}
bestPossStateMap.get(resourceName).get(partition)
.put(instanceName, HelixDefinedState.ERROR.toString());
}
}
}
// Process resources to retain only those requested
if (_resources != null && !_resources.isEmpty()) {
idealStates.keySet().retainAll(_resources);
extViews.keySet().retainAll(_resources);
}
for (String resourceName : idealStates.keySet()) {
IdealState is = idealStates.get(resourceName);
ExternalView extView = extViews.get(resourceName);
if (extView == null) {
if (is.isExternalViewDisabled()) {
continue;
}
LOG.warn("externalView for " + resourceName
+ " is not available, check if best possible state is available.");
extView = new ExternalView(resourceName);
}
// step 0: remove empty map and DROPPED state from best possible state
PartitionStateMap bpStateMap =
bestPossOutput.getPartitionStateMap(resourceName);
StateModelDefinition stateModelDef = _dataProvider.getStateModelDef(is.getStateModelDefRef());
if (stateModelDef == null) {
LOG.error(
"State model definition " + is.getStateModelDefRef() + " for resource not found!" + is
.getResourceName());
return false;
}
boolean result = verifyExternalView(extView, bpStateMap, stateModelDef);
if (!result) {
if (LOG.isDebugEnabled()) {
LOG.debug("verifyExternalView fails for " + resourceName + "! ExternalView: " + extView
+ " BestPossibleState: " + bpStateMap);
} else {
LOG.warn("verifyExternalView fails for " + resourceName
+ "! ExternalView does not match BestPossibleState");
}
return false;
}
}
return true;
} catch (Exception e) {
LOG.error("exception in verification", e);
return false;
}
}