public PlacementPolicyAdherence isEnsembleAdheringToPlacementPolicy()

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;
    }