Index: src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (revision 1326382) +++ src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (working copy) @@ -199,7 +199,8 @@ * @throws IOException */ public AssignmentManager(Server master, ServerManager serverManager, - CatalogTracker catalogTracker, final ExecutorService service, MasterMetrics metrics) + CatalogTracker catalogTracker, final LoadBalancer balancer, + final ExecutorService service, MasterMetrics metrics) throws KeeperException, IOException { super(master.getZooKeeper()); this.master = master; @@ -218,7 +219,7 @@ this.zkTable = new ZKTable(this.master.getZooKeeper()); this.maximumAssignmentAttempts = this.master.getConfiguration().getInt("hbase.assignment.maximum.attempts", 10); - this.balancer = LoadBalancerFactory.getLoadBalancer(conf); + this.balancer = balancer; this.threadPoolExecutorService = Executors.newCachedThreadPool(); this.masterMetrics = metrics;// can be null only with tests. } @@ -1817,8 +1818,7 @@ if (servers.isEmpty()) return null; - RegionPlan randomPlan = new RegionPlan(state.getRegion(), null, - balancer.randomAssignment(state.getRegion(), servers)); + RegionPlan randomPlan = null; boolean newPlan = false; RegionPlan existingPlan = null; @@ -1836,6 +1836,8 @@ || existingPlan.getDestination() == null || drainingServers.contains(existingPlan.getDestination())) { newPlan = true; + randomPlan = new RegionPlan(state.getRegion(), null, + balancer.randomAssignment(state.getRegion(), servers)); this.regionPlans.put(encodedName, randomPlan); } } @@ -2982,6 +2984,7 @@ public boolean isCarryingMeta(ServerName serverName) { return isCarryingRegion(serverName, HRegionInfo.FIRST_META_REGIONINFO); } + /** * Check if the shutdown server carries the specific region. * We have a bunch of places that store region location Index: src/main/java/org/apache/hadoop/hbase/master/HMaster.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/HMaster.java (revision 1326382) +++ src/main/java/org/apache/hadoop/hbase/master/HMaster.java (working copy) @@ -426,9 +426,9 @@ this, conf.getInt("hbase.master.catalog.timeout", Integer.MAX_VALUE)); this.catalogTracker.start(); + this.balancer = LoadBalancerFactory.getLoadBalancer(conf); this.assignmentManager = new AssignmentManager(this, serverManager, - this.catalogTracker, this.executorService, this.metrics); - this.balancer = LoadBalancerFactory.getLoadBalancer(conf); + this.catalogTracker, this.balancer, this.executorService, this.metrics); zooKeeper.registerListenerFirst(assignmentManager); this.regionServerTracker = new RegionServerTracker(zooKeeper, this, @@ -585,12 +585,12 @@ org.apache.hadoop.hbase.catalog.MetaMigrationRemovingHTD. updateMetaWithNewHRI(this); + this.balancer.setMasterServices(this); // Fixup assignment manager status status.setStatus("Starting assignment manager"); this.assignmentManager.joinCluster(onlineServers); this.balancer.setClusterStatus(getClusterStatus()); - this.balancer.setMasterServices(this); // Fixing up missing daughters if any status.setStatus("Fixing up missing daughters"); Index: src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java (revision 1326382) +++ src/test/java/org/apache/hadoop/hbase/master/TestAssignmentManager.java (working copy) @@ -310,9 +310,11 @@ // We need a mocked catalog tracker. CatalogTracker ct = Mockito.mock(CatalogTracker.class); + LoadBalancer balancer = LoadBalancerFactory.getLoadBalancer(server + .getConfiguration()); // Create an AM. - AssignmentManager am = - new AssignmentManager(this.server, this.serverManager, ct, executor, null); + AssignmentManager am = new AssignmentManager(this.server, + this.serverManager, ct, balancer, executor, null); try { // Make sure our new AM gets callbacks; once registered, can't unregister. // Thats ok because we make a new zk watcher for each test. @@ -376,9 +378,11 @@ // We need a mocked catalog tracker. CatalogTracker ct = Mockito.mock(CatalogTracker.class); + LoadBalancer balancer = LoadBalancerFactory.getLoadBalancer(server + .getConfiguration()); // Create an AM. - AssignmentManager am = - new AssignmentManager(this.server, this.serverManager, ct, executor, null); + AssignmentManager am = new AssignmentManager(this.server, + this.serverManager, ct, balancer, executor, null); try { // Make sure our new AM gets callbacks; once registered, can't unregister. // Thats ok because we make a new zk watcher for each test. @@ -451,9 +455,11 @@ Mockito.when(this.serverManager.sendRegionClose(SERVERNAME_A, hri, -1)).thenReturn(true); // Need a mocked catalog tracker. CatalogTracker ct = Mockito.mock(CatalogTracker.class); + LoadBalancer balancer = LoadBalancerFactory.getLoadBalancer(server + .getConfiguration()); // Create an AM. - AssignmentManager am = - new AssignmentManager(this.server, this.serverManager, ct, null, null); + AssignmentManager am = new AssignmentManager(this.server, + this.serverManager, ct, balancer, null, null); try { // First make sure my mock up basically works. Unassign a region. unassign(am, SERVERNAME_A, hri); @@ -568,8 +574,10 @@ Mockito.when(ct.getConnection()).thenReturn(connection); // Create and startup an executor. Used by AM handling zk callbacks. ExecutorService executor = startupMasterExecutor("mockedAMExecutor"); - AssignmentManagerWithExtrasForTesting am = - new AssignmentManagerWithExtrasForTesting(server, manager, ct, executor); + LoadBalancer balancer = LoadBalancerFactory.getLoadBalancer(server + .getConfiguration()); + AssignmentManagerWithExtrasForTesting am = new AssignmentManagerWithExtrasForTesting( + server, manager, ct, balancer, executor); return am; } @@ -585,10 +593,10 @@ AtomicBoolean gate = new AtomicBoolean(true); public AssignmentManagerWithExtrasForTesting(final Server master, - final ServerManager serverManager, - final CatalogTracker catalogTracker, final ExecutorService service) + final ServerManager serverManager, final CatalogTracker catalogTracker, + final LoadBalancer balancer, final ExecutorService service) throws KeeperException, IOException { - super(master, serverManager, catalogTracker, service, null); + super(master, serverManager, catalogTracker, balancer, service, null); this.es = service; this.ct = catalogTracker; }