in bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ZoneawareEnsemblePlacementPolicyImpl.java [862:956]
public PlacementPolicyAdherence isEnsembleAdheringToPlacementPolicy(List<BookieId> ensembleList,
int writeQuorumSize, int ackQuorumSize) {
if (CollectionUtils.isEmpty(ensembleList)) {
return PlacementPolicyAdherence.FAIL;
}
PlacementPolicyAdherence placementPolicyAdherence = PlacementPolicyAdherence.MEETS_STRICT;
rwLock.readLock().lock();
try {
HashMap<String, Set<String>> bookiesLocationInWriteSet = new HashMap<String, Set<String>>();
HashMap<String, Integer> numOfBookiesInZones = new HashMap<String, Integer>();
BookieId bookieNode;
if (ensembleList.size() % writeQuorumSize != 0) {
placementPolicyAdherence = PlacementPolicyAdherence.FAIL;
if (LOG.isDebugEnabled()) {
LOG.debug(
"For ensemble: {}, ensembleSize: {} is not a multiple of writeQuorumSize: {}",
ensembleList, ensembleList.size(), writeQuorumSize);
}
return placementPolicyAdherence;
}
if (writeQuorumSize <= minNumZonesPerWriteQuorum) {
placementPolicyAdherence = PlacementPolicyAdherence.FAIL;
if (LOG.isDebugEnabled()) {
LOG.debug(
"For ensemble: {}, writeQuorumSize: {} is less than or equal to"
+ " minNumZonesPerWriteQuorum: {}",
ensembleList, writeQuorumSize, minNumZonesPerWriteQuorum);
}
return placementPolicyAdherence;
}
int desiredNumZonesPerWriteQuorumForThisEnsemble = Math.min(writeQuorumSize, desiredNumZonesPerWriteQuorum);
for (int i = 0; i < ensembleList.size(); i++) {
bookiesLocationInWriteSet.clear();
numOfBookiesInZones.clear();
for (int j = 0; j < writeQuorumSize; j++) {
int indexOfNode = (i + j) % ensembleList.size();
bookieNode = ensembleList.get(indexOfNode);
ZoneAwareNodeLocation nodeLocation = getZoneAwareNodeLocation(bookieNode);
if (nodeLocation.equals(unresolvedNodeLocation)) {
placementPolicyAdherence = PlacementPolicyAdherence.FAIL;
if (LOG.isDebugEnabled()) {
LOG.debug("ensemble: {}, contains bookie: {} for which network location is unresolvable",
ensembleList, bookieNode);
}
return placementPolicyAdherence;
}
String zone = nodeLocation.getZone();
String upgradeDomain = nodeLocation.getUpgradeDomain();
Set<String> udsOfThisZoneInThisWriteSet = bookiesLocationInWriteSet.get(zone);
if (udsOfThisZoneInThisWriteSet == null) {
udsOfThisZoneInThisWriteSet = new HashSet<String>();
udsOfThisZoneInThisWriteSet.add(upgradeDomain);
bookiesLocationInWriteSet.put(zone, udsOfThisZoneInThisWriteSet);
numOfBookiesInZones.put(zone, 1);
} else {
udsOfThisZoneInThisWriteSet.add(upgradeDomain);
Integer numOfNodesInAZone = numOfBookiesInZones.get(zone);
numOfBookiesInZones.put(zone, (numOfNodesInAZone + 1));
}
}
if (numOfBookiesInZones.entrySet().size() < minNumZonesPerWriteQuorum) {
placementPolicyAdherence = PlacementPolicyAdherence.FAIL;
if (LOG.isDebugEnabled()) {
LOG.debug("in ensemble: {}, writeset starting at: {} doesn't contain bookies from"
+ " minNumZonesPerWriteQuorum: {}", ensembleList, i, minNumZonesPerWriteQuorum);
}
return placementPolicyAdherence;
} else if (numOfBookiesInZones.entrySet().size() >= desiredNumZonesPerWriteQuorumForThisEnsemble) {
if (!validateMinUDsAreMaintained(numOfBookiesInZones, bookiesLocationInWriteSet)) {
placementPolicyAdherence = PlacementPolicyAdherence.FAIL;
if (LOG.isDebugEnabled()) {
LOG.debug("in ensemble: {}, writeset starting at: {} doesn't maintain min of 2 UDs"
+ " when there are multiple bookies from the same zone.", ensembleList, i);
}
return placementPolicyAdherence;
}
} else {
if (!validateMinUDsAreMaintained(numOfBookiesInZones, bookiesLocationInWriteSet)) {
placementPolicyAdherence = PlacementPolicyAdherence.FAIL;
if (LOG.isDebugEnabled()) {
LOG.debug("in ensemble: {}, writeset starting at: {} doesn't maintain min of 2 UDs"
+ " when there are multiple bookies from the same zone.", ensembleList, i);
}
return placementPolicyAdherence;
}
if (placementPolicyAdherence == PlacementPolicyAdherence.MEETS_STRICT) {
placementPolicyAdherence = PlacementPolicyAdherence.MEETS_SOFT;
}
}
}
} finally {
rwLock.readLock().unlock();
}
return placementPolicyAdherence;
}