You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2018/12/11 03:34:26 UTC
[03/16] hbase git commit: HBASE-21550 Add a new method
preCreateTableRegionInfos for MasterObserver which allows CPs to modify the
TableDescriptor
HBASE-21550 Add a new method preCreateTableRegionInfos for MasterObserver which allows CPs to modify the TableDescriptor
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/f49baf25
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/f49baf25
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/f49baf25
Branch: refs/heads/HBASE-21512
Commit: f49baf259ec6bc2c8634debd2dbfc592753245d3
Parents: 8bf966c
Author: Duo Zhang <zh...@apache.org>
Authored: Wed Dec 5 18:19:15 2018 +0800
Committer: zhangduo <zh...@apache.org>
Committed: Thu Dec 6 08:30:32 2018 +0800
----------------------------------------------------------------------
.../hbase/coprocessor/MasterObserver.java | 15 +++++
.../org/apache/hadoop/hbase/master/HMaster.java | 68 ++++++++++----------
.../hbase/master/MasterCoprocessorHost.java | 14 ++++
.../hbase/coprocessor/TestMasterObserver.java | 14 +++-
4 files changed, 75 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/f49baf25/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 573ac7a..a0863e4 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
@@ -70,6 +70,21 @@ import org.apache.yetus.audience.InterfaceStability;
@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC)
@InterfaceStability.Evolving
public interface MasterObserver {
+
+ /**
+ * Called before we create the region infos for this table. Called as part of create table RPC
+ * call.
+ * @param ctx the environment to interact with the framework and master
+ * @param desc the TableDescriptor for the table
+ * @return the TableDescriptor used to create the table. Default is the one passed in. Return
+ * {@code null} means cancel the creation.
+ */
+ default TableDescriptor preCreateTableRegionsInfos(
+ final ObserverContext<MasterCoprocessorEnvironment> ctx, TableDescriptor desc)
+ throws IOException {
+ return desc;
+ }
+
/**
* Called before a new table is created by
* {@link org.apache.hadoop.hbase.master.HMaster}. Called as part of create
http://git-wip-us.apache.org/repos/asf/hbase/blob/f49baf25/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 132e271..e96dc36 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
@@ -2030,45 +2030,45 @@ public class HMaster extends HRegionServer implements MasterServices {
}
@Override
- public long createTable(
- final TableDescriptor tableDescriptor,
- final byte [][] splitKeys,
- final long nonceGroup,
- final long nonce) throws IOException {
+ public long createTable(final TableDescriptor tableDescriptor, final byte[][] splitKeys,
+ final long nonceGroup, final long nonce) throws IOException {
checkInitialized();
-
- String namespace = tableDescriptor.getTableName().getNamespaceAsString();
+ TableDescriptor desc = getMasterCoprocessorHost().preCreateTableRegionsInfos(tableDescriptor);
+ if (desc == null) {
+ throw new IOException("Creation for " + tableDescriptor + " is canceled by CP");
+ }
+ String namespace = desc.getTableName().getNamespaceAsString();
this.clusterSchemaService.getNamespace(namespace);
- RegionInfo[] newRegions = ModifyRegionUtils.createRegionInfos(tableDescriptor, splitKeys);
- sanityCheckTableDescriptor(tableDescriptor);
-
- return MasterProcedureUtil.submitProcedure(
- new MasterProcedureUtil.NonceProcedureRunnable(this, nonceGroup, nonce) {
- @Override
- protected void run() throws IOException {
- getMaster().getMasterCoprocessorHost().preCreateTable(tableDescriptor, newRegions);
-
- LOG.info(getClientIdAuditPrefix() + " create " + tableDescriptor);
-
- // TODO: We can handle/merge duplicate requests, and differentiate the case of
- // TableExistsException by saying if the schema is the same or not.
- //
- // 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 CreateTableProcedure(
- procedureExecutor.getEnvironment(), tableDescriptor, newRegions, latch));
- latch.await();
+ RegionInfo[] newRegions = ModifyRegionUtils.createRegionInfos(desc, splitKeys);
+ sanityCheckTableDescriptor(desc);
- getMaster().getMasterCoprocessorHost().postCreateTable(tableDescriptor, newRegions);
- }
+ return MasterProcedureUtil
+ .submitProcedure(new MasterProcedureUtil.NonceProcedureRunnable(this, nonceGroup, nonce) {
+ @Override
+ protected void run() throws IOException {
+ getMaster().getMasterCoprocessorHost().preCreateTable(desc, newRegions);
+
+ LOG.info(getClientIdAuditPrefix() + " create " + desc);
+
+ // TODO: We can handle/merge duplicate requests, and differentiate the case of
+ // TableExistsException by saying if the schema is the same or not.
+ //
+ // 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 CreateTableProcedure(procedureExecutor.getEnvironment(), desc, newRegions, latch));
+ latch.await();
+
+ getMaster().getMasterCoprocessorHost().postCreateTable(desc, newRegions);
+ }
- @Override
- protected String getDescription() {
- return "CreateTableProcedure";
- }
- });
+ @Override
+ protected String getDescription() {
+ return "CreateTableProcedure";
+ }
+ });
}
@Override
http://git-wip-us.apache.org/repos/asf/hbase/blob/f49baf25/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 019c64f..51e30c4 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
@@ -317,6 +317,20 @@ public class MasterCoprocessorHost
/* Implementation of hooks for invoking MasterObservers */
+ public TableDescriptor preCreateTableRegionsInfos(TableDescriptor desc) throws IOException {
+ if (coprocEnvironments.isEmpty()) {
+ return desc;
+ }
+ return execOperationWithResult(
+ new ObserverOperationWithResult<MasterObserver, TableDescriptor>(masterObserverGetter, desc) {
+
+ @Override
+ protected TableDescriptor call(MasterObserver observer) throws IOException {
+ return observer.preCreateTableRegionsInfos(this, getResult());
+ }
+ });
+ }
+
public void preCreateTable(final TableDescriptor htd, final RegionInfo[] regions)
throws IOException {
execOperation(coprocEnvironments.isEmpty() ? null : new MasterObserverOperation() {
http://git-wip-us.apache.org/repos/asf/hbase/blob/f49baf25/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java
index a606e27..d8a5b4c 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java
@@ -94,6 +94,7 @@ public class TestMasterObserver {
public static class CPMasterObserver implements MasterCoprocessor, MasterObserver {
+ private boolean preCreateTableRegionInfosCalled;
private boolean preCreateTableCalled;
private boolean postCreateTableCalled;
private boolean preDeleteTableCalled;
@@ -186,6 +187,7 @@ public class TestMasterObserver {
private boolean postLockHeartbeatCalled;
public void resetStates() {
+ preCreateTableRegionInfosCalled = false;
preCreateTableCalled = false;
postCreateTableCalled = false;
preDeleteTableCalled = false;
@@ -298,6 +300,14 @@ public class TestMasterObserver {
}
@Override
+ public TableDescriptor preCreateTableRegionsInfos(
+ ObserverContext<MasterCoprocessorEnvironment> ctx, TableDescriptor desc)
+ throws IOException {
+ preCreateTableRegionInfosCalled = true;
+ return desc;
+ }
+
+ @Override
public void preCreateTable(ObserverContext<MasterCoprocessorEnvironment> env,
TableDescriptor desc, RegionInfo[] regions) throws IOException {
preCreateTableCalled = true;
@@ -310,11 +320,11 @@ public class TestMasterObserver {
}
public boolean wasCreateTableCalled() {
- return preCreateTableCalled && postCreateTableCalled;
+ return preCreateTableRegionInfosCalled && preCreateTableCalled && postCreateTableCalled;
}
public boolean preCreateTableCalledOnly() {
- return preCreateTableCalled && !postCreateTableCalled;
+ return preCreateTableRegionInfosCalled && preCreateTableCalled && !postCreateTableCalled;
}
@Override