You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ap...@apache.org on 2015/02/15 20:21:13 UTC
[2/2] hbase git commit: HBASE-13044 Configuration option for
disabling coprocessor loading
HBASE-13044 Configuration option for disabling coprocessor loading
Conflicts:
hbase-common/src/main/resources/hbase-default.xml
hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorConfiguration.java
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/96711bfc
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/96711bfc
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/96711bfc
Branch: refs/heads/0.98
Commit: 96711bfc0e2bdce360da43775272b4fb48965be1
Parents: 2416826
Author: Andrew Purtell <ap...@apache.org>
Authored: Sun Feb 15 11:02:40 2015 -0800
Committer: Andrew Purtell <ap...@apache.org>
Committed: Sun Feb 15 11:19:22 2015 -0800
----------------------------------------------------------------------
.../src/main/resources/hbase-default.xml | 16 ++
.../hbase/coprocessor/CoprocessorHost.java | 11 ++
.../hbase/master/MasterCoprocessorHost.java | 25 ++-
.../regionserver/RegionCoprocessorHost.java | 8 +
.../RegionServerCoprocessorHost.java | 15 +-
.../TestCoprocessorConfiguration.java | 171 +++++++++++++++++++
6 files changed, 242 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/96711bfc/hbase-common/src/main/resources/hbase-default.xml
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/resources/hbase-default.xml b/hbase-common/src/main/resources/hbase-default.xml
index 4a3442f..f4c5e57 100644
--- a/hbase-common/src/main/resources/hbase-default.xml
+++ b/hbase-common/src/main/resources/hbase-default.xml
@@ -846,6 +846,22 @@ possible configurations would overwhelm and obscure the important.
authentication, and will abort the connection.</description>
</property>
<property>
+ <name>hbase.coprocessor.enabled</name>
+ <value>true</value>
+ <description>Enables or disables coprocessor loading. If 'false'
+ (disabled), any other coprocessor related configuration will be ignored.
+ </description>
+ </property>
+ <property>
+ <name>hbase.coprocessor.user.enabled</name>
+ <value>true</value>
+ <description>Enables or disables user (aka. table) coprocessor loading.
+ If 'false' (disabled), any table coprocessor attributes in table
+ descriptors will be ignored. If "hbase.coprocessor.enabled" is 'false'
+ this setting has no effect.
+ </description>
+ </property>
+ <property>
<name>hbase.coprocessor.region.classes</name>
<value></value>
<description>A comma-separated list of Coprocessors that are loaded by
http://git-wip-us.apache.org/repos/asf/hbase/blob/96711bfc/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java
index 08e74e5..1c55738 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorHost.java
@@ -97,6 +97,11 @@ public abstract class CoprocessorHost<E extends CoprocessorEnvironment> {
"hbase.coprocessor.wal.classes";
public static final String ABORT_ON_ERROR_KEY = "hbase.coprocessor.abortonerror";
public static final boolean DEFAULT_ABORT_ON_ERROR = true;
+ public static final String COPROCESSORS_ENABLED_CONF_KEY = "hbase.coprocessor.enabled";
+ public static final boolean DEFAULT_COPROCESSORS_ENABLED = true;
+ public static final String USER_COPROCESSORS_ENABLED_CONF_KEY =
+ "hbase.coprocessor.user.enabled";
+ public static final boolean DEFAULT_USER_COPROCESSORS_ENABLED = true;
protected static final Log LOG = LogFactory.getLog(CoprocessorHost.class);
protected Abortable abortable;
@@ -147,6 +152,12 @@ public abstract class CoprocessorHost<E extends CoprocessorEnvironment> {
* Called by constructor.
*/
protected void loadSystemCoprocessors(Configuration conf, String confKey) {
+ boolean coprocessorsEnabled = conf.getBoolean(COPROCESSORS_ENABLED_CONF_KEY,
+ DEFAULT_COPROCESSORS_ENABLED);
+ if (!coprocessorsEnabled) {
+ return;
+ }
+
Class<?> implClass = null;
// load default coprocessors from configure file
http://git-wip-us.apache.org/repos/asf/hbase/blob/96711bfc/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 34a8b0c..d1b0a9a 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
@@ -19,9 +19,20 @@
package org.apache.hadoop.hbase.master;
-import org.apache.hadoop.hbase.classification.InterfaceAudience;
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.*;
+import org.apache.hadoop.hbase.Coprocessor;
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.NamespaceDescriptor;
+import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.classification.InterfaceAudience;
import org.apache.hadoop.hbase.coprocessor.*;
import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription;
@@ -37,6 +48,8 @@ import java.util.List;
public class MasterCoprocessorHost
extends CoprocessorHost<MasterCoprocessorHost.MasterEnvironment> {
+ private static final Log LOG = LogFactory.getLog(MasterCoprocessorHost.class);
+
/**
* Coprocessor environment extension providing access to master related
* services.
@@ -59,10 +72,16 @@ public class MasterCoprocessorHost
private MasterServices masterServices;
- MasterCoprocessorHost(final MasterServices services, final Configuration conf) {
+ public MasterCoprocessorHost(final MasterServices services, final Configuration conf) {
super(services);
this.conf = conf;
this.masterServices = services;
+ // Log the state of coprocessor loading here; should appear only once or
+ // twice in the daemon log, depending on HBase version, because there is
+ // only one MasterCoprocessorHost instance in the master process
+ boolean coprocessorsEnabled = conf.getBoolean(COPROCESSORS_ENABLED_CONF_KEY,
+ DEFAULT_COPROCESSORS_ENABLED);
+ LOG.info("System coprocessor loading is " + (coprocessorsEnabled ? "enabled" : "disabled"));
loadSystemCoprocessors(conf, MASTER_COPROCESSOR_CONF_KEY);
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/96711bfc/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
index 8e7b842..f45e89c 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
@@ -318,6 +318,14 @@ public class RegionCoprocessorHost
}
void loadTableCoprocessors(final Configuration conf) {
+ boolean coprocessorsEnabled = conf.getBoolean(COPROCESSORS_ENABLED_CONF_KEY,
+ DEFAULT_COPROCESSORS_ENABLED);
+ boolean tableCoprocessorsEnabled = conf.getBoolean(USER_COPROCESSORS_ENABLED_CONF_KEY,
+ DEFAULT_USER_COPROCESSORS_ENABLED);
+ if (!(coprocessorsEnabled && tableCoprocessorsEnabled)) {
+ return;
+ }
+
// scan the table attributes for coprocessor load specifications
// initialize the coprocessors
List<RegionEnvironment> configured = new ArrayList<RegionEnvironment>();
http://git-wip-us.apache.org/repos/asf/hbase/blob/96711bfc/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
index b684d77..988e39a 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java
@@ -22,6 +22,8 @@ import java.io.IOException;
import java.util.Comparator;
import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.CellScanner;
import org.apache.hadoop.hbase.Coprocessor;
@@ -44,6 +46,8 @@ import org.apache.hadoop.hbase.replication.ReplicationEndpoint;
public class RegionServerCoprocessorHost extends
CoprocessorHost<RegionServerCoprocessorHost.RegionServerEnvironment> {
+ private static final Log LOG = LogFactory.getLog(RegionServerCoprocessorHost.class);
+
private RegionServerServices rsServices;
public RegionServerCoprocessorHost(RegionServerServices rsServices,
@@ -51,7 +55,16 @@ public class RegionServerCoprocessorHost extends
super(rsServices);
this.rsServices = rsServices;
this.conf = conf;
- // load system default cp's from configuration.
+ // Log the state of coprocessor loading here; should appear only once or
+ // twice in the daemon log, depending on HBase version, because there is
+ // only one RegionServerCoprocessorHost instance in the RS process
+ boolean coprocessorsEnabled = conf.getBoolean(COPROCESSORS_ENABLED_CONF_KEY,
+ DEFAULT_COPROCESSORS_ENABLED);
+ boolean tableCoprocessorsEnabled = conf.getBoolean(USER_COPROCESSORS_ENABLED_CONF_KEY,
+ DEFAULT_USER_COPROCESSORS_ENABLED);
+ LOG.info("System coprocessor loading is " + (coprocessorsEnabled ? "enabled" : "disabled"));
+ LOG.info("Table coprocessor loading is " +
+ ((coprocessorsEnabled && tableCoprocessorsEnabled) ? "enabled" : "disabled"));
loadSystemCoprocessors(conf, REGIONSERVER_COPROCESSOR_CONF_KEY);
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/96711bfc/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorConfiguration.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorConfiguration.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorConfiguration.java
new file mode 100644
index 0000000..b7a5d4a
--- /dev/null
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorConfiguration.java
@@ -0,0 +1,171 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.coprocessor;
+
+import java.io.IOException;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import static org.mockito.Mockito.*;
+import static org.junit.Assert.*;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.Coprocessor;
+import org.apache.hadoop.hbase.CoprocessorEnvironment;
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
+import org.apache.hadoop.hbase.master.MasterServices;
+import org.apache.hadoop.hbase.regionserver.HRegion;
+import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;
+import org.apache.hadoop.hbase.regionserver.RegionServerCoprocessorHost;
+import org.apache.hadoop.hbase.regionserver.RegionServerServices;
+import org.apache.hadoop.hbase.testclassification.SmallTests;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * Tests for global coprocessor loading configuration
+ */
+@Category(SmallTests.class)
+public class TestCoprocessorConfiguration {
+
+ private static final Configuration CONF = HBaseConfiguration.create();
+ static {
+ CONF.setStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY,
+ SystemCoprocessor.class.getName());
+ CONF.setStrings(CoprocessorHost.REGIONSERVER_COPROCESSOR_CONF_KEY,
+ SystemCoprocessor.class.getName());
+ CONF.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,
+ SystemCoprocessor.class.getName());
+ }
+ private static final TableName TABLENAME = TableName.valueOf("TestCoprocessorConfiguration");
+ private static final HRegionInfo REGIONINFO = new HRegionInfo(TABLENAME);
+ private static final HTableDescriptor TABLEDESC = new HTableDescriptor(TABLENAME);
+ static {
+ try {
+ TABLEDESC.addCoprocessor(TableCoprocessor.class.getName());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ // use atomic types in case coprocessor loading is ever multithreaded, also
+ // so we can mutate them even though they are declared final here
+ private static final AtomicBoolean systemCoprocessorLoaded = new AtomicBoolean();
+ private static final AtomicBoolean tableCoprocessorLoaded = new AtomicBoolean();
+
+ public static class SystemCoprocessor implements Coprocessor {
+ @Override
+ public void start(CoprocessorEnvironment env) throws IOException {
+ systemCoprocessorLoaded.set(true);
+ }
+
+ @Override
+ public void stop(CoprocessorEnvironment env) throws IOException { }
+ }
+
+ public static class TableCoprocessor implements Coprocessor {
+ @Override
+ public void start(CoprocessorEnvironment env) throws IOException {
+ tableCoprocessorLoaded.set(true);
+ }
+
+ @Override
+ public void stop(CoprocessorEnvironment env) throws IOException { }
+ }
+
+ @Test
+ public void testRegionCoprocessorHostDefaults() throws Exception {
+ Configuration conf = new Configuration(CONF);
+ HRegion region = mock(HRegion.class);
+ when(region.getRegionInfo()).thenReturn(REGIONINFO);
+ when(region.getTableDesc()).thenReturn(TABLEDESC);
+ RegionServerServices rsServices = mock(RegionServerServices.class);
+ systemCoprocessorLoaded.set(false);
+ tableCoprocessorLoaded.set(false);
+ new RegionCoprocessorHost(region, rsServices, conf);
+ assertEquals("System coprocessors loading default was not honored",
+ systemCoprocessorLoaded.get(),
+ CoprocessorHost.DEFAULT_COPROCESSORS_ENABLED);
+ assertEquals("Table coprocessors loading default was not honored",
+ tableCoprocessorLoaded.get(),
+ CoprocessorHost.DEFAULT_COPROCESSORS_ENABLED &&
+ CoprocessorHost.DEFAULT_USER_COPROCESSORS_ENABLED);
+ }
+
+ @Test
+ public void testRegionServerCoprocessorHostDefaults() throws Exception {
+ Configuration conf = new Configuration(CONF);
+ RegionServerServices rsServices = mock(RegionServerServices.class);
+ systemCoprocessorLoaded.set(false);
+ new RegionServerCoprocessorHost(rsServices, conf);
+ assertEquals("System coprocessors loading default was not honored",
+ systemCoprocessorLoaded.get(),
+ CoprocessorHost.DEFAULT_COPROCESSORS_ENABLED);
+ }
+
+ @Test
+ public void testMasterCoprocessorHostDefaults() throws Exception {
+ Configuration conf = new Configuration(CONF);
+ MasterServices masterServices = mock(MasterServices.class);
+ systemCoprocessorLoaded.set(false);
+ new MasterCoprocessorHost(masterServices, conf);
+ assertEquals("System coprocessors loading default was not honored",
+ systemCoprocessorLoaded.get(),
+ CoprocessorHost.DEFAULT_COPROCESSORS_ENABLED);
+ }
+
+ @Test
+ public void testRegionCoprocessorHostAllDisabled() throws Exception {
+ Configuration conf = new Configuration(CONF);
+ conf.setBoolean(CoprocessorHost.COPROCESSORS_ENABLED_CONF_KEY, false);
+ HRegion region = mock(HRegion.class);
+ when(region.getRegionInfo()).thenReturn(REGIONINFO);
+ when(region.getTableDesc()).thenReturn(TABLEDESC);
+ RegionServerServices rsServices = mock(RegionServerServices.class);
+ systemCoprocessorLoaded.set(false);
+ tableCoprocessorLoaded.set(false);
+ new RegionCoprocessorHost(region, rsServices, conf);
+ assertFalse("System coprocessors should not have been loaded",
+ systemCoprocessorLoaded.get());
+ assertFalse("Table coprocessors should not have been loaded",
+ tableCoprocessorLoaded.get());
+ }
+
+ @Test
+ public void testRegionCoprocessorHostTableLoadingDisabled() throws Exception {
+ Configuration conf = new Configuration(CONF);
+ conf.setBoolean(CoprocessorHost.COPROCESSORS_ENABLED_CONF_KEY, true); // if defaults change
+ conf.setBoolean(CoprocessorHost.USER_COPROCESSORS_ENABLED_CONF_KEY, false);
+ HRegion region = mock(HRegion.class);
+ when(region.getRegionInfo()).thenReturn(REGIONINFO);
+ when(region.getTableDesc()).thenReturn(TABLEDESC);
+ RegionServerServices rsServices = mock(RegionServerServices.class);
+ systemCoprocessorLoaded.set(false);
+ tableCoprocessorLoaded.set(false);
+ new RegionCoprocessorHost(region, rsServices, conf);
+ assertTrue("System coprocessors should have been loaded",
+ systemCoprocessorLoaded.get());
+ assertFalse("Table coprocessors should not have been loaded",
+ tableCoprocessorLoaded.get());
+ }
+}