HBASE-9642. AM ZK Workers stuck doing 100% CPU on HashMap.put

git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1526009 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Devaraj Das 2013-09-24 21:04:24 +00:00
parent 29909882ea
commit 49a29f6e94
3 changed files with 33 additions and 8 deletions

View File

@ -171,15 +171,13 @@ public class AssignmentManager extends ZooKeeperListener {
private final ExecutorService executorService;
// For unit tests, keep track of calls to ClosedRegionHandler
private Map<HRegionInfo, AtomicBoolean> closedRegionHandlerCalled =
new HashMap<HRegionInfo, AtomicBoolean>();
private Map<HRegionInfo, AtomicBoolean> closedRegionHandlerCalled = null;
// For unit tests, keep track of calls to OpenedRegionHandler
private Map<HRegionInfo, AtomicBoolean> openedRegionHandlerCalled =
new HashMap<HRegionInfo, AtomicBoolean>();
private Map<HRegionInfo, AtomicBoolean> openedRegionHandlerCalled = null;
// For unit tests, keep track of calls to SplitRegionHandler
private AtomicBoolean splitRegionHandlerCalled = new AtomicBoolean(false);
private AtomicBoolean splitRegionHandlerCalled = null;
//Thread pool executor service for timeout monitor
private java.util.concurrent.ExecutorService threadPoolExecutorService;
@ -883,7 +881,7 @@ public class AssignmentManager extends ZooKeeperListener {
}
// Run handler to do the rest of the SPLIT handling.
new SplitRegionHandler(server, this, regionState.getRegion(), sn, daughters).process();
splitRegionHandlerCalled.set(true);
updateSplitHandlerTracker();
break;
case RS_ZK_REGION_MERGING:
@ -951,7 +949,7 @@ public class AssignmentManager extends ZooKeeperListener {
if (regionState != null) {
removeClosedRegion(regionState.getRegion());
new ClosedRegionHandler(server, this, regionState.getRegion()).process();
closedRegionHandlerCalled.put(regionState.getRegion(), new AtomicBoolean(true));
updateClosedRegionHandlerTracker(regionState.getRegion());
}
break;
@ -1026,7 +1024,7 @@ public class AssignmentManager extends ZooKeeperListener {
failedOpenTracker.remove(encodedName); // reset the count, if any
new OpenedRegionHandler(
server, this, regionState.getRegion(), sn, expectedVersion).process();
openedRegionHandlerCalled.put(regionState.getRegion(), new AtomicBoolean(true));
updateOpenedRegionHandlerTracker(regionState.getRegion());
}
break;
@ -1064,6 +1062,31 @@ public class AssignmentManager extends ZooKeeperListener {
return splitRegionHandlerCalled.compareAndSet(true, false);
}
//For unit tests only
void initializeHandlerTrackers() {
closedRegionHandlerCalled = new HashMap<HRegionInfo, AtomicBoolean>();
openedRegionHandlerCalled = new HashMap<HRegionInfo, AtomicBoolean>();
splitRegionHandlerCalled = new AtomicBoolean(false);
}
void updateClosedRegionHandlerTracker(HRegionInfo hri) {
if (closedRegionHandlerCalled != null) { //only for unit tests this is true
closedRegionHandlerCalled.put(hri, new AtomicBoolean(true));
}
}
void updateOpenedRegionHandlerTracker(HRegionInfo hri) {
if (openedRegionHandlerCalled != null) { //only for unit tests this is true
openedRegionHandlerCalled.put(hri, new AtomicBoolean(true));
}
}
void updateSplitHandlerTracker() {
if (splitRegionHandlerCalled != null) { //only for unit tests this is true
splitRegionHandlerCalled.set(true);
}
}
/**
* @return Returns true if this RegionState is splittable; i.e. the
* RegionState is currently in splitting state or pending_close or

View File

@ -53,6 +53,7 @@ public class TestMaster {
// Start a cluster of two regionservers.
TEST_UTIL.startMiniCluster(2);
admin = TEST_UTIL.getHBaseAdmin();
TEST_UTIL.getHBaseCluster().getMaster().assignmentManager.initializeHandlerTrackers();
}
@AfterClass

View File

@ -80,6 +80,7 @@ public class TestZKBasedOpenCloseRegion {
waitUntilAllRegionsAssigned();
addToEachStartKey(countOfRegions);
t.close();
TEST_UTIL.getHBaseCluster().getMaster().assignmentManager.initializeHandlerTrackers();
}
@AfterClass public static void afterAllTests() throws Exception {