Index: src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (revision 1041275) +++ src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (working copy) @@ -538,7 +538,7 @@ addToServers(serverInfo, regionInfo); } // Remove plan if one. - this.regionPlans.remove(regionInfo.getEncodedName()); + clearRegionPlan(regionInfo.getEncodedName()); // Update timers for all regions in transition going against this server. updateTimers(serverInfo); } @@ -558,16 +558,18 @@ */ private void updateTimers(final HServerInfo hsi) { // This loop could be expensive - for (Map.Entry e: this.regionPlans.entrySet()) { - if (e.getValue().getDestination().equals(hsi)) { - RegionState rs = null; - synchronized (this.regionsInTransition) { - rs = this.regionsInTransition.get(e.getKey()); - } - if (rs != null) { - synchronized (rs) { - rs.update(rs.getState()); + synchronized (this.regionPlans) { + for (Map.Entry e: this.regionPlans.entrySet()) { + if (e.getValue().getDestination().equals(hsi)) { + RegionState rs = null; + synchronized (this.regionsInTransition) { + rs = this.regionsInTransition.get(e.getKey()); } + if (rs != null) { + synchronized (rs) { + rs.update(rs.getState()); + } + } } } } @@ -1704,7 +1706,9 @@ * @param plan Plan to execute. */ void balance(final RegionPlan plan) { - this.regionPlans.put(plan.getRegionName(), plan); + synchronized (this.regionPlans) { + this.regionPlans.put(plan.getRegionName(), plan); + } unassign(plan.getRegionInfo()); }