HBASE-5120 Timeout monitor races with table disable handler
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1245731 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
6fa8f6a042
commit
aa7a5b2926
|
@ -60,9 +60,11 @@ import org.apache.hadoop.hbase.catalog.MetaReader;
|
||||||
import org.apache.hadoop.hbase.catalog.RootLocationEditor;
|
import org.apache.hadoop.hbase.catalog.RootLocationEditor;
|
||||||
import org.apache.hadoop.hbase.client.Result;
|
import org.apache.hadoop.hbase.client.Result;
|
||||||
import org.apache.hadoop.hbase.executor.EventHandler.EventType;
|
import org.apache.hadoop.hbase.executor.EventHandler.EventType;
|
||||||
|
import org.apache.hadoop.hbase.executor.EventHandler;
|
||||||
import org.apache.hadoop.hbase.executor.ExecutorService;
|
import org.apache.hadoop.hbase.executor.ExecutorService;
|
||||||
import org.apache.hadoop.hbase.executor.RegionTransitionData;
|
import org.apache.hadoop.hbase.executor.RegionTransitionData;
|
||||||
import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException;
|
import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException;
|
||||||
|
import org.apache.hadoop.hbase.master.AssignmentManager.RegionState.State;
|
||||||
import org.apache.hadoop.hbase.master.handler.ClosedRegionHandler;
|
import org.apache.hadoop.hbase.master.handler.ClosedRegionHandler;
|
||||||
import org.apache.hadoop.hbase.master.handler.DisableTableHandler;
|
import org.apache.hadoop.hbase.master.handler.DisableTableHandler;
|
||||||
import org.apache.hadoop.hbase.master.handler.EnableTableHandler;
|
import org.apache.hadoop.hbase.master.handler.EnableTableHandler;
|
||||||
|
@ -84,6 +86,7 @@ import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
|
||||||
import org.apache.hadoop.ipc.RemoteException;
|
import org.apache.hadoop.ipc.RemoteException;
|
||||||
import org.apache.zookeeper.AsyncCallback;
|
import org.apache.zookeeper.AsyncCallback;
|
||||||
import org.apache.zookeeper.KeeperException;
|
import org.apache.zookeeper.KeeperException;
|
||||||
|
import org.apache.zookeeper.KeeperException.NoNodeException;
|
||||||
import org.apache.zookeeper.KeeperException.NodeExistsException;
|
import org.apache.zookeeper.KeeperException.NodeExistsException;
|
||||||
import org.apache.zookeeper.data.Stat;
|
import org.apache.zookeeper.data.Stat;
|
||||||
|
|
||||||
|
@ -1744,6 +1747,7 @@ public class AssignmentManager extends ZooKeeperListener {
|
||||||
// TODO: Method needs refactoring. Ugly buried returns throughout. Beware!
|
// TODO: Method needs refactoring. Ugly buried returns throughout. Beware!
|
||||||
LOG.debug("Starting unassignment of region " +
|
LOG.debug("Starting unassignment of region " +
|
||||||
region.getRegionNameAsString() + " (offlining)");
|
region.getRegionNameAsString() + " (offlining)");
|
||||||
|
|
||||||
synchronized (this.regions) {
|
synchronized (this.regions) {
|
||||||
// Check if this region is currently assigned
|
// Check if this region is currently assigned
|
||||||
if (!regions.containsKey(region)) {
|
if (!regions.containsKey(region)) {
|
||||||
|
@ -1811,12 +1815,30 @@ public class AssignmentManager extends ZooKeeperListener {
|
||||||
"already in transition (" + state.getState() + ", force=" + force + ")");
|
"already in transition (" + state.getState() + ", force=" + force + ")");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Send CLOSE RPC
|
// Send CLOSE RPC
|
||||||
ServerName server = null;
|
ServerName server = null;
|
||||||
synchronized (this.regions) {
|
synchronized (this.regions) {
|
||||||
server = regions.get(region);
|
server = regions.get(region);
|
||||||
}
|
}
|
||||||
|
// ClosedRegionhandler can remove the server from this.regions
|
||||||
|
if (server == null) {
|
||||||
|
// Possibility of disable flow removing from RIT.
|
||||||
|
synchronized (regionsInTransition) {
|
||||||
|
state = regionsInTransition.get(encodedName);
|
||||||
|
if (state != null) {
|
||||||
|
// remove only if the state is PENDING_CLOSE or CLOSING
|
||||||
|
State presentState = state.getState();
|
||||||
|
if (presentState == State.PENDING_CLOSE
|
||||||
|
|| presentState == State.CLOSING) {
|
||||||
|
this.regionsInTransition.remove(encodedName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// delete the node. if no node exists need not bother.
|
||||||
|
deleteClosingOrClosedNode(region);
|
||||||
|
return;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
// TODO: We should consider making this look more like it does for the
|
// TODO: We should consider making this look more like it does for the
|
||||||
// region open where we catch all throwables and never abort
|
// region open where we catch all throwables and never abort
|
||||||
|
@ -1852,6 +1874,7 @@ public class AssignmentManager extends ZooKeeperListener {
|
||||||
synchronized (this.regions) {
|
synchronized (this.regions) {
|
||||||
this.regions.remove(region);
|
this.regions.remove(region);
|
||||||
}
|
}
|
||||||
|
deleteClosingOrClosedNode(region);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// RS is already processing this region, only need to update the timestamp
|
// RS is already processing this region, only need to update the timestamp
|
||||||
|
@ -1865,6 +1888,30 @@ public class AssignmentManager extends ZooKeeperListener {
|
||||||
// Presume retry or server will expire.
|
// Presume retry or server will expire.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void deleteClosingOrClosedNode(HRegionInfo region) {
|
||||||
|
try {
|
||||||
|
if (!ZKAssign.deleteNode(master.getZooKeeper(), region.getEncodedName(),
|
||||||
|
EventHandler.EventType.M_ZK_REGION_CLOSING)) {
|
||||||
|
boolean deleteNode = ZKAssign.deleteNode(master.getZooKeeper(), region
|
||||||
|
.getEncodedName(), EventHandler.EventType.RS_ZK_REGION_CLOSED);
|
||||||
|
// TODO : We don't abort if the delete node returns false. Is there any
|
||||||
|
// such corner case?
|
||||||
|
if (!deleteNode) {
|
||||||
|
LOG.error("The deletion of the CLOSED node for the region "
|
||||||
|
+ region.getEncodedName() + " returned " + deleteNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (NoNodeException e) {
|
||||||
|
LOG.debug("CLOSING/CLOSED node for the region " + region.getEncodedName()
|
||||||
|
+ " already deleted");
|
||||||
|
} catch (KeeperException ke) {
|
||||||
|
master.abort(
|
||||||
|
"Unexpected ZK exception deleting node CLOSING/CLOSED for the region "
|
||||||
|
+ region.getEncodedName(), ke);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param path
|
* @param path
|
||||||
|
|
Loading…
Reference in New Issue