hbase-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From st...@apache.org
Subject hbase git commit: HBASE-12958 SSH doing hbase:meta get but hbase:meta not assigned
Date Thu, 05 Feb 2015 16:43:34 GMT
Repository: hbase
Updated Branches:
  refs/heads/0.98 63050b45b -> 7565a3bb1


HBASE-12958 SSH doing hbase:meta get but hbase:meta not assigned


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/7565a3bb
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/7565a3bb
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/7565a3bb

Branch: refs/heads/0.98
Commit: 7565a3bb17e288c97ec85e655dcfeef5165abbae
Parents: 63050b4
Author: stack <stack@apache.org>
Authored: Thu Feb 5 08:43:26 2015 -0800
Committer: stack <stack@apache.org>
Committed: Thu Feb 5 08:43:26 2015 -0800

----------------------------------------------------------------------
 .../hadoop/hbase/master/RegionStates.java       | 134 +++++++++++--------
 1 file changed, 76 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/7565a3bb/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 68f3c18..0f91352 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
@@ -321,7 +321,7 @@ public class RegionStates {
     return updateRegionState(regionInfo, state,
       transition.getServerName());
   }
-  
+
   /**
    * Transition a region state to OPEN from OPENING/PENDING_OPEN
    */
@@ -477,78 +477,95 @@ 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);
-            regionsToOffline.add(region);
-          } catch (KeeperException ke) {
-            server.abort("Unexpected ZK exception deleting node " + region, ke);
+      // 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);
+              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 (MetaReader.getRegion(server.getCatalogTracker(), state.getRegion().getRegionName())
== 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
@@ -774,7 +791,8 @@ public class RegionStates {
   }
 
   /**
-   * Get the HRegionInfo from cache, if not there, from the hbase:meta table
+   * Get the HRegionInfo from cache, if not there, from the hbase:meta table.
+   * Be careful. Does RPC. Do not hold a lock or synchronize when you call this method.
    * @param  regionName
    * @return HRegionInfo for the region
    */


Mime
View raw message