in server/src/main/java/org/apache/cassandra/sidecar/cluster/ConsistencyVerifiers.java [199:246]
public ConsistencyVerificationResult verify(Set<String> succeeded, Set<String> failed, InstanceSetByDc all)
{
// flatten and invert to get the mapping from instance to dc name
Map<String, String> dcByInstance = new HashMap<>(sum(all));
all.forEach((dcName, replicaSet) -> {
replicaSet.forEach(instance -> {
dcByInstance.put(instance, dcName);
});
});
UnaryOperator<String> dcClassifier = s -> {
String dc = dcByInstance.get(s);
return dc != null ? dc : UNKNOWN_DC;
};
InstanceSetByDc passedByDc = groupByDc(succeeded, dcClassifier);
validateNoneFromUnknownDc(passedByDc, "passed");
InstanceSetByDc failedByDc = groupByDc(failed, dcClassifier);
validateNoneFromUnknownDc(failedByDc, "failed");
// check whether passed instance can satisfy quorum in all DCs
boolean allSatisfied = true;
boolean anyFailed = false;
for (String dcName : all.keySet())
{
// if any of the datacenter cannot satisfy quorum locally
if (!geQuorum(passedByDc.get(dcName).size(), all.get(dcName).size()))
{
allSatisfied = false;
}
// if any of the datacenter has failed quorum locally
if (geQuorum(failedByDc.get(dcName).size(), all.get(dcName).size()))
{
anyFailed = true;
}
}
if (allSatisfied)
{
return ConsistencyVerificationResult.SATISFIED;
}
if (anyFailed)
{
return ConsistencyVerificationResult.FAILED;
}
return ConsistencyVerificationResult.PENDING;
}