You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bookkeeper.apache.org by si...@apache.org on 2016/10/20 17:38:40 UTC

bookkeeper git commit: BOOKKEEPER-952: Fix RegionAwareEnsemblePlacementPolicy

Repository: bookkeeper
Updated Branches:
  refs/heads/master bf4a4d6a0 -> 4383b0b17


BOOKKEEPER-952: Fix RegionAwareEnsemblePlacementPolicy

allocate bookies evenly as much as possible across all regions

https://issues.apache.org/jira/browse/BOOKKEEPER-952

RB_ID=880463

Author: Yiming Zang <yz...@twitter.com>

Reviewers: sijie@apache.org <si...@apache.org>

Closes #61 from yzang/apache_master and squashes the following commits:

a0a9979 [Yiming Zang] fix Inefficient use of keySet iterator instead of entrySet iterator
d882c28 [Yiming Zang] fix RegionAwareEnsemblePlacementPolicy test case fix the algorithm for balanced placement across regions.


Project: http://git-wip-us.apache.org/repos/asf/bookkeeper/repo
Commit: http://git-wip-us.apache.org/repos/asf/bookkeeper/commit/4383b0b1
Tree: http://git-wip-us.apache.org/repos/asf/bookkeeper/tree/4383b0b1
Diff: http://git-wip-us.apache.org/repos/asf/bookkeeper/diff/4383b0b1

Branch: refs/heads/master
Commit: 4383b0b171d5fdfcdfa55c196998bbc6b7fdc260
Parents: bf4a4d6
Author: Yiming Zang <yz...@twitter.com>
Authored: Thu Oct 20 10:38:33 2016 -0700
Committer: Sijie Guo <si...@apache.org>
Committed: Thu Oct 20 10:38:33 2016 -0700

----------------------------------------------------------------------
 .../RegionAwareEnsemblePlacementPolicy.java     | 31 ++++++++++----------
 1 file changed, 15 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/bookkeeper/blob/4383b0b1/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RegionAwareEnsemblePlacementPolicy.java
----------------------------------------------------------------------
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RegionAwareEnsemblePlacementPolicy.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RegionAwareEnsemblePlacementPolicy.java
index abdcb61..181feca 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RegionAwareEnsemblePlacementPolicy.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RegionAwareEnsemblePlacementPolicy.java
@@ -142,12 +142,12 @@ public class RegionAwareEnsemblePlacementPolicy extends RackawareEnsemblePlaceme
             }
         }
 
-        for(String region: perRegionPlacement.keySet()) {
-            Set<BookieSocketAddress> regionSet = perRegionClusterChange.get(region);
+        for (Map.Entry<String, TopologyAwareEnsemblePlacementPolicy> regionEntry : perRegionPlacement.entrySet()) {
+            Set<BookieSocketAddress> regionSet = perRegionClusterChange.get(regionEntry.getKey());
             if (null == regionSet) {
                 regionSet = new HashSet<BookieSocketAddress>();
             }
-            perRegionPlacement.get(region).handleBookiesThatJoined(regionSet);
+            regionEntry.getValue().handleBookiesThatJoined(regionSet);
         }
     }
 
@@ -289,12 +289,11 @@ public class RegionAwareEnsemblePlacementPolicy extends RackawareEnsemblePlaceme
                 regionsWiseAllocation.put(region, Pair.of(0,0));
             }
             int remainingEnsembleBeforeIteration;
+            int numRemainingRegions;
             Set<String> regionsReachedMaxAllocation = new HashSet<String>();
             RRTopologyAwareCoverageEnsemble ensemble;
-            int iteration = 0;
             do {
-                LOG.info("RegionAwareEnsemblePlacementPolicy#newEnsemble Iteration {}", iteration++);
-                int numRemainingRegions = numRegionsAvailable - regionsReachedMaxAllocation.size();
+                numRemainingRegions = numRegionsAvailable - regionsReachedMaxAllocation.size();
                 ensemble = new RRTopologyAwareCoverageEnsemble(ensembleSize,
                                     writeQuorumSize,
                                     ackQuorumSize,
@@ -305,6 +304,7 @@ public class RegionAwareEnsemblePlacementPolicy extends RackawareEnsemblePlaceme
                                     effectiveMinRegionsForDurability > 0 ? new HashSet<String>(perRegionPlacement.keySet()) : null,
                                     effectiveMinRegionsForDurability);
                 remainingEnsembleBeforeIteration = remainingEnsemble;
+                int regionsToAllocate = numRemainingRegions;
                 for (Map.Entry<String, Pair<Integer, Integer>> regionEntry: regionsWiseAllocation.entrySet()) {
                     String region = regionEntry.getKey();
                     final Pair<Integer, Integer> currentAllocation = regionEntry.getValue();
@@ -314,12 +314,11 @@ public class RegionAwareEnsemblePlacementPolicy extends RackawareEnsemblePlaceme
                             LOG.error("Inconsistent State: This should never happen");
                             throw new BKException.BKNotEnoughBookiesException();
                         }
-
-                        int addToEnsembleSize = Math.min(remainingEnsemble, (remainingEnsembleBeforeIteration + numRemainingRegions - 1) / numRemainingRegions);
+                        // try to place the bookies as balance as possible across all the regions
+                        int addToEnsembleSize = Math.min(remainingEnsemble, remainingEnsemble / regionsToAllocate + (remainingEnsemble % regionsToAllocate == 0 ? 0 : 1));
                         boolean success = false;
-                        while(addToEnsembleSize > 0) {
+                        while (addToEnsembleSize > 0) {
                             int addToWriteQuorum = Math.max(1, Math.min(remainingWriteQuorum, Math.round(1.0f * writeQuorumSize * addToEnsembleSize / ensembleSize)));
-
                             // Temp ensemble will be merged back into the ensemble only if we are able to successfully allocate
                             // the target number of bookies in this region; if we fail because we dont have enough bookies; then we
                             // retry the process with a smaller target
@@ -327,14 +326,15 @@ public class RegionAwareEnsemblePlacementPolicy extends RackawareEnsemblePlaceme
                             int newEnsembleSize = currentAllocation.getLeft() + addToEnsembleSize;
                             int newWriteQuorumSize = currentAllocation.getRight() + addToWriteQuorum;
                             try {
-                                policyWithinRegion.newEnsemble(newEnsembleSize, newWriteQuorumSize, newWriteQuorumSize, excludeBookies, tempEnsemble, tempEnsemble);
+                                List<BookieSocketAddress> allocated = policyWithinRegion.newEnsemble(newEnsembleSize, newWriteQuorumSize, newWriteQuorumSize, excludeBookies, tempEnsemble, tempEnsemble);
                                 ensemble = tempEnsemble;
                                 remainingEnsemble -= addToEnsembleSize;
-                                remainingWriteQuorum -= writeQuorumSize;
+                                remainingWriteQuorum -= addToWriteQuorum;
                                 regionsWiseAllocation.put(region, Pair.of(newEnsembleSize, newWriteQuorumSize));
                                 success = true;
-                                LOG.info("Allocated {} bookies in region {} : {}",
-                                        new Object[]{newEnsembleSize, region, ensemble});
+                                regionsToAllocate--;
+                                LOG.info("Region {} allocating bookies with ensemble size {} and write quorum size {} : {}",
+                                    new Object[]{region, newEnsembleSize, newWriteQuorumSize, allocated});
                                 break;
                             } catch (BKException.BKNotEnoughBookiesException exc) {
                                 LOG.warn("Could not allocate {} bookies in region {}, try allocating {} bookies",
@@ -384,7 +384,7 @@ public class RegionAwareEnsemblePlacementPolicy extends RackawareEnsemblePlaceme
                     ensembleSize, bookieList);
                 throw new BKException.BKNotEnoughBookiesException();
             }
-
+            LOG.info("Bookies allocated successfully {}", ensemble);
             return ensemble.toList();
         } finally {
             rwLock.readLock().unlock();
@@ -597,6 +597,5 @@ public class RegionAwareEnsemblePlacementPolicy extends RackawareEnsemblePlaceme
             }
         }
         return finalList;
-
     }
 }