HBASE-20567 Pass both old and new descriptors to pre/post hooks of modify 
operations for table and namespace.

Signed-off-by: Mike Drob <md...@apache.org>


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

Branch: refs/heads/HBASE-19064
Commit: 8c9825a030ace256343dc6669b6edec22e6f75fd
Parents: 2c32272
Author: Apekshit Sharma <a...@apache.org>
Authored: Thu May 10 20:34:14 2018 -0700
Committer: Mike Drob <md...@apache.org>
Committed: Wed May 16 14:03:18 2018 -0500

----------------------------------------------------------------------
 .../hbase/coprocessor/MasterObserver.java       | 122 +++++++++++++++++--
 .../org/apache/hadoop/hbase/master/HMaster.java |  29 +++--
 .../hbase/master/MasterCoprocessorHost.java     |  36 +++---
 .../master/procedure/ModifyTableProcedure.java  |   6 +-
 4 files changed, 151 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/8c9825a0/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
index a17bc9f..a37f21a 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java
@@ -209,20 +209,67 @@ public interface MasterObserver {
    * table RPC call.
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
-   * @param htd the TableDescriptor
+   * @param newDescriptor after modify operation, table will have this 
descriptor
+   * @deprecated Since 2.1. Will be removed in 3.0.
    */
+  @Deprecated
   default void preModifyTable(final 
ObserverContext<MasterCoprocessorEnvironment> ctx,
-      final TableName tableName, TableDescriptor htd) throws IOException {}
+    final TableName tableName, TableDescriptor newDescriptor) throws 
IOException {}
+
+  /**
+   * Called prior to modifying a table's properties.  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 currentDescriptor current TableDescriptor of the table
+   * @param newDescriptor after modify operation, table will have this 
descriptor
+   */
+  default void preModifyTable(final 
ObserverContext<MasterCoprocessorEnvironment> ctx,
+      final TableName tableName, TableDescriptor currentDescriptor, 
TableDescriptor newDescriptor)
+    throws IOException {
+    preModifyTable(ctx, tableName, newDescriptor);
+  }
 
   /**
    * 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 TableDescriptor
+   * @param currentDescriptor current TableDescriptor of the table
+   * @deprecated Since 2.1. Will be removed in 3.0.
    */
+  @Deprecated
   default void postModifyTable(final 
ObserverContext<MasterCoprocessorEnvironment> ctx,
-      final TableName tableName, TableDescriptor htd) throws IOException {}
+    final TableName tableName, TableDescriptor currentDescriptor) throws 
IOException {}
+
+  /**
+   * 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 oldDescriptor descriptor of table before modify operation happened
+   * @param currentDescriptor current TableDescriptor of the table
+   */
+  default void postModifyTable(final 
ObserverContext<MasterCoprocessorEnvironment> ctx,
+      final TableName tableName, TableDescriptor oldDescriptor, 
TableDescriptor currentDescriptor)
+    throws IOException {
+    postModifyTable(ctx, tableName, currentDescriptor);
+  }
+
+  /**
+   * Called prior to modifying a table's properties.  Called as part of modify
+   * table procedure and it is async to the modify table RPC call.
+   *
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   * @param newDescriptor after modify operation, table will have this 
descriptor
+   * @deprecated Since 2.1. Will be removed in 3.0.
+   */
+  @Deprecated
+  default void preModifyTableAction(
+    final ObserverContext<MasterCoprocessorEnvironment> ctx,
+    final TableName tableName,
+    final TableDescriptor newDescriptor) throws IOException {}
 
   /**
    * Called prior to modifying a table's properties.  Called as part of modify
@@ -230,12 +277,16 @@ public interface MasterObserver {
    *
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
-   * @param htd the TableDescriptor
+   * @param currentDescriptor current TableDescriptor of the table
+   * @param newDescriptor after modify operation, table will have this 
descriptor
    */
   default void preModifyTableAction(
       final ObserverContext<MasterCoprocessorEnvironment> ctx,
       final TableName tableName,
-      final TableDescriptor htd) throws IOException {}
+      final TableDescriptor currentDescriptor,
+      final TableDescriptor newDescriptor) throws IOException {
+    preModifyTableAction(ctx, tableName, newDescriptor);
+  }
 
   /**
    * Called after to modifying a table's properties.  Called as part of modify
@@ -243,12 +294,31 @@ public interface MasterObserver {
    *
    * @param ctx the environment to interact with the framework and master
    * @param tableName the name of the table
-   * @param htd the TableDescriptor
+   * @param currentDescriptor current TableDescriptor of the table
+   * @deprecated Since 2.1. Will be removed in 3.0.
+   */
+  @Deprecated
+  default void postCompletedModifyTableAction(
+    final ObserverContext<MasterCoprocessorEnvironment> ctx,
+    final TableName tableName,
+    final TableDescriptor currentDescriptor) throws IOException {}
+
+  /**
+   * Called after to modifying a table's properties.  Called as part of modify
+   * table procedure and it is async to the modify table RPC call.
+   *
+   * @param ctx the environment to interact with the framework and master
+   * @param tableName the name of the table
+   * @param oldDescriptor descriptor of table before modify operation happened
+   * @param currentDescriptor current TableDescriptor of the table
    */
   default void postCompletedModifyTableAction(
       final ObserverContext<MasterCoprocessorEnvironment> ctx,
       final TableName tableName,
-      final TableDescriptor htd) throws IOException {}
+      final TableDescriptor oldDescriptor,
+      final TableDescriptor currentDescriptor) throws IOException {
+    postCompletedModifyTableAction(ctx, tableName, currentDescriptor);
+  }
 
   /**
    * Called prior to enabling a table.  Called as part of enable table RPC 
call.
@@ -817,18 +887,46 @@ public interface MasterObserver {
   /**
    * Called prior to modifying a namespace's properties.
    * @param ctx the environment to interact with the framework and master
-   * @param ns the NamespaceDescriptor
+   * @param newNsDescriptor after modify operation, namespace will have this 
descriptor
+   * @deprecated Since 2.1. Will be removed in 3.0.
    */
+  @Deprecated
   default void preModifyNamespace(final 
ObserverContext<MasterCoprocessorEnvironment> ctx,
-      NamespaceDescriptor ns) throws IOException {}
+    NamespaceDescriptor newNsDescriptor) throws IOException {}
+
+  /**
+   * Called prior to modifying a namespace's properties.
+   * @param ctx the environment to interact with the framework and master
+   * @param currentNsDescriptor current NamespaceDescriptor of the namespace
+   * @param newNsDescriptor after modify operation, namespace will have this 
descriptor
+   */
+  default void preModifyNamespace(final 
ObserverContext<MasterCoprocessorEnvironment> ctx,
+      NamespaceDescriptor currentNsDescriptor, NamespaceDescriptor 
newNsDescriptor)
+    throws IOException {
+    preModifyNamespace(ctx, newNsDescriptor);
+  }
 
   /**
    * Called after the modifyNamespace operation has been requested.
    * @param ctx the environment to interact with the framework and master
-   * @param ns the NamespaceDescriptor
+   * @param currentNsDescriptor current NamespaceDescriptor of the namespace
+   * @deprecated Since 2.1. Will be removed in 3.0.
    */
+  @Deprecated
   default void postModifyNamespace(final 
ObserverContext<MasterCoprocessorEnvironment> ctx,
-      NamespaceDescriptor ns) throws IOException {}
+    NamespaceDescriptor currentNsDescriptor) throws IOException {}
+
+  /**
+   * Called after the modifyNamespace operation has been requested.
+   * @param ctx the environment to interact with the framework and master
+   * @param oldNsDescriptor descriptor of namespace before modify operation 
happened
+   * @param currentNsDescriptor current NamespaceDescriptor of the namespace
+   */
+  default void postModifyNamespace(final 
ObserverContext<MasterCoprocessorEnvironment> ctx,
+      NamespaceDescriptor oldNsDescriptor, NamespaceDescriptor 
currentNsDescriptor)
+    throws IOException {
+    postModifyNamespace(ctx, currentNsDescriptor);
+  }
 
   /**
    * Called before a getNamespaceDescriptor request has been processed.

http://git-wip-us.apache.org/repos/asf/hbase/blob/8c9825a0/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
index 9dd685d..6c41b8e 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
@@ -2362,16 +2362,18 @@ public class HMaster extends HRegionServer implements 
MasterServices {
   }
 
   @Override
-  public long modifyTable(final TableName tableName, final TableDescriptor 
descriptor,
+  public long modifyTable(final TableName tableName, final TableDescriptor 
newDescriptor,
       final long nonceGroup, final long nonce) throws IOException {
     checkInitialized();
-    sanityCheckTableDescriptor(descriptor);
+    sanityCheckTableDescriptor(newDescriptor);
 
     return MasterProcedureUtil.submitProcedure(
         new MasterProcedureUtil.NonceProcedureRunnable(this, nonceGroup, 
nonce) {
       @Override
       protected void run() throws IOException {
-        getMaster().getMasterCoprocessorHost().preModifyTable(tableName, 
descriptor);
+        TableDescriptor oldDescriptor = 
getMaster().getTableDescriptors().get(tableName);
+        getMaster().getMasterCoprocessorHost()
+          .preModifyTable(tableName, oldDescriptor, newDescriptor);
 
         LOG.info(getClientIdAuditPrefix() + " modify " + tableName);
 
@@ -2380,11 +2382,12 @@ public class HMaster extends HRegionServer implements 
MasterServices {
         // We need to wait for the procedure to potentially fail due to 
"prepare" sanity
         // checks. This will block only the beginning of the procedure. See 
HBASE-19953.
         ProcedurePrepareLatch latch = 
ProcedurePrepareLatch.createBlockingLatch();
-        submitProcedure(new 
ModifyTableProcedure(procedureExecutor.getEnvironment(),
-            descriptor, latch));
+        submitProcedure(
+          new ModifyTableProcedure(procedureExecutor.getEnvironment(), 
newDescriptor, latch));
         latch.await();
 
-        getMaster().getMasterCoprocessorHost().postModifyTable(tableName, 
descriptor);
+        getMaster().getMasterCoprocessorHost()
+          .postModifyTable(tableName, oldDescriptor, newDescriptor);
       }
 
       @Override
@@ -2997,26 +3000,28 @@ public class HMaster extends HRegionServer implements 
MasterServices {
    * <code>nonceGroup</code> (the source must ensure each operation gets a 
unique id).
    * @return procedure id
    */
-  long modifyNamespace(final NamespaceDescriptor namespaceDescriptor, final 
long nonceGroup,
+  long modifyNamespace(final NamespaceDescriptor newNsDescriptor, final long 
nonceGroup,
       final long nonce) throws IOException {
     checkInitialized();
 
-    
TableName.isLegalNamespaceName(Bytes.toBytes(namespaceDescriptor.getName()));
+    TableName.isLegalNamespaceName(Bytes.toBytes(newNsDescriptor.getName()));
 
     return MasterProcedureUtil.submitProcedure(new 
MasterProcedureUtil.NonceProcedureRunnable(this,
           nonceGroup, nonce) {
       @Override
       protected void run() throws IOException {
-        
getMaster().getMasterCoprocessorHost().preModifyNamespace(namespaceDescriptor);
+        NamespaceDescriptor oldNsDescriptor = 
getNamespace(newNsDescriptor.getName());
+        
getMaster().getMasterCoprocessorHost().preModifyNamespace(oldNsDescriptor, 
newNsDescriptor);
         // We need to wait for the procedure to potentially fail due to 
"prepare" sanity
         // checks. This will block only the beginning of the procedure. See 
HBASE-19953.
         ProcedurePrepareLatch latch = 
ProcedurePrepareLatch.createBlockingLatch();
-        LOG.info(getClientIdAuditPrefix() + " modify " + namespaceDescriptor);
+        LOG.info(getClientIdAuditPrefix() + " modify " + newNsDescriptor);
         // Execute the operation synchronously - wait for the operation to 
complete before
         // continuing.
-        setProcId(getClusterSchema().modifyNamespace(namespaceDescriptor, 
getNonceKey(), latch));
+        setProcId(getClusterSchema().modifyNamespace(newNsDescriptor, 
getNonceKey(), latch));
         latch.await();
-        
getMaster().getMasterCoprocessorHost().postModifyNamespace(namespaceDescriptor);
+        
getMaster().getMasterCoprocessorHost().postModifyNamespace(oldNsDescriptor,
+          newNsDescriptor);
       }
 
       @Override

http://git-wip-us.apache.org/repos/asf/hbase/blob/8c9825a0/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
index 8c8c02c..072ae8a 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
@@ -254,20 +254,22 @@ public class MasterCoprocessorHost
     });
   }
 
-  public void preModifyNamespace(final NamespaceDescriptor ns) throws 
IOException {
+  public void preModifyNamespace(final NamespaceDescriptor currentNsDescriptor,
+    final NamespaceDescriptor newNsDescriptor) throws IOException {
     execOperation(coprocEnvironments.isEmpty() ? null : new 
MasterObserverOperation() {
       @Override
       public void call(MasterObserver observer) throws IOException {
-        observer.preModifyNamespace(this, ns);
+        observer.preModifyNamespace(this, currentNsDescriptor, 
newNsDescriptor);
       }
     });
   }
 
-  public void postModifyNamespace(final NamespaceDescriptor ns) throws 
IOException {
+  public void postModifyNamespace(final NamespaceDescriptor oldNsDescriptor,
+    final NamespaceDescriptor currentNsDescriptor) throws IOException {
     execOperation(coprocEnvironments.isEmpty() ? null : new 
MasterObserverOperation() {
       @Override
       public void call(MasterObserver observer) throws IOException {
-        observer.postModifyNamespace(this, ns);
+        observer.postModifyNamespace(this, oldNsDescriptor, 
currentNsDescriptor);
       }
     });
   }
@@ -429,42 +431,44 @@ public class MasterCoprocessorHost
     });
   }
 
-  public void preModifyTable(final TableName tableName, final TableDescriptor 
htd)
-      throws IOException {
+  public void preModifyTable(final TableName tableName, final TableDescriptor 
currentDescriptor,
+    final TableDescriptor newDescriptor) throws IOException {
     execOperation(coprocEnvironments.isEmpty() ? null : new 
MasterObserverOperation() {
       @Override
       public void call(MasterObserver observer) throws IOException {
-        observer.preModifyTable(this, tableName, htd);
+        observer.preModifyTable(this, tableName, currentDescriptor, 
newDescriptor);
       }
     });
   }
 
-  public void postModifyTable(final TableName tableName, final TableDescriptor 
htd)
-      throws IOException {
+  public void postModifyTable(final TableName tableName, final TableDescriptor 
oldDescriptor,
+    final TableDescriptor currentDescriptor) throws IOException {
     execOperation(coprocEnvironments.isEmpty() ? null : new 
MasterObserverOperation() {
       @Override
       public void call(MasterObserver observer) throws IOException {
-        observer.postModifyTable(this, tableName, htd);
+        observer.postModifyTable(this, tableName, oldDescriptor, 
currentDescriptor);
       }
     });
   }
 
-  public void preModifyTableAction(final TableName tableName, final 
TableDescriptor htd,
-      final User user) throws IOException {
+  public void preModifyTableAction(final TableName tableName,
+    final TableDescriptor currentDescriptor, final TableDescriptor 
newDescriptor, final User user)
+    throws IOException {
     execOperation(coprocEnvironments.isEmpty() ? null : new 
MasterObserverOperation(user) {
       @Override
       public void call(MasterObserver observer) throws IOException {
-        observer.preModifyTableAction(this, tableName, htd);
+        observer.preModifyTableAction(this, tableName, currentDescriptor, 
newDescriptor);
       }
     });
   }
 
-  public void postCompletedModifyTableAction(final TableName tableName, final 
TableDescriptor htd,
-      final User user) throws IOException {
+  public void postCompletedModifyTableAction(final TableName tableName,
+    final TableDescriptor oldDescriptor, final TableDescriptor 
currentDescriptor, final User user)
+    throws IOException {
     execOperation(coprocEnvironments.isEmpty() ? null : new 
MasterObserverOperation(user) {
       @Override
       public void call(MasterObserver observer) throws IOException {
-        observer.postCompletedModifyTableAction(this, tableName, htd);
+        observer.postCompletedModifyTableAction(this, tableName, 
oldDescriptor, currentDescriptor);
       }
     });
   }

http://git-wip-us.apache.org/repos/asf/hbase/blob/8c9825a0/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java
index 1f1ba3c..6fb9caa 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.java
@@ -420,10 +420,12 @@ public class ModifyTableProcedure
     if (cpHost != null) {
       switch (state) {
         case MODIFY_TABLE_PRE_OPERATION:
-          cpHost.preModifyTableAction(getTableName(), modifiedTableDescriptor, 
getUser());
+          cpHost.preModifyTableAction(getTableName(), 
unmodifiedTableDescriptor,
+            modifiedTableDescriptor, getUser());
           break;
         case MODIFY_TABLE_POST_OPERATION:
-          cpHost.postCompletedModifyTableAction(getTableName(), 
modifiedTableDescriptor,getUser());
+          cpHost.postCompletedModifyTableAction(getTableName(), 
unmodifiedTableDescriptor,
+            modifiedTableDescriptor,getUser());
           break;
         default:
           throw new UnsupportedOperationException(this + " unhandled state=" + 
state);

Reply via email to