You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by an...@apache.org on 2013/03/19 16:20:55 UTC

svn commit: r1458329 - in /hbase/branches/0.95/hbase-server/src: main/java/org/apache/hadoop/hbase/coprocessor/ main/java/org/apache/hadoop/hbase/master/ main/java/org/apache/hadoop/hbase/security/access/ test/java/org/apache/hadoop/hbase/coprocessor/ ...

Author: anoopsamjohn
Date: Tue Mar 19 15:20:54 2013
New Revision: 1458329

URL: http://svn.apache.org/r1458329
Log:
HBASE-7992 provide pre/post region offline hooks for HMaster.offlineRegion() (Rajeshbabu)

Modified:
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
    hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java
    hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java?rev=1458329&r1=1458328&r2=1458329&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java Tue Mar 19 15:20:54 2013
@@ -233,6 +233,16 @@ public class BaseMasterObserver implemen
   }
 
   @Override
+  public void preRegionOffline(ObserverContext<MasterCoprocessorEnvironment> ctx,
+    HRegionInfo regionInfo) throws IOException {
+  }
+
+  @Override
+  public void postRegionOffline(ObserverContext<MasterCoprocessorEnvironment> ctx,
+    HRegionInfo regionInfo) throws IOException {
+  }
+
+  @Override
   public void preBalance(ObserverContext<MasterCoprocessorEnvironment> ctx)
       throws IOException {
   }

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java?rev=1458329&r1=1458328&r2=1458329&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java Tue Mar 19 15:20:54 2013
@@ -441,6 +441,23 @@ public interface MasterObserver extends 
       final HRegionInfo regionInfo, final boolean force) throws IOException;
 
   /**
+   * Called prior to marking a given region as offline. <code>ctx.bypass()</code> will not have any
+   * impact on this hook.
+   * @param ctx the environment to interact with the framework and master
+   * @param regionInfo
+   */
+  void preRegionOffline(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      final HRegionInfo regionInfo) throws IOException;
+
+  /**
+   * Called after the region has been marked offline.
+   * @param ctx the environment to interact with the framework and master
+   * @param regionInfo
+   */
+  void postRegionOffline(final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      final HRegionInfo regionInfo) throws IOException;
+
+  /**
    * Called prior to requesting rebalancing of the cluster regions, though after
    * the initial checks for regions in transition and the balance switch flag.
    * @param ctx the environment to interact with the framework and master

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java?rev=1458329&r1=1458328&r2=1458329&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java Tue Mar 19 15:20:54 2013
@@ -2267,7 +2267,11 @@ Server {
   }
 
   /**
-   * Special method, only used by hbck.
+   * Offline specified region from master's in-memory state. It will not attempt to
+   * reassign the region as in unassign.
+   *  
+   * This is a special method that should be used by experts or hbck.
+   * 
    */
   @Override
   public OfflineRegionResponse offlineRegion(RpcController controller, OfflineRegionRequest request)
@@ -2284,7 +2288,13 @@ Server {
         MetaReader.getRegion(this.catalogTracker, regionName);
       if (pair == null) throw new UnknownRegionException(Bytes.toStringBinary(regionName));
       HRegionInfo hri = pair.getFirst();
+      if (cpHost != null) {
+        cpHost.preRegionOffline(hri);
+      }
       this.assignmentManager.regionOffline(hri);
+      if (cpHost != null) {
+        cpHost.postRegionOffline(hri);
+      }
     } catch (IOException ioe) {
       throw new ServiceException(ioe);
     }

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java?rev=1458329&r1=1458328&r2=1458329&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java Tue Mar 19 15:20:54 2013
@@ -811,6 +811,40 @@ public class MasterCoprocessorHost
     }
   }
 
+  void preRegionOffline(final HRegionInfo regionInfo) throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).preRegionOffline(ctx, regionInfo);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+
+  void postRegionOffline(final HRegionInfo regionInfo) throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).postRegionOffline(ctx, regionInfo);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+
   boolean preBalance() throws IOException {
     boolean bypass = false;
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java?rev=1458329&r1=1458328&r2=1458329&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java Tue Mar 19 15:20:54 2013
@@ -675,6 +675,17 @@ public class AccessController extends Ba
       HRegionInfo regionInfo, boolean force) throws IOException {}
 
   @Override
+  public void preRegionOffline(ObserverContext<MasterCoprocessorEnvironment> c,
+      HRegionInfo regionInfo) throws IOException {
+    requirePermission("regionOffline", regionInfo.getTableName(), null, null, Action.ADMIN);
+  }
+
+  @Override
+  public void postRegionOffline(ObserverContext<MasterCoprocessorEnvironment> c,
+      HRegionInfo regionInfo) throws IOException {
+  }
+
+  @Override
   public void preBalance(ObserverContext<MasterCoprocessorEnvironment> c)
       throws IOException {
     requirePermission("balance", Permission.Action.ADMIN);

Modified: hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java?rev=1458329&r1=1458328&r2=1458329&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java (original)
+++ hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java Tue Mar 19 15:20:54 2013
@@ -90,6 +90,8 @@ public class TestMasterObserver {
     private boolean postAssignCalled;
     private boolean preUnassignCalled;
     private boolean postUnassignCalled;
+    private boolean preRegionOfflineCalled;
+    private boolean postRegionOfflineCalled;
     private boolean preBalanceCalled;
     private boolean postBalanceCalled;
     private boolean preBalanceSwitchCalled;
@@ -151,6 +153,8 @@ public class TestMasterObserver {
       postAssignCalled = false;
       preUnassignCalled = false;
       postUnassignCalled = false;
+      preRegionOfflineCalled = false;
+      postRegionOfflineCalled = false;
       preBalanceCalled = false;
       postBalanceCalled = false;
       preBalanceSwitchCalled = false;
@@ -442,6 +446,26 @@ public class TestMasterObserver {
     }
 
     @Override
+    public void preRegionOffline(ObserverContext<MasterCoprocessorEnvironment> env,
+        final HRegionInfo regionInfo) throws IOException {
+      preRegionOfflineCalled = true;
+    }
+
+    @Override
+    public void postRegionOffline(ObserverContext<MasterCoprocessorEnvironment> env,
+        final HRegionInfo regionInfo) throws IOException {
+      postRegionOfflineCalled = true;
+    }
+
+    public boolean wasRegionOfflineCalled() {
+      return preRegionOfflineCalled && postRegionOfflineCalled;
+    }
+
+    public boolean preRegionOfflineCalledOnly() {
+      return preRegionOfflineCalled && !postRegionOfflineCalled;
+    }
+
+    @Override
     public void preBalance(ObserverContext<MasterCoprocessorEnvironment> env)
         throws IOException {
       if (bypass) {

Modified: hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java?rev=1458329&r1=1458328&r2=1458329&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java (original)
+++ hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java Tue Mar 19 15:20:54 2013
@@ -487,6 +487,29 @@ public class TestAccessController {
   }
 
   @Test
+  public void testRegionOffline() throws Exception {
+    Map<HRegionInfo, ServerName> regions;
+    HTable table = new HTable(TEST_UTIL.getConfiguration(), TEST_TABLE);
+    try {
+      regions = table.getRegionLocations();
+    } finally {
+      table.close();
+    }
+    final Map.Entry<HRegionInfo, ServerName> firstRegion = regions.entrySet().iterator().next();
+
+    PrivilegedExceptionAction action = new PrivilegedExceptionAction() {
+      public Object run() throws Exception {
+        ACCESS_CONTROLLER.preRegionOffline(ObserverContext.createAndPrepare(CP_ENV, null),
+          firstRegion.getKey());
+        return null;
+      }
+    };
+
+    verifyAllowed(action, SUPERUSER, USER_ADMIN, USER_OWNER);
+    verifyDenied(action, USER_CREATE, USER_RW, USER_RO, USER_NONE);
+  }
+
+  @Test
   public void testBalance() throws Exception {
     PrivilegedExceptionAction action = new PrivilegedExceptionAction() {
       public Object run() throws Exception {