You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ra...@apache.org on 2012/05/06 07:52:48 UTC

svn commit: r1334560 - in /hbase/trunk/src: main/java/org/apache/hadoop/hbase/coprocessor/ main/java/org/apache/hadoop/hbase/master/ main/java/org/apache/hadoop/hbase/master/handler/ test/java/org/apache/hadoop/hbase/coprocessor/

Author: ramkrishna
Date: Sun May  6 05:52:47 2012
New Revision: 1334560

URL: http://svn.apache.org/viewvc?rev=1334560&view=rev
Log:
HBASE-5584 Coprocessor hooks can be called in the respective handlers (Ram)

Modified:
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/CreateTableHandler.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/DeleteTableHandler.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/DisableTableHandler.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/ModifyTableHandler.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableAddFamilyHandler.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableDeleteFamilyHandler.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableModifyFamilyHandler.java
    hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java?rev=1334560&r1=1334559&r2=1334560&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java Sun May  6 05:52:47 2012
@@ -45,6 +45,18 @@ public class BaseMasterObserver implemen
   }
 
   @Override
+  public void preCreateTableHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      HTableDescriptor desc, HRegionInfo[] regions) throws IOException {
+  }
+
+  @Override
+  public void postCreateTableHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      HTableDescriptor desc, HRegionInfo[] regions) throws IOException {
+  }
+
+  @Override
   public void preDeleteTable(ObserverContext<MasterCoprocessorEnvironment> ctx,
       byte[] tableName) throws IOException {
   }
@@ -55,11 +67,35 @@ public class BaseMasterObserver implemen
   }
 
   @Override
+  public void preDeleteTableHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName)
+      throws IOException{
+  }
+
+  @Override
+  public void postDeleteTableHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName)
+      throws IOException {
+  }
+
+  @Override
   public void preModifyTable(ObserverContext<MasterCoprocessorEnvironment> ctx,
       byte[] tableName, HTableDescriptor htd) throws IOException {
   }
 
   @Override
+  public void postModifyTableHandler(
+      ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName,
+      HTableDescriptor htd) throws IOException {
+  }
+
+  @Override
+  public void preModifyTableHandler(
+      ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName,
+      HTableDescriptor htd) throws IOException {
+  }
+
+  @Override
   public void postModifyTable(ObserverContext<MasterCoprocessorEnvironment> ctx,
       byte[] tableName, HTableDescriptor htd) throws IOException {
   }
@@ -75,6 +111,18 @@ public class BaseMasterObserver implemen
   }
 
   @Override
+  public void preAddColumnHandler(
+      ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName,
+      HColumnDescriptor column) throws IOException {
+  }
+
+  @Override
+  public void postAddColumnHandler(
+      ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName,
+      HColumnDescriptor column) throws IOException {
+  }
+
+  @Override
   public void preModifyColumn(ObserverContext<MasterCoprocessorEnvironment> ctx,
       byte[] tableName, HColumnDescriptor descriptor) throws IOException {
   }
@@ -85,6 +133,18 @@ public class BaseMasterObserver implemen
   }
 
   @Override
+  public void preModifyColumnHandler(
+      ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName,
+      HColumnDescriptor descriptor) throws IOException {
+  }
+
+  @Override
+  public void postModifyColumnHandler(
+      ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName,
+      HColumnDescriptor descriptor) throws IOException {
+  }
+
+  @Override
   public void preDeleteColumn(ObserverContext<MasterCoprocessorEnvironment> ctx,
       byte[] tableName, byte[] c) throws IOException {
   }
@@ -95,6 +155,19 @@ public class BaseMasterObserver implemen
   }
 
   @Override
+  public void preDeleteColumnHandler(
+      ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName,
+      byte[] c) throws IOException {
+  }
+
+  @Override
+  public void postDeleteColumnHandler(
+      ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName,
+      byte[] c) throws IOException {
+  }
+
+
+  @Override
   public void preEnableTable(ObserverContext<MasterCoprocessorEnvironment> ctx,
       byte[] tableName) throws IOException {
   }
@@ -105,6 +178,18 @@ public class BaseMasterObserver implemen
   }
 
   @Override
+  public void preEnableTableHandler(
+      ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName)
+      throws IOException {
+  }
+
+  @Override
+  public void postEnableTableHandler(
+      ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName)
+      throws IOException {
+  }
+
+  @Override
   public void preDisableTable(ObserverContext<MasterCoprocessorEnvironment> ctx,
       byte[] tableName) throws IOException {
   }
@@ -115,10 +200,22 @@ public class BaseMasterObserver implemen
   }
 
   @Override
+  public void preDisableTableHandler(
+      ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName)
+      throws IOException {
+  }
+
+  @Override
+  public void postDisableTableHandler(
+      ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName)
+      throws IOException {
+  }
+
+  @Override
   public void preAssign(ObserverContext<MasterCoprocessorEnvironment> ctx,
       HRegionInfo regionInfo) throws IOException {
   }
-  
+
   @Override
   public void postAssign(ObserverContext<MasterCoprocessorEnvironment> ctx,
       HRegionInfo regionInfo) throws IOException {

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java?rev=1334560&r1=1334559&r2=1334560&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java Sun May  6 05:52:47 2012
@@ -36,7 +36,8 @@ public interface MasterObserver extends 
 
   /**
    * Called before a new table is created by
-   * {@link org.apache.hadoop.hbase.master.HMaster}.
+   * {@link org.apache.hadoop.hbase.master.HMaster}.  Called as part of create
+   * table RPC call.
    * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
    * @param ctx the environment to interact with the framework and master
    * @param desc the HTableDescriptor for the table
@@ -47,7 +48,8 @@ public interface MasterObserver extends 
       HTableDescriptor desc, HRegionInfo[] regions) throws IOException;
 
   /**
-   * Called after the createTable operation has been requested.
+   * Called after the createTable operation has been requested.  Called as part
+   * of create table RPC call.
    * @param ctx the environment to interact with the framework and master
    * @param desc the HTableDescriptor for the table
    * @param regions the initial regions created for the table
@@ -55,10 +57,34 @@ public interface MasterObserver extends 
    */
   void postCreateTable(final ObserverContext<MasterCoprocessorEnvironment> ctx,
       HTableDescriptor desc, HRegionInfo[] regions) throws IOException;
+  /**
+   * Called before a new table is created by
+   * {@link org.apache.hadoop.hbase.master.HMaster}.  Called as part of create
+   * table handler and it is async to the create RPC call.
+   * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
+   * @param ctx the environment to interact with the framework and master
+   * @param desc the HTableDescriptor for the table
+   * @param regions the initial regions created for the table
+   * @throws IOException
+   */
+  void preCreateTableHandler(final ObserverContext<MasterCoprocessorEnvironment>
+      ctx, HTableDescriptor desc, HRegionInfo[] regions) throws IOException;
+
+  /**
+   * Called after the createTable operation has been requested.  Called as part
+   * of create table RPC call.  Called as part of create table handler and
+   * it is async to the create RPC call.
+   * @param ctx the environment to interact with the framework and master
+   * @param desc the HTableDescriptor for the table
+   * @param regions the initial regions created for the table
+   * @throws IOException
+   */
+  void postCreateTableHandler(final ObserverContext<MasterCoprocessorEnvironment>
+  ctx, HTableDescriptor desc, HRegionInfo[] regions) throws IOException;
 
   /**
    * Called before {@link org.apache.hadoop.hbase.master.HMaster} deletes a
-   * table
+   * table.  Called as part of delete table RPC call.
    * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
@@ -67,7 +93,8 @@ public interface MasterObserver extends 
       byte[] tableName) throws IOException;
 
   /**
-   * Called after the deleteTable operation has been requested.
+   * Called after the deleteTable operation has been requested.  Called as part
+   * of delete table RPC call.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
    */
@@ -75,7 +102,32 @@ public interface MasterObserver extends 
       byte[] tableName) throws IOException;
 
   /**
-   * Called prior to modifying a table's properties.
+   * Called before {@link org.apache.hadoop.hbase.master.HMaster} deletes a
+   * table.  Called as part of delete table handler and
+   * it is async to the delete RPC call.
+   * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   */
+  void preDeleteTableHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName)
+      throws IOException;
+
+  /**
+   * Called after {@link org.apache.hadoop.hbase.master.HMaster} deletes a
+   * table.  Called as part of delete table handler and it is async to the
+   * delete RPC call.
+   * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   */
+  void postDeleteTableHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName)
+      throws IOException;
+
+  /**
+   * Called prior to modifying a table's properties.  Called as part of modify
+   * table RPC call.
    * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
@@ -85,7 +137,8 @@ public interface MasterObserver extends 
       final byte[] tableName, HTableDescriptor htd) throws IOException;
 
   /**
-   * Called after the modifyTable operation has been requested.
+   * Called after the modifyTable operation has been requested.  Called as part
+   * of modify table RPC call.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
    * @param htd the HTableDescriptor
@@ -94,7 +147,32 @@ public interface MasterObserver extends 
       final byte[] tableName, HTableDescriptor htd) throws IOException;
 
   /**
-   * Called prior to adding a new column family to the table.
+   * Called prior to modifying a table's properties.  Called as part of modify
+   * table handler and it is async to the modify table RPC call.
+   * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   * @param htd the HTableDescriptor
+   */
+  void preModifyTableHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      final byte[] tableName, HTableDescriptor htd) throws IOException;
+
+  /**
+   * Called after to modifying a table's properties.  Called as part of modify
+   * table handler and it is async to the modify table RPC call.
+   * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   * @param htd the HTableDescriptor
+   */
+  void postModifyTableHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      final byte[] tableName, HTableDescriptor htd) throws IOException;
+
+  /**
+   * Called prior to adding a new column family to the table.  Called as part of
+   * add column RPC call.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
    * @param column the HColumnDescriptor
@@ -103,7 +181,8 @@ public interface MasterObserver extends 
       byte[] tableName, HColumnDescriptor column) throws IOException;
 
   /**
-   * Called after the new column family has been created.
+   * Called after the new column family has been created.  Called as part of
+   * add column RPC call.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
    * @param column the HColumnDescriptor
@@ -112,7 +191,30 @@ public interface MasterObserver extends 
       byte[] tableName, HColumnDescriptor column) throws IOException;
 
   /**
-   * Called prior to modifying a column family's attributes.
+   * Called prior to adding a new column family to the table.  Called as part of
+   * add column handler.
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   * @param column the HColumnDescriptor
+   */
+  void preAddColumnHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      byte[] tableName, HColumnDescriptor column) throws IOException;
+
+  /**
+   * Called after the new column family has been created.  Called as part of
+   * add column handler.
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   * @param column the HColumnDescriptor
+   */
+  void postAddColumnHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      byte[] tableName, HColumnDescriptor column) throws IOException;
+
+  /**
+   * Called prior to modifying a column family's attributes.  Called as part of
+   * modify column RPC call.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
    * @param descriptor the HColumnDescriptor
@@ -121,7 +223,8 @@ public interface MasterObserver extends 
       byte [] tableName, HColumnDescriptor descriptor) throws IOException;
 
   /**
-   * Called after the column family has been updated.
+   * Called after the column family has been updated.  Called as part of modify
+   * column RPC call.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
    * @param descriptor the HColumnDescriptor
@@ -130,7 +233,31 @@ public interface MasterObserver extends 
       byte[] tableName, HColumnDescriptor descriptor) throws IOException;
 
   /**
-   * Called prior to deleting the entire column family.
+   * Called prior to modifying a column family's attributes.  Called as part of
+   * modify column handler.
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   * @param descriptor the HColumnDescriptor
+   */
+  void preModifyColumnHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      byte[] tableName, HColumnDescriptor descriptor) throws IOException;
+
+  /**
+   * Called after the column family has been updated.  Called as part of modify
+   * column handler.
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   * @param descriptor the HColumnDescriptor
+   */
+  void postModifyColumnHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      byte[] tableName, HColumnDescriptor descriptor) throws IOException;
+
+
+  /**
+   * Called prior to deleting the entire column family.  Called as part of
+   * delete column RPC call.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
    * @param c the column
@@ -139,7 +266,8 @@ public interface MasterObserver extends 
       final byte [] tableName, final byte[] c) throws IOException;
 
   /**
-   * Called after the column family has been deleted.
+   * Called after the column family has been deleted.  Called as part of delete
+   * column RPC call.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
    * @param c the column
@@ -148,7 +276,29 @@ public interface MasterObserver extends 
       final byte [] tableName, final byte[] c) throws IOException;
 
   /**
-   * Called prior to enabling a table.
+   * Called prior to deleting the entire column family.  Called as part of
+   * delete column handler.
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   * @param c the column
+   */
+  void preDeleteColumnHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      final byte[] tableName, final byte[] c) throws IOException;
+
+  /**
+   * Called after the column family has been deleted.  Called as part of
+   * delete column handler.
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   * @param c the column
+   */
+  void postDeleteColumnHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      final byte[] tableName, final byte[] c) throws IOException;
+
+  /**
+   * Called prior to enabling a table.  Called as part of enable table RPC call.
    * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
@@ -157,7 +307,8 @@ public interface MasterObserver extends 
       final byte[] tableName) throws IOException;
 
   /**
-   * Called after the enableTable operation has been requested.
+   * Called after the enableTable operation has been requested.  Called as part
+   * of enable table RPC call.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
    */
@@ -165,7 +316,29 @@ public interface MasterObserver extends 
       final byte[] tableName) throws IOException;
 
   /**
-   * Called prior to disabling a table.
+   * Called prior to enabling a table.  Called as part of enable table handler
+   * and it is async to the enable table RPC call.
+   * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   */
+  void preEnableTableHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      final byte[] tableName) throws IOException;
+
+  /**
+   * Called after the enableTable operation has been requested.  Called as part
+   * of enable table handler and it is async to the enable table RPC call.
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   */
+  void postEnableTableHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      final byte[] tableName) throws IOException;
+
+  /**
+   * Called prior to disabling a table.  Called as part of disable table RPC
+   * call.
    * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
@@ -174,7 +347,8 @@ public interface MasterObserver extends 
       final byte[] tableName) throws IOException;
 
   /**
-   * Called after the disableTable operation has been requested.
+   * Called after the disableTable operation has been requested.  Called as part
+   * of disable table RPC call.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
    */
@@ -182,6 +356,27 @@ public interface MasterObserver extends 
       final byte[] tableName) throws IOException;
 
   /**
+   * Called prior to disabling a table.  Called as part of disable table handler
+   * and it is asyn to the disable table RPC call.
+   * It can't bypass the default action, e.g., ctx.bypass() won't have effect.
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   */
+  void preDisableTableHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      final byte[] tableName) throws IOException;
+
+  /**
+   * Called after the disableTable operation has been requested.  Called as part
+   * of disable table handler and it is asyn to the disable table RPC call.
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   */
+  void postDisableTableHandler(
+      final ObserverContext<MasterCoprocessorEnvironment> ctx,
+      final byte[] tableName) throws IOException;
+
+  /**
    * Called prior to moving a given region from one region server to another.
    * @param ctx the environment to interact with the framework and master
    * @param region the HRegionInfo
@@ -212,7 +407,7 @@ public interface MasterObserver extends 
    */
   void preAssign(final ObserverContext<MasterCoprocessorEnvironment> ctx,
       final HRegionInfo regionInfo) throws IOException;
-  
+
   /**
    * Called after the region assignment has been requested.
    * @param ctx the environment to interact with the framework and master
@@ -220,7 +415,7 @@ public interface MasterObserver extends 
    */
   void postAssign(final ObserverContext<MasterCoprocessorEnvironment> ctx,
       final HRegionInfo regionInfo) throws IOException;
-  
+
   /**
    * Called prior to unassigning a given region.
    * @param ctx the environment to interact with the framework and master

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java?rev=1334560&r1=1334559&r2=1334560&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java Sun May  6 05:52:47 2012
@@ -81,7 +81,7 @@ public class MasterCoprocessorHost
   }
 
   /* Implementation of hooks for invoking MasterObservers */
-  void preCreateTable(HTableDescriptor htd, HRegionInfo[] regions)
+  public void preCreateTable(HTableDescriptor htd, HRegionInfo[] regions)
     throws IOException {
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
@@ -99,7 +99,7 @@ public class MasterCoprocessorHost
     }
   }
 
-  void postCreateTable(HTableDescriptor htd, HRegionInfo[] regions)
+  public void postCreateTable(HTableDescriptor htd, HRegionInfo[] regions)
     throws IOException {
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
@@ -117,7 +117,44 @@ public class MasterCoprocessorHost
     }
   }
 
-  void preDeleteTable(byte[] tableName) throws IOException {
+  public void preCreateTableHandler(HTableDescriptor htd, HRegionInfo[] regions)
+      throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).preCreateTableHandler(ctx, htd,
+              regions);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+
+  public void postCreateTableHandler(HTableDescriptor htd, HRegionInfo[] regions)
+      throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).postCreateTableHandler(ctx, htd,
+              regions);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+  public void preDeleteTable(byte[] tableName) throws IOException {
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
       if (env.getInstance() instanceof MasterObserver) {
@@ -134,7 +171,7 @@ public class MasterCoprocessorHost
     }
   }
 
-  void postDeleteTable(byte[] tableName) throws IOException {
+  public void postDeleteTable(byte[] tableName) throws IOException {
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
       if (env.getInstance() instanceof MasterObserver) {
@@ -151,7 +188,42 @@ public class MasterCoprocessorHost
     }
   }
 
-  void preModifyTable(final byte[] tableName, HTableDescriptor htd)
+  public void preDeleteTableHandler(byte[] tableName) throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).preDeleteTableHandler(ctx,
+              tableName);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+
+  public void postDeleteTableHandler(byte[] tableName) throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).postDeleteTableHandler(ctx,
+              tableName);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+  public void preModifyTable(final byte[] tableName, HTableDescriptor htd)
       throws IOException {
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
@@ -170,7 +242,7 @@ public class MasterCoprocessorHost
     }
   }
 
-  void postModifyTable(final byte[] tableName, HTableDescriptor htd)
+  public void postModifyTable(final byte[] tableName, HTableDescriptor htd)
       throws IOException {
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
@@ -189,7 +261,45 @@ public class MasterCoprocessorHost
     }
   }
 
-  boolean preAddColumn(byte [] tableName, HColumnDescriptor column)
+  public void preModifyTableHandler(final byte[] tableName, HTableDescriptor htd)
+      throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).preModifyTableHandler(ctx,
+              tableName, htd);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+
+  public void postModifyTableHandler(final byte[] tableName,
+      HTableDescriptor htd) throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).postModifyTableHandler(ctx,
+              tableName, htd);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+
+  public boolean preAddColumn(byte [] tableName, HColumnDescriptor column)
       throws IOException {
     boolean bypass = false;
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
@@ -210,7 +320,7 @@ public class MasterCoprocessorHost
     return bypass;
   }
 
-  void postAddColumn(byte [] tableName, HColumnDescriptor column)
+  public void postAddColumn(byte [] tableName, HColumnDescriptor column)
       throws IOException {
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
@@ -229,7 +339,48 @@ public class MasterCoprocessorHost
     }
   }
 
-  boolean preModifyColumn(byte [] tableName, HColumnDescriptor descriptor)
+  public boolean preAddColumnHandler(byte[] tableName, HColumnDescriptor column)
+      throws IOException {
+    boolean bypass = false;
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).preAddColumnHandler(ctx,
+              tableName, column);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        bypass |= ctx.shouldBypass();
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+    return bypass;
+  }
+
+  public void postAddColumnHandler(byte[] tableName, HColumnDescriptor column)
+      throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).postAddColumnHandler(ctx,
+              tableName, column);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+
+  public boolean preModifyColumn(byte [] tableName, HColumnDescriptor descriptor)
       throws IOException {
     boolean bypass = false;
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
@@ -251,7 +402,7 @@ public class MasterCoprocessorHost
     return bypass;
   }
 
-  void postModifyColumn(byte [] tableName, HColumnDescriptor descriptor)
+  public void postModifyColumn(byte [] tableName, HColumnDescriptor descriptor)
       throws IOException {
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
@@ -270,6 +421,47 @@ public class MasterCoprocessorHost
     }
   }
 
+  public boolean preModifyColumnHandler(byte[] tableName,
+      HColumnDescriptor descriptor) throws IOException {
+    boolean bypass = false;
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).preModifyColumnHandler(ctx,
+              tableName, descriptor);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        bypass |= ctx.shouldBypass();
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+    return bypass;
+  }
+
+  public void postModifyColumnHandler(byte[] tableName,
+      HColumnDescriptor descriptor) throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).postModifyColumnHandler(ctx,
+              tableName, descriptor);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+
   boolean preDeleteColumn(final byte [] tableName, final byte [] c)
       throws IOException {
     boolean bypass = false;
@@ -291,7 +483,7 @@ public class MasterCoprocessorHost
     return bypass;
   }
 
-  void postDeleteColumn(final byte [] tableName, final byte [] c)
+  public void postDeleteColumn(final byte [] tableName, final byte [] c)
       throws IOException {
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
@@ -310,7 +502,48 @@ public class MasterCoprocessorHost
     }
   }
 
-  void preEnableTable(final byte [] tableName) throws IOException {
+  public boolean preDeleteColumnHandler(final byte[] tableName, final byte[] c)
+      throws IOException {
+    boolean bypass = false;
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).preDeleteColumnHandler(ctx,
+              tableName, c);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        bypass |= ctx.shouldBypass();
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+    return bypass;
+  }
+
+  public void postDeleteColumnHandler(final byte[] tableName, final byte[] c)
+      throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).postDeleteColumnHandler(ctx,
+              tableName, c);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+
+  public void preEnableTable(final byte [] tableName) throws IOException {
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
       if (env.getInstance() instanceof MasterObserver) {
@@ -327,7 +560,7 @@ public class MasterCoprocessorHost
     }
   }
 
-  void postEnableTable(final byte [] tableName) throws IOException {
+  public void postEnableTable(final byte [] tableName) throws IOException {
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
       if (env.getInstance() instanceof MasterObserver) {
@@ -344,7 +577,43 @@ public class MasterCoprocessorHost
     }
   }
 
-  void preDisableTable(final byte [] tableName) throws IOException {
+  public void preEnableTableHandler(final byte[] tableName) throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).preEnableTableHandler(ctx,
+              tableName);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+
+  public void postEnableTableHandler(final byte[] tableName) throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).postEnableTableHandler(ctx,
+              tableName);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+
+  public void preDisableTable(final byte [] tableName) throws IOException {
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
       if (env.getInstance() instanceof MasterObserver) {
@@ -361,7 +630,7 @@ public class MasterCoprocessorHost
     }
   }
 
-  void postDisableTable(final byte [] tableName) throws IOException {
+  public void postDisableTable(final byte [] tableName) throws IOException {
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
       if (env.getInstance() instanceof MasterObserver) {
@@ -378,8 +647,45 @@ public class MasterCoprocessorHost
     }
   }
 
-  boolean preMove(final HRegionInfo region, final ServerName srcServer, final ServerName destServer)
+  public void preDisableTableHandler(final byte[] tableName) throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).preDisableTableHandler(ctx,
+              tableName);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+
+  public void postDisableTableHandler(final byte[] tableName)
       throws IOException {
+    ObserverContext<MasterCoprocessorEnvironment> ctx = null;
+    for (MasterEnvironment env : coprocessors) {
+      if (env.getInstance() instanceof MasterObserver) {
+        ctx = ObserverContext.createAndPrepare(env, ctx);
+        try {
+          ((MasterObserver) env.getInstance()).postDisableTableHandler(ctx,
+              tableName);
+        } catch (Throwable e) {
+          handleCoprocessorThrowable(env, e);
+        }
+        if (ctx.shouldComplete()) {
+          break;
+        }
+      }
+    }
+  }
+
+  public boolean preMove(final HRegionInfo region, final ServerName srcServer,
+      final ServerName destServer) throws IOException {
     boolean bypass = false;
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
@@ -400,8 +706,8 @@ public class MasterCoprocessorHost
     return bypass;
   }
 
-  void postMove(final HRegionInfo region, final ServerName srcServer, final ServerName destServer)
-      throws IOException {
+  public void postMove(final HRegionInfo region, final ServerName srcServer,
+      final ServerName destServer) throws IOException {
     ObserverContext<MasterCoprocessorEnvironment> ctx = null;
     for (MasterEnvironment env: coprocessors) {
       if (env.getInstance() instanceof MasterObserver) {

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/CreateTableHandler.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/CreateTableHandler.java?rev=1334560&r1=1334559&r2=1334560&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/CreateTableHandler.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/CreateTableHandler.java Sun May  6 05:52:47 2012
@@ -39,6 +39,8 @@ import org.apache.hadoop.hbase.catalog.M
 import org.apache.hadoop.hbase.catalog.MetaReader;
 import org.apache.hadoop.hbase.executor.EventHandler;
 import org.apache.hadoop.hbase.master.AssignmentManager;
+import org.apache.hadoop.hbase.master.HMaster;
+import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
 import org.apache.hadoop.hbase.master.MasterFileSystem;
 import org.apache.hadoop.hbase.master.ServerManager;
 import org.apache.hadoop.hbase.regionserver.HRegion;
@@ -125,7 +127,15 @@ public class CreateTableHandler extends 
     String tableName = this.hTableDescriptor.getNameAsString();
     try {
       LOG.info("Attemping to create the table " + tableName);
+      MasterCoprocessorHost cpHost = ((HMaster) this.server)
+          .getCoprocessorHost();
+      if (cpHost != null) {
+        cpHost.preCreateTableHandler(this.hTableDescriptor, this.newRegions);
+      }
       handleCreateTable();
+      if (cpHost != null) {
+        cpHost.postCreateTableHandler(this.hTableDescriptor, this.newRegions);
+      }
     } catch (IOException e) {
       LOG.error("Error trying to create the table " + tableName, e);
     } catch (KeeperException e) {
@@ -191,4 +201,4 @@ public class CreateTableHandler extends 
         " enabled because of a ZooKeeper issue", e);
     }
   }
-}
\ No newline at end of file
+}

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/DeleteTableHandler.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/DeleteTableHandler.java?rev=1334560&r1=1334559&r2=1334560&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/DeleteTableHandler.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/DeleteTableHandler.java Sun May  6 05:52:47 2012
@@ -29,6 +29,8 @@ import org.apache.hadoop.hbase.HRegionIn
 import org.apache.hadoop.hbase.Server;
 import org.apache.hadoop.hbase.catalog.MetaEditor;
 import org.apache.hadoop.hbase.master.AssignmentManager;
+import org.apache.hadoop.hbase.master.HMaster;
+import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
 import org.apache.hadoop.hbase.master.MasterServices;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.Threads;
@@ -49,6 +51,11 @@ public class DeleteTableHandler extends 
   @Override
   protected void handleTableOperation(List<HRegionInfo> regions)
   throws IOException, KeeperException {
+    MasterCoprocessorHost cpHost = ((HMaster) this.server)
+        .getCoprocessorHost();
+    if (cpHost != null) {
+      cpHost.preDeleteTableHandler(this.tableName);
+    }
     AssignmentManager am = this.masterServices.getAssignmentManager();
     long waitTime = server.getConfiguration().
       getLong("hbase.master.wait.on.region", 5 * 60 * 1000);
@@ -80,8 +87,11 @@ public class DeleteTableHandler extends 
     // If entry for this table in zk, and up in AssignmentManager, remove it.
 
     am.getZKTable().setDeletedTable(Bytes.toString(tableName));
+    if (cpHost != null) {
+      cpHost.postDeleteTableHandler(this.tableName);
+    }
   }
-  
+
   @Override
   public String toString() {
     String name = "UnknownServerName";

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/DisableTableHandler.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/DisableTableHandler.java?rev=1334560&r1=1334559&r2=1334560&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/DisableTableHandler.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/DisableTableHandler.java Sun May  6 05:52:47 2012
@@ -35,6 +35,8 @@ import org.apache.hadoop.hbase.catalog.M
 import org.apache.hadoop.hbase.executor.EventHandler;
 import org.apache.hadoop.hbase.master.AssignmentManager;
 import org.apache.hadoop.hbase.master.BulkAssigner;
+import org.apache.hadoop.hbase.master.HMaster;
+import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.zookeeper.KeeperException;
 
@@ -97,7 +99,15 @@ public class DisableTableHandler extends
   public void process() {
     try {
       LOG.info("Attemping to disable table " + this.tableNameStr);
+      MasterCoprocessorHost cpHost = ((HMaster) this.server)
+          .getCoprocessorHost();
+      if (cpHost != null) {
+        cpHost.preDisableTableHandler(this.tableName);
+      }
       handleDisableTable();
+      if (cpHost != null) {
+        cpHost.postDisableTableHandler(this.tableName);
+      }
     } catch (IOException e) {
       LOG.error("Error trying to disable table " + this.tableNameStr, e);
     } catch (KeeperException e) {

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java?rev=1334560&r1=1334559&r2=1334560&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java Sun May  6 05:52:47 2012
@@ -35,6 +35,8 @@ import org.apache.hadoop.hbase.catalog.M
 import org.apache.hadoop.hbase.executor.EventHandler;
 import org.apache.hadoop.hbase.master.AssignmentManager;
 import org.apache.hadoop.hbase.master.BulkAssigner;
+import org.apache.hadoop.hbase.master.HMaster;
+import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.zookeeper.KeeperException;
 
@@ -96,7 +98,15 @@ public class EnableTableHandler extends 
   public void process() {
     try {
       LOG.info("Attemping to enable the table " + this.tableNameStr);
+      MasterCoprocessorHost cpHost = ((HMaster) this.server)
+          .getCoprocessorHost();
+      if (cpHost != null) {
+        cpHost.preEnableTableHandler(this.tableName);
+      }
       handleEnableTable();
+      if (cpHost != null) {
+        cpHost.postEnableTableHandler(this.tableName);
+      }
     } catch (IOException e) {
       LOG.error("Error trying to enable the table " + this.tableNameStr, e);
     } catch (KeeperException e) {

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/ModifyTableHandler.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/ModifyTableHandler.java?rev=1334560&r1=1334559&r2=1334560&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/ModifyTableHandler.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/ModifyTableHandler.java Sun May  6 05:52:47 2012
@@ -26,6 +26,8 @@ import org.apache.hadoop.classification.
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.Server;
+import org.apache.hadoop.hbase.master.HMaster;
+import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
 import org.apache.hadoop.hbase.master.MasterServices;
 
 @InterfaceAudience.Private
@@ -46,8 +48,16 @@ public class ModifyTableHandler extends 
   @Override
   protected void handleTableOperation(List<HRegionInfo> hris)
   throws IOException {
+    MasterCoprocessorHost cpHost = ((HMaster) this.server)
+        .getCoprocessorHost();
+    if (cpHost != null) {
+      cpHost.preModifyTableHandler(this.tableName, this.htd);
+    }
     // Update descriptor
     this.masterServices.getTableDescriptors().add(this.htd);
+    if (cpHost != null) {
+      cpHost.postModifyTableHandler(this.tableName, this.htd);
+    }
   }
 
   @Override

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableAddFamilyHandler.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableAddFamilyHandler.java?rev=1334560&r1=1334559&r2=1334560&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableAddFamilyHandler.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableAddFamilyHandler.java Sun May  6 05:52:47 2012
@@ -28,6 +28,8 @@ import org.apache.hadoop.hbase.HRegionIn
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.InvalidFamilyOperationException;
 import org.apache.hadoop.hbase.Server;
+import org.apache.hadoop.hbase.master.HMaster;
+import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
 import org.apache.hadoop.hbase.master.MasterServices;
 
 /**
@@ -52,11 +54,19 @@ public class TableAddFamilyHandler exten
   @Override
   protected void handleTableOperation(List<HRegionInfo> hris)
   throws IOException {
+    MasterCoprocessorHost cpHost = ((HMaster) this.server)
+        .getCoprocessorHost();
+    if(cpHost != null){
+      cpHost.preAddColumnHandler(this.tableName, this.familyDesc);
+    }
     // Update table descriptor in HDFS
     HTableDescriptor htd = this.masterServices.getMasterFileSystem()
         .addColumn(tableName, familyDesc);
     // Update in-memory descriptor cache
     this.masterServices.getTableDescriptors().add(htd);
+    if(cpHost != null){
+      cpHost.postAddColumnHandler(this.tableName, this.familyDesc);
+    }
   }
   @Override
   public String toString() {

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableDeleteFamilyHandler.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableDeleteFamilyHandler.java?rev=1334560&r1=1334559&r2=1334560&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableDeleteFamilyHandler.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableDeleteFamilyHandler.java Sun May  6 05:52:47 2012
@@ -26,6 +26,8 @@ import org.apache.hadoop.classification.
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.Server;
+import org.apache.hadoop.hbase.master.HMaster;
+import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
 import org.apache.hadoop.hbase.master.MasterServices;
 import org.apache.hadoop.hbase.util.Bytes;
 
@@ -46,11 +48,19 @@ public class TableDeleteFamilyHandler ex
 
   @Override
   protected void handleTableOperation(List<HRegionInfo> hris) throws IOException {
+    MasterCoprocessorHost cpHost = ((HMaster) this.server)
+        .getCoprocessorHost();
+    if (cpHost != null) {
+      cpHost.preDeleteColumnHandler(this.tableName, this.familyName);
+    }
     // Update table descriptor in HDFS
     HTableDescriptor htd =
       this.masterServices.getMasterFileSystem().deleteColumn(tableName, familyName);
     // Update in-memory descriptor cache
     this.masterServices.getTableDescriptors().add(htd);
+    if (cpHost != null) {
+      cpHost.postDeleteColumnHandler(this.tableName, this.familyName);
+    }
   }
 
   @Override

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableModifyFamilyHandler.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableModifyFamilyHandler.java?rev=1334560&r1=1334559&r2=1334560&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableModifyFamilyHandler.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/TableModifyFamilyHandler.java Sun May  6 05:52:47 2012
@@ -28,6 +28,8 @@ import org.apache.hadoop.hbase.HRegionIn
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.InvalidFamilyOperationException;
 import org.apache.hadoop.hbase.Server;
+import org.apache.hadoop.hbase.master.HMaster;
+import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
 import org.apache.hadoop.hbase.master.MasterServices;
 import org.apache.hadoop.hbase.util.Bytes;
 
@@ -49,11 +51,19 @@ public class TableModifyFamilyHandler ex
 
   @Override
   protected void handleTableOperation(List<HRegionInfo> regions) throws IOException {
+    MasterCoprocessorHost cpHost = ((HMaster) this.server)
+        .getCoprocessorHost();
+    if (cpHost != null) {
+      cpHost.preModifyColumnHandler(this.tableName, this.familyDesc);
+    }
     // Update table descriptor in HDFS
     HTableDescriptor htd =
       this.masterServices.getMasterFileSystem().modifyColumn(tableName, familyDesc);
     // Update in-memory descriptor cache
     this.masterServices.getTableDescriptors().add(htd);
+    if (cpHost != null) {
+      cpHost.postModifyColumnHandler(this.tableName, this.familyDesc);
+    }
   }
 
   @Override

Modified: hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java?rev=1334560&r1=1334559&r2=1334560&view=diff
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java (original)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java Sun May  6 05:52:47 2012
@@ -30,6 +30,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.NavigableMap;
+import java.util.concurrent.CountDownLatch;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -56,6 +57,8 @@ import org.junit.experimental.categories
 public class TestMasterObserver {
   private static final Log LOG = LogFactory.getLog(TestMasterObserver.class);
 
+  public static CountDownLatch countDown = new CountDownLatch(1);
+
   public static class CPMasterObserver implements MasterObserver {
 
     private boolean bypass = false;
@@ -90,6 +93,23 @@ public class TestMasterObserver {
     private boolean postStartMasterCalled;
     private boolean startCalled;
     private boolean stopCalled;
+    private boolean preCreateTableHandlerCalled;
+    private boolean postCreateTableHandlerCalled;
+    private boolean preDeleteTableHandlerCalled;
+    private boolean postDeleteTableHandlerCalled;
+    private boolean preAddColumnHandlerCalled;
+    private boolean postAddColumnHandlerCalled;
+    private boolean preModifyColumnHandlerCalled;
+    private boolean postModifyColumnHandlerCalled;
+    private boolean preDeleteColumnHandlerCalled;
+    private boolean postDeleteColumnHandlerCalled;
+    private boolean preEnableTableHandlerCalled;
+    private boolean postEnableTableHandlerCalled;
+    private boolean preDisableTableHandlerCalled;
+    private boolean postDisableTableHandlerCalled;
+    private boolean preModifyTableHandlerCalled;
+    private boolean postModifyTableHandlerCalled;
+
 
     public void enableBypass(boolean bypass) {
       this.bypass = bypass;
@@ -122,6 +142,22 @@ public class TestMasterObserver {
       postBalanceCalled = false;
       preBalanceSwitchCalled = false;
       postBalanceSwitchCalled = false;
+      preCreateTableHandlerCalled = false;
+      postCreateTableHandlerCalled = false;
+      preDeleteTableHandlerCalled = false;
+      postDeleteTableHandlerCalled = false;
+      preModifyTableHandlerCalled = false;
+      postModifyTableHandlerCalled = false;
+      preAddColumnHandlerCalled = false;
+      postAddColumnHandlerCalled = false;
+      preModifyColumnHandlerCalled = false;
+      postModifyColumnHandlerCalled = false;
+      preDeleteColumnHandlerCalled = false;
+      postDeleteColumnHandlerCalled = false;
+      preEnableTableHandlerCalled = false;
+      postEnableTableHandlerCalled = false;
+      preDisableTableHandlerCalled = false;
+      postDisableTableHandlerCalled = false;
     }
 
     @Override
@@ -175,6 +211,8 @@ public class TestMasterObserver {
         byte[] tableName, HTableDescriptor htd) throws IOException {
       if (bypass) {
         env.bypass();
+      }else{
+        env.shouldBypass();
       }
       preModifyTableCalled = true;
     }
@@ -198,7 +236,10 @@ public class TestMasterObserver {
         byte[] tableName, HColumnDescriptor column) throws IOException {
       if (bypass) {
         env.bypass();
+      }else{
+        env.shouldBypass();
       }
+
       preAddColumnCalled = true;
     }
 
@@ -332,7 +373,7 @@ public class TestMasterObserver {
     public boolean preMoveCalledOnly() {
       return preMoveCalled && !postMoveCalled;
     }
-    
+
     @Override
     public void preAssign(ObserverContext<MasterCoprocessorEnvironment> env,
         final HRegionInfo regionInfo) throws IOException {
@@ -347,7 +388,7 @@ public class TestMasterObserver {
         final HRegionInfo regionInfo) throws IOException {
       postAssignCalled = true;
     }
-    
+
     public boolean wasAssignCalled() {
       return preAssignCalled && postAssignCalled;
     }
@@ -461,12 +502,214 @@ public class TestMasterObserver {
     public boolean wasStarted() { return startCalled; }
 
     public boolean wasStopped() { return stopCalled; }
+
+    @Override
+    public void preCreateTableHandler(
+        ObserverContext<MasterCoprocessorEnvironment> env,
+        HTableDescriptor desc, HRegionInfo[] regions) throws IOException {
+      if (bypass) {
+        env.bypass();
+      }
+      preCreateTableHandlerCalled = true;
+    }
+
+    @Override
+    public void postCreateTableHandler(
+        ObserverContext<MasterCoprocessorEnvironment> ctx,
+        HTableDescriptor desc, HRegionInfo[] regions) throws IOException {
+      postCreateTableHandlerCalled = true;
+      countDown.countDown();
+    }
+
+    public boolean wasPreCreateTableHandlerCalled(){
+      return preCreateTableHandlerCalled;
+    }
+    public boolean wasCreateTableHandlerCalled() {
+      return preCreateTableHandlerCalled && postCreateTableHandlerCalled;
+    }
+
+    public boolean wasCreateTableHandlerCalledOnly() {
+      return preCreateTableHandlerCalled && !postCreateTableHandlerCalled;
+    }
+
+    @Override
+    public void preDeleteTableHandler(
+        ObserverContext<MasterCoprocessorEnvironment> env, byte[] tableName)
+        throws IOException {
+      if (bypass) {
+        env.bypass();
+      }
+      preDeleteTableHandlerCalled = true;
+    }
+
+    @Override
+    public void postDeleteTableHandler(
+        ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName)
+        throws IOException {
+      postDeleteTableHandlerCalled = true;
+    }
+
+    public boolean wasDeleteTableHandlerCalled() {
+      return preDeleteTableHandlerCalled && postDeleteTableHandlerCalled;
+    }
+
+    public boolean wasDeleteTableHandlerCalledOnly() {
+      return preDeleteTableHandlerCalled && !postDeleteTableHandlerCalled;
+    }
+    @Override
+    public void preModifyTableHandler(
+        ObserverContext<MasterCoprocessorEnvironment> env, byte[] tableName,
+        HTableDescriptor htd) throws IOException {
+      if (bypass) {
+        env.bypass();
+      }
+      preModifyTableHandlerCalled = true;
+    }
+
+    @Override
+    public void postModifyTableHandler(
+        ObserverContext<MasterCoprocessorEnvironment> env, byte[] tableName,
+        HTableDescriptor htd) throws IOException {
+      postModifyTableHandlerCalled = true;
+    }
+
+    public boolean wasModifyTableHandlerCalled() {
+      return preModifyColumnHandlerCalled && postModifyColumnHandlerCalled;
+    }
+
+    public boolean wasModifyTableHandlerCalledOnly() {
+      return preModifyColumnHandlerCalled && !postModifyColumnHandlerCalled;
+    }
+
+    @Override
+    public void preAddColumnHandler(
+        ObserverContext<MasterCoprocessorEnvironment> env, byte[] tableName,
+        HColumnDescriptor column) throws IOException {
+      if (bypass) {
+        env.bypass();
+      }
+      preAddColumnHandlerCalled = true;
+    }
+
+    @Override
+    public void postAddColumnHandler(
+        ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName,
+        HColumnDescriptor column) throws IOException {
+      postAddColumnHandlerCalled = true;
+    }
+    public boolean wasAddColumnHandlerCalled() {
+      return preAddColumnHandlerCalled && postAddColumnHandlerCalled;
+    }
+
+    public boolean preAddColumnHandlerCalledOnly() {
+      return preAddColumnHandlerCalled && !postAddColumnHandlerCalled;
+    }
+
+    @Override
+    public void preModifyColumnHandler(
+        ObserverContext<MasterCoprocessorEnvironment> env, byte[] tableName,
+        HColumnDescriptor descriptor) throws IOException {
+      if (bypass) {
+        env.bypass();
+      }
+      preModifyColumnHandlerCalled = true;
+    }
+
+    @Override
+    public void postModifyColumnHandler(
+        ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName,
+        HColumnDescriptor descriptor) throws IOException {
+      postModifyColumnHandlerCalled = true;
+    }
+
+    public boolean wasModifyColumnHandlerCalled() {
+      return preModifyColumnHandlerCalled && postModifyColumnHandlerCalled;
+    }
+
+    public boolean preModifyColumnHandlerCalledOnly() {
+      return preModifyColumnHandlerCalled && !postModifyColumnHandlerCalled;
+    }
+    @Override
+    public void preDeleteColumnHandler(
+        ObserverContext<MasterCoprocessorEnvironment> env, byte[] tableName,
+        byte[] c) throws IOException {
+      if (bypass) {
+        env.bypass();
+      }
+      preDeleteColumnHandlerCalled = true;
+    }
+
+    @Override
+    public void postDeleteColumnHandler(
+        ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName,
+        byte[] c) throws IOException {
+      postDeleteColumnHandlerCalled = true;
+    }
+
+    public boolean wasDeleteColumnHandlerCalled() {
+      return preDeleteColumnHandlerCalled && postDeleteColumnHandlerCalled;
+    }
+
+    public boolean preDeleteColumnHandlerCalledOnly() {
+      return preDeleteColumnHandlerCalled && !postDeleteColumnHandlerCalled;
+    }
+
+    @Override
+    public void preEnableTableHandler(
+        ObserverContext<MasterCoprocessorEnvironment> env, byte[] tableName)
+        throws IOException {
+      if (bypass) {
+        env.bypass();
+      }
+      preEnableTableHandlerCalled = true;
+    }
+
+    @Override
+    public void postEnableTableHandler(
+        ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName)
+        throws IOException {
+      postEnableTableHandlerCalled = true;
+    }
+
+    public boolean wasEnableTableHandlerCalled() {
+      return preEnableTableHandlerCalled && postEnableTableHandlerCalled;
+    }
+
+    public boolean preEnableTableHandlerCalledOnly() {
+      return preEnableTableHandlerCalled && !postEnableTableHandlerCalled;
+    }
+
+    @Override
+    public void preDisableTableHandler(
+        ObserverContext<MasterCoprocessorEnvironment> env, byte[] tableName)
+        throws IOException {
+      if (bypass) {
+        env.bypass();
+      }
+      preDisableTableHandlerCalled = true;
+    }
+
+    @Override
+    public void postDisableTableHandler(
+        ObserverContext<MasterCoprocessorEnvironment> ctx, byte[] tableName)
+        throws IOException {
+      postDisableTableHandlerCalled = true;
+    }
+
+    public boolean wasDisableTableHandlerCalled() {
+      return preDisableTableHandlerCalled && postDisableTableHandlerCalled;
+    }
+
+    public boolean preDisableTableHandlerCalledOnly() {
+      return preDisableTableHandlerCalled && !postDisableTableHandlerCalled;
+    }
   }
 
   private static HBaseTestingUtility UTIL = new HBaseTestingUtility();
   private static byte[] TEST_TABLE = Bytes.toBytes("observed_table");
   private static byte[] TEST_FAMILY = Bytes.toBytes("fam1");
   private static byte[] TEST_FAMILY2 = Bytes.toBytes("fam2");
+  private static byte[] TEST_FAMILY3 = Bytes.toBytes("fam3");
 
   @BeforeClass
   public static void setupBeforeClass() throws Exception {
@@ -520,12 +763,20 @@ public class TestMasterObserver {
     admin.createTable(htd);
     // preCreateTable can't bypass default action.
     assertTrue("Test table should be created", cp.wasCreateTableCalled());
+    countDown.await();
+    assertTrue("Table pre create handler called.", cp
+        .wasPreCreateTableHandlerCalled());
+    assertTrue("Table create handler should be called.",
+        cp.wasCreateTableHandlerCalled());
 
+    countDown = new CountDownLatch(1);
     admin.disableTable(TEST_TABLE);
     assertTrue(admin.isTableDisabled(TEST_TABLE));
     // preDisableTable can't bypass default action.
     assertTrue("Coprocessor should have been called on table disable",
       cp.wasDisableTableCalled());
+    assertTrue("Disable table handler should be called.",
+        cp.wasDisableTableHandlerCalled());
 
     // enable
     assertFalse(cp.wasEnableTableCalled());
@@ -534,6 +785,8 @@ public class TestMasterObserver {
     // preEnableTable can't bypass default action.
     assertTrue("Coprocessor should have been called on table enable",
       cp.wasEnableTableCalled());
+    assertTrue("Enable table handler should be called.",
+        cp.wasEnableTableHandlerCalled());
 
     admin.disableTable(TEST_TABLE);
     assertTrue(admin.isTableDisabled(TEST_TABLE));
@@ -563,8 +816,9 @@ public class TestMasterObserver {
         admin.tableExists(TEST_TABLE));
     // preDeleteTable can't bypass default action.
     assertTrue("Coprocessor should have been called on table delete",
-      cp.wasDeleteTableCalled());
-
+        cp.wasDeleteTableCalled());
+    assertTrue("Delete table handler should be called.",
+        cp.wasDeleteTableHandlerCalled());
 
     // turn off bypass, run the tests again
     cp.enableBypass(false);
@@ -572,25 +826,33 @@ public class TestMasterObserver {
 
     admin.createTable(htd);
     assertTrue("Test table should be created", cp.wasCreateTableCalled());
+    countDown.await();
+    assertTrue("Table pre create handler called.", cp
+        .wasPreCreateTableHandlerCalled());
+    assertTrue("Table create handler should be called.",
+        cp.wasCreateTableHandlerCalled());
 
     // disable
     assertFalse(cp.wasDisableTableCalled());
-
+    assertFalse(cp.wasDisableTableHandlerCalled());
     admin.disableTable(TEST_TABLE);
     assertTrue(admin.isTableDisabled(TEST_TABLE));
     assertTrue("Coprocessor should have been called on table disable",
       cp.wasDisableTableCalled());
+    assertTrue("Disable table handler should be called.",
+        cp.wasDisableTableHandlerCalled());
 
     // modify table
     htd.setMaxFileSize(512 * 1024 * 1024);
     admin.modifyTable(TEST_TABLE, htd);
     assertTrue("Test table should have been modified",
         cp.wasModifyTableCalled());
-
     // add a column family
     admin.addColumn(TEST_TABLE, new HColumnDescriptor(TEST_FAMILY2));
     assertTrue("New column family should have been added to test table",
         cp.wasAddColumnCalled());
+    assertTrue("Add column handler should be called.",
+        cp.wasAddColumnHandlerCalled());
 
     // modify a column family
     HColumnDescriptor hcd = new HColumnDescriptor(TEST_FAMILY2);
@@ -598,13 +860,18 @@ public class TestMasterObserver {
     admin.modifyColumn(TEST_TABLE, hcd);
     assertTrue("Second column family should be modified",
         cp.wasModifyColumnCalled());
+    assertTrue("Modify table handler should be called.",
+        cp.wasModifyColumnHandlerCalled());
 
     // enable
     assertFalse(cp.wasEnableTableCalled());
+    assertFalse(cp.wasEnableTableHandlerCalled());
     admin.enableTable(TEST_TABLE);
     assertTrue(admin.isTableEnabled(TEST_TABLE));
     assertTrue("Coprocessor should have been called on table enable",
         cp.wasEnableTableCalled());
+    assertTrue("Enable table handler should be called.",
+        cp.wasEnableTableHandlerCalled());
 
     // disable again
     admin.disableTable(TEST_TABLE);
@@ -612,20 +879,28 @@ public class TestMasterObserver {
 
     // delete column
     assertFalse("No column family deleted yet", cp.wasDeleteColumnCalled());
+    assertFalse("Delete table column handler should not be called.",
+        cp.wasDeleteColumnHandlerCalled());
     admin.deleteColumn(TEST_TABLE, TEST_FAMILY2);
     HTableDescriptor tableDesc = admin.getTableDescriptor(TEST_TABLE);
     assertNull("'"+Bytes.toString(TEST_FAMILY2)+"' should have been removed",
         tableDesc.getFamily(TEST_FAMILY2));
     assertTrue("Coprocessor should have been called on column delete",
         cp.wasDeleteColumnCalled());
+    assertTrue("Delete table column handler should be called.",
+        cp.wasDeleteColumnHandlerCalled());
 
     // delete table
     assertFalse("No table deleted yet", cp.wasDeleteTableCalled());
+    assertFalse("Delete table handler should not be called.",
+        cp.wasDeleteTableHandlerCalled());
     admin.deleteTable(TEST_TABLE);
     assertFalse("Test table should have been deleted",
         admin.tableExists(TEST_TABLE));
     assertTrue("Coprocessor should have been called on table delete",
         cp.wasDeleteTableCalled());
+    assertTrue("Delete table handler should be called.",
+        cp.wasDeleteTableHandlerCalled());
   }
 
   @Test
@@ -642,7 +917,7 @@ public class TestMasterObserver {
     HTable table = UTIL.createTable(TEST_TABLE, TEST_FAMILY);
     int countOfRegions = UTIL.createMultiRegions(table, TEST_FAMILY);
     UTIL.waitUntilAllRegionsAssigned(countOfRegions);
-    
+
     NavigableMap<HRegionInfo, ServerName> regions = table.getRegionLocations();
     Map.Entry<HRegionInfo, ServerName> firstGoodPair = null;
     for (Map.Entry<HRegionInfo, ServerName> e: regions.entrySet()) {