You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2015/02/06 01:53:35 UTC
hbase git commit: HBASE-12958 SSH doing hbase:meta get but hbase:meta
not assigned; REAPPLY
Repository: hbase
Updated Branches:
refs/heads/branch-1 af7b5fa94 -> fb867f795
HBASE-12958 SSH doing hbase:meta get but hbase:meta not assigned; REAPPLY
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/fb867f79
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/fb867f79
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/fb867f79
Branch: refs/heads/branch-1
Commit: fb867f7952e29d43bf08e44d7c714fd5f1b5f0b0
Parents: af7b5fa
Author: stack <st...@apache.org>
Authored: Thu Feb 5 16:53:23 2015 -0800
Committer: stack <st...@apache.org>
Committed: Thu Feb 5 16:53:23 2015 -0800
----------------------------------------------------------------------
.../hadoop/hbase/master/RegionStates.java | 128 +++++++++++--------
1 file changed, 72 insertions(+), 56 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/fb867f79/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java
index f270cd2..b45caff 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java
@@ -408,7 +408,7 @@ public class RegionStates {
return updateRegionState(regionInfo, state,
transition.getServerName());
}
-
+
/**
* Transition a region state to OPEN from OPENING/PENDING_OPEN
*/
@@ -610,77 +610,93 @@ public class RegionStates {
/**
* A server is offline, all regions on it are dead.
*/
- public synchronized List<HRegionInfo> serverOffline(
- final ZooKeeperWatcher watcher, final ServerName sn) {
+ public List<HRegionInfo> serverOffline(final ZooKeeperWatcher watcher, final ServerName sn) {
// Offline all regions on this server not already in transition.
List<HRegionInfo> rits = new ArrayList<HRegionInfo>();
- Set<HRegionInfo> assignedRegions = serverHoldings.get(sn);
- if (assignedRegions == null) {
- assignedRegions = new HashSet<HRegionInfo>();
- }
+ Set<HRegionInfo> regionsToCleanIfNoMetaEntry = new HashSet<HRegionInfo>();
+ synchronized (this) {
+ Set<HRegionInfo> assignedRegions = serverHoldings.get(sn);
+ if (assignedRegions == null) {
+ assignedRegions = new HashSet<HRegionInfo>();
+ }
- // Offline regions outside the loop to avoid ConcurrentModificationException
- Set<HRegionInfo> regionsToOffline = new HashSet<HRegionInfo>();
- for (HRegionInfo region : assignedRegions) {
- // Offline open regions, no need to offline if SPLIT/MERGED/OFFLINE
- if (isRegionOnline(region)) {
- regionsToOffline.add(region);
- } else if (isRegionInState(region, State.SPLITTING, State.MERGING)) {
- LOG.debug("Offline splitting/merging region " + getRegionState(region));
- try {
- // Delete the ZNode if exists
- ZKAssign.deleteNodeFailSilent(watcher, region);
+ // Offline regions outside the loop to avoid ConcurrentModificationException
+ Set<HRegionInfo> regionsToOffline = new HashSet<HRegionInfo>();
+ for (HRegionInfo region : assignedRegions) {
+ // Offline open regions, no need to offline if SPLIT/MERGED/OFFLINE
+ if (isRegionOnline(region)) {
regionsToOffline.add(region);
- } catch (KeeperException ke) {
- server.abort("Unexpected ZK exception deleting node " + region, ke);
+ } else if (isRegionInState(region, State.SPLITTING, State.MERGING)) {
+ LOG.debug("Offline splitting/merging region " + getRegionState(region));
+ try {
+ // Delete the ZNode if exists
+ ZKAssign.deleteNodeFailSilent(watcher, region);
+ regionsToOffline.add(region);
+ } catch (KeeperException ke) {
+ server.abort("Unexpected ZK exception deleting node " + region, ke);
+ }
}
}
- }
- for (RegionState state : regionsInTransition.values()) {
- HRegionInfo hri = state.getRegion();
- if (assignedRegions.contains(hri)) {
- // Region is open on this region server, but in transition.
- // This region must be moving away from this server, or splitting/merging.
- // SSH will handle it, either skip assigning, or re-assign.
- LOG.info("Transitioning " + state + " will be handled by SSH for " + sn);
- } else if (sn.equals(state.getServerName())) {
- // Region is in transition on this region server, and this
- // region is not open on this server. So the region must be
- // moving to this server from another one (i.e. opening or
- // pending open on this server, was open on another one.
- // Offline state is also kind of pending open if the region is in
- // transition. The region could be in failed_close state too if we have
- // tried several times to open it while this region server is not reachable)
- if (state.isPendingOpenOrOpening() || state.isFailedClose() || state.isOffline()) {
- LOG.info("Found region in " + state + " to be reassigned by SSH for " + sn);
- rits.add(hri);
- } else if(state.isSplittingNew()) {
- try {
- if (MetaTableAccessor.getRegion(server.getConnection(), state.getRegion()
- .getEncodedNameAsBytes()) == null) {
- regionsToOffline.add(state.getRegion());
- FSUtils.deleteRegionDir(server.getConfiguration(), state.getRegion());
- }
- } catch (IOException e) {
- LOG.warn("Got exception while deleting " + state.getRegion()
- + " directories from file system.", e);
+ for (RegionState state : regionsInTransition.values()) {
+ HRegionInfo hri = state.getRegion();
+ if (assignedRegions.contains(hri)) {
+ // Region is open on this region server, but in transition.
+ // This region must be moving away from this server, or splitting/merging.
+ // SSH will handle it, either skip assigning, or re-assign.
+ LOG.info("Transitioning " + state + " will be handled by SSH for " + sn);
+ } else if (sn.equals(state.getServerName())) {
+ // Region is in transition on this region server, and this
+ // region is not open on this server. So the region must be
+ // moving to this server from another one (i.e. opening or
+ // pending open on this server, was open on another one.
+ // Offline state is also kind of pending open if the region is in
+ // transition. The region could be in failed_close state too if we have
+ // tried several times to open it while this region server is not reachable)
+ if (state.isPendingOpenOrOpening() || state.isFailedClose() || state.isOffline()) {
+ LOG.info("Found region in " + state + " to be reassigned by SSH for " + sn);
+ rits.add(hri);
+ } else if(state.isSplittingNew()) {
+ regionsToCleanIfNoMetaEntry.add(state.getRegion());
+ } else {
+ LOG.warn("THIS SHOULD NOT HAPPEN: unexpected " + state);
}
- } else {
- LOG.warn("THIS SHOULD NOT HAPPEN: unexpected " + state);
}
}
- }
- for (HRegionInfo hri : regionsToOffline) {
- regionOffline(hri);
- }
+ for (HRegionInfo hri : regionsToOffline) {
+ regionOffline(hri);
+ }
- this.notifyAll();
+ this.notifyAll();
+ }
+ cleanIfNoMetaEntry(regionsToCleanIfNoMetaEntry);
return rits;
}
/**
+ * This method does an RPC to hbase:meta. Do not call this method with a lock/synchronize held.
+ * @param hris The hris to check if empty in hbase:meta and if so, clean them up.
+ */
+ private void cleanIfNoMetaEntry(Set<HRegionInfo> hris) {
+ if (hris.isEmpty()) return;
+ for (HRegionInfo hri: hris) {
+ try {
+ // This is RPC to meta table. It is done while we have a synchronize on
+ // regionstates. No progress will be made if meta is not available at this time.
+ // This is a cleanup task. Not critical.
+ if (MetaTableAccessor.getRegion(server.getConnection(), hri.getEncodedNameAsBytes()) ==
+ null) {
+ regionOffline(hri);
+ FSUtils.deleteRegionDir(server.getConfiguration(), hri);
+ }
+ } catch (IOException e) {
+ LOG.warn("Got exception while deleting " + hri + " directories from file system.", e);
+ }
+ }
+ }
+
+ /**
* Gets the online regions of the specified table.
* This method looks at the in-memory state. It does not go to <code>hbase:meta</code>.
* Only returns <em>online</em> regions. If a region on this table has been