You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2012/11/14 22:37:11 UTC
svn commit: r1409431 - in /hbase/branches/0.94/src:
main/java/org/apache/hadoop/hbase/client/
main/java/org/apache/hadoop/hbase/client/coprocessor/
main/java/org/apache/hadoop/hbase/ipc/
main/java/org/apache/hadoop/hbase/master/ test/java/org/apache/ha...
Author: tedyu
Date: Wed Nov 14 21:37:09 2012
New Revision: 1409431
URL: http://svn.apache.org/viewvc?rev=1409431&view=rev
Log:
HBASE-7042 Master Coprocessor Endpoint (Francis)
Added:
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/ipc/MasterExecRPCInvoker.java
Modified:
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/coprocessor/Exec.java
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/coprocessor/ExecResult.java
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java
hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorEndpoint.java
hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/master/TestCatalogJanitor.java
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java?rev=1409431&r1=1409430&r2=1409431&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java Wed Nov 14 21:37:09 2012
@@ -22,6 +22,7 @@ package org.apache.hadoop.hbase.client;
import java.io.Closeable;
import java.io.IOException;
import java.io.InterruptedIOException;
+import java.lang.reflect.Proxy;
import java.net.SocketTimeoutException;
import java.util.Arrays;
import java.util.LinkedList;
@@ -55,8 +56,10 @@ import org.apache.hadoop.hbase.catalog.C
import org.apache.hadoop.hbase.catalog.MetaReader;
import org.apache.hadoop.hbase.client.MetaScanner.MetaScannerVisitor;
import org.apache.hadoop.hbase.client.MetaScanner.MetaScannerVisitorBase;
+import org.apache.hadoop.hbase.ipc.CoprocessorProtocol;
import org.apache.hadoop.hbase.ipc.HMasterInterface;
import org.apache.hadoop.hbase.ipc.HRegionInterface;
+import org.apache.hadoop.hbase.ipc.MasterExecRPCInvoker;
import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest.CompactionState;
import org.apache.hadoop.hbase.regionserver.wal.FailedLogCloseException;
import org.apache.hadoop.hbase.util.Addressing;
@@ -1888,4 +1891,20 @@ public class HBaseAdmin implements Abort
}
return state;
}
+
+ /**
+ * Creates and returns a proxy to the CoprocessorProtocol instance running in the
+ * master.
+ *
+ * @param protocol The class or interface defining the remote protocol
+ * @return A CoprocessorProtocol instance
+ */
+ public <T extends CoprocessorProtocol> T coprocessorProxy(
+ Class<T> protocol) {
+ return (T) Proxy.newProxyInstance(this.getClass().getClassLoader(),
+ new Class[]{protocol},
+ new MasterExecRPCInvoker(conf,
+ connection,
+ protocol));
+ }
}
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/coprocessor/Exec.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/coprocessor/Exec.java?rev=1409431&r1=1409430&r2=1409431&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/coprocessor/Exec.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/coprocessor/Exec.java Wed Nov 14 21:37:09 2012
@@ -21,6 +21,7 @@ package org.apache.hadoop.hbase.client.c
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.client.Row;
import org.apache.hadoop.hbase.io.HbaseObjectWritable;
import org.apache.hadoop.hbase.ipc.CoprocessorProtocol;
@@ -61,6 +62,13 @@ public class Exec extends Invocation imp
}
public Exec(Configuration configuration,
+ Class<? extends CoprocessorProtocol> protocol,
+ Method method, Object[] parameters) {
+ this(configuration, HConstants.EMPTY_BYTE_ARRAY,
+ protocol, method, parameters);
+ }
+
+ public Exec(Configuration configuration,
byte[] row,
Class<? extends CoprocessorProtocol> protocol,
Method method, Object[] parameters) {
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/coprocessor/ExecResult.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/coprocessor/ExecResult.java?rev=1409431&r1=1409430&r2=1409431&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/coprocessor/ExecResult.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/client/coprocessor/ExecResult.java Wed Nov 14 21:37:09 2012
@@ -19,6 +19,7 @@
*/
package org.apache.hadoop.hbase.client.coprocessor;
+import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.io.HbaseObjectWritable;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.Classes;
@@ -53,6 +54,9 @@ public class ExecResult implements Writa
public ExecResult() {
}
+ public ExecResult(Object value) {
+ this(HConstants.EMPTY_BYTE_ARRAY, value);
+ }
public ExecResult(byte[] region, Object value) {
this.regionName = region;
this.value = value;
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java?rev=1409431&r1=1409430&r2=1409431&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java Wed Nov 14 21:37:09 2012
@@ -26,6 +26,8 @@ import org.apache.hadoop.hbase.ClusterSt
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.UnknownRegionException;
+import org.apache.hadoop.hbase.client.coprocessor.Exec;
+import org.apache.hadoop.hbase.client.coprocessor.ExecResult;
import org.apache.hadoop.hbase.security.TokenInfo;
import org.apache.hadoop.hbase.security.KerberosInfo;
import org.apache.hadoop.hbase.util.Pair;
@@ -266,4 +268,22 @@ public interface HMasterInterface extend
* @return array of HTableDescriptor
*/
public HTableDescriptor[] getHTableDescriptors(List<String> tableNames);
+
+ /**
+ * Executes a single {@link org.apache.hadoop.hbase.ipc.CoprocessorProtocol}
+ * method using the registered protocol handlers.
+ * {@link CoprocessorProtocol} implementations must be registered via the
+ * {@link org.apache.hadoop.hbase.master.MasterServices#registerProtocol(Class, CoprocessorProtocol)}
+ * method before they are available.
+ *
+ * @param call an {@code Exec} instance identifying the protocol, method name,
+ * and parameters for the method invocation
+ * @return an {@code ExecResult} instance containing the region name of the
+ * invocation and the return value
+ * @throws IOException if no registered protocol handler is found or an error
+ * occurs during the invocation
+ * @see org.apache.hadoop.hbase.master.MasterServices#registerProtocol(Class, CoprocessorProtocol)
+ */
+ public ExecResult execCoprocessor(Exec call)
+ throws IOException;
}
Added: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/ipc/MasterExecRPCInvoker.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/ipc/MasterExecRPCInvoker.java?rev=1409431&view=auto
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/ipc/MasterExecRPCInvoker.java (added)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/ipc/MasterExecRPCInvoker.java Wed Nov 14 21:37:09 2012
@@ -0,0 +1,65 @@
+/*
+ * 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.ipc;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.client.HConnection;
+import org.apache.hadoop.hbase.client.ServerCallable;
+import org.apache.hadoop.hbase.client.coprocessor.Exec;
+import org.apache.hadoop.hbase.client.coprocessor.ExecResult;
+import org.apache.hadoop.hbase.util.Bytes;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+/**
+ * Backs a {@link org.apache.hadoop.hbase.ipc.CoprocessorProtocol} subclass proxy and forwards method
+ * invocations for server execution. Note that internally this will issue a
+ * separate RPC call for each method invocation.
+ */
+public class MasterExecRPCInvoker implements InvocationHandler {
+ // LOG is NOT in hbase subpackage intentionally so that the default HBase
+ // DEBUG log level does NOT emit RPC-level logging.
+ private static final Log LOG = LogFactory.getLog("org.apache.hadoop.ipc.MasterExecRPCInvoker");
+
+ private Configuration conf;
+ private final HConnection connection;
+ private Class<? extends CoprocessorProtocol> protocol;
+
+ public MasterExecRPCInvoker(Configuration conf,
+ HConnection connection,
+ Class<? extends CoprocessorProtocol> protocol) {
+ this.conf = conf;
+ this.connection = connection;
+ this.protocol = protocol;
+ }
+
+ @Override
+ public Object invoke(Object instance, final Method method, final Object[] args)
+ throws Throwable {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Call: "+method.getName()+", "+(args != null ? args.length : 0));
+ }
+ Exec exec = new Exec(conf, protocol, method, args);
+ ExecResult result = connection.getMaster().execCoprocessor(exec);
+ LOG.debug("Master Result is value="+result.getValue());
+ return result.getValue();
+ }
+}
\ No newline at end of file
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/HMaster.java?rev=1409431&r1=1409430&r2=1409431&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/HMaster.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/HMaster.java Wed Nov 14 21:37:09 2012
@@ -22,13 +22,13 @@ package org.apache.hadoop.hbase.master;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -41,6 +41,9 @@ import java.util.concurrent.atomic.Atomi
import javax.management.ObjectName;
+import com.google.common.collect.ClassToInstanceMap;
+import com.google.common.collect.Maps;
+import com.google.common.collect.MutableClassToInstanceMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
@@ -67,9 +70,12 @@ import org.apache.hadoop.hbase.client.Me
import org.apache.hadoop.hbase.client.MetaScanner.MetaScannerVisitor;
import org.apache.hadoop.hbase.client.MetaScanner.MetaScannerVisitorBase;
import org.apache.hadoop.hbase.client.Result;
+import org.apache.hadoop.hbase.client.coprocessor.Exec;
+import org.apache.hadoop.hbase.client.coprocessor.ExecResult;
import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;
import org.apache.hadoop.hbase.executor.ExecutorService;
import org.apache.hadoop.hbase.executor.ExecutorService.ExecutorType;
+import org.apache.hadoop.hbase.ipc.CoprocessorProtocol;
import org.apache.hadoop.hbase.ipc.HBaseRPC;
import org.apache.hadoop.hbase.ipc.HBaseServer;
import org.apache.hadoop.hbase.ipc.HMasterInterface;
@@ -88,7 +94,6 @@ import org.apache.hadoop.hbase.master.ha
import org.apache.hadoop.hbase.master.handler.TableDeleteFamilyHandler;
import org.apache.hadoop.hbase.master.handler.TableModifyFamilyHandler;
import org.apache.hadoop.hbase.master.metrics.MasterMetrics;
-import org.apache.hadoop.hbase.master.RegionPlan;
import org.apache.hadoop.hbase.monitoring.MemoryBoundedLogMessageBuffer;
import org.apache.hadoop.hbase.monitoring.MonitoredTask;
import org.apache.hadoop.hbase.monitoring.TaskMonitor;
@@ -223,6 +228,13 @@ Server {
*/
private ObjectName mxBean = null;
+ // Registered master protocol handlers
+ private ClassToInstanceMap<CoprocessorProtocol>
+ protocolHandlers = MutableClassToInstanceMap.create();
+
+ private Map<String, Class<? extends CoprocessorProtocol>>
+ protocolHandlerNames = Maps.newHashMap();
+
/**
* Initializes the HMaster. The steps are as follows:
* <p>
@@ -1291,7 +1303,7 @@ Server {
cpHost.preDisableTable(tableName);
}
this.executorService.submit(new DisableTableHandler(this, tableName,
- catalogTracker, assignmentManager, false));
+ catalogTracker, assignmentManager, false));
if (cpHost != null) {
cpHost.postDisableTable(tableName);
@@ -1552,6 +1564,7 @@ Server {
return zooKeeper;
}
+ @Override
public MasterCoprocessorHost getCoprocessorHost() {
return cpHost;
}
@@ -1750,6 +1763,78 @@ Server {
return list.toArray(new HTableDescriptor [] {});
}
+ @Override
+ public <T extends CoprocessorProtocol> boolean registerProtocol(
+ Class<T> protocol, T handler) {
+
+ /* No stacking of protocol handlers is currently allowed. The
+ * first to claim wins!
+ */
+ if (protocolHandlers.containsKey(protocol)) {
+ LOG.error("Protocol "+protocol.getName()+
+ " already registered, rejecting request from "+
+ handler
+ );
+ return false;
+ }
+
+ protocolHandlers.putInstance(protocol, handler);
+ protocolHandlerNames.put(protocol.getName(), protocol);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Registered master protocol handler: protocol="+protocol.getName());
+ }
+ return true;
+ }
+
+ @Override
+ public ExecResult execCoprocessor(Exec call) throws IOException {
+ Class<? extends CoprocessorProtocol> protocol = call.getProtocol();
+ if (protocol == null) {
+ String protocolName = call.getProtocolName();
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Received dynamic protocol exec call with protocolName " + protocolName);
+ }
+ // detect the actual protocol class
+ protocol = protocolHandlerNames.get(protocolName);
+ if (protocol == null) {
+ throw new HBaseRPC.UnknownProtocolException(protocol,
+ "No matching handler for master protocol "+protocolName);
+ }
+ }
+ if (!protocolHandlers.containsKey(protocol)) {
+ throw new HBaseRPC.UnknownProtocolException(protocol,
+ "No matching handler for protocol ");
+ }
+
+ CoprocessorProtocol handler = protocolHandlers.getInstance(protocol);
+ Object value;
+
+ try {
+ Method method = protocol.getMethod(
+ call.getMethodName(), call.getParameterClasses());
+ method.setAccessible(true);
+
+ value = method.invoke(handler, call.getParameters());
+ } catch (InvocationTargetException e) {
+ Throwable target = e.getTargetException();
+ if (target instanceof IOException) {
+ throw (IOException)target;
+ }
+ IOException ioe = new IOException(target.toString());
+ ioe.setStackTrace(target.getStackTrace());
+ throw ioe;
+ } catch (Throwable e) {
+ if (!(e instanceof IOException)) {
+ LOG.error("Unexpected throwable object ", e);
+ }
+ IOException ioe = new IOException(e.toString());
+ ioe.setStackTrace(e.getStackTrace());
+ throw ioe;
+ }
+
+ return new ExecResult(value);
+ }
+
/**
* Get all table descriptors
* @return All descriptors or null if none.
@@ -1837,4 +1922,4 @@ Server {
public HFileCleaner getHFileCleaner() {
return this.hfileCleaner;
}
-}
\ No newline at end of file
+}
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java?rev=1409431&r1=1409430&r2=1409431&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java Wed Nov 14 21:37:09 2012
@@ -25,6 +25,7 @@ import org.apache.commons.logging.LogFac
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.coprocessor.*;
+import org.apache.hadoop.hbase.ipc.CoprocessorProtocol;
import java.io.IOException;
@@ -69,6 +70,12 @@ public class MasterCoprocessorHost
public MasterEnvironment createEnvironment(final Class<?> implClass,
final Coprocessor instance, final int priority, final int seq,
final Configuration conf) {
+ for (Class c : implClass.getInterfaces()) {
+ if (CoprocessorProtocol.class.isAssignableFrom(c)) {
+ masterServices.registerProtocol(c, (CoprocessorProtocol)instance);
+ break;
+ }
+ }
return new MasterEnvironment(implClass, instance, priority, seq, conf,
masterServices);
}
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java?rev=1409431&r1=1409430&r2=1409431&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/master/MasterServices.java Wed Nov 14 21:37:09 2012
@@ -26,6 +26,7 @@ import org.apache.hadoop.hbase.Server;
import org.apache.hadoop.hbase.TableDescriptors;
import org.apache.hadoop.hbase.executor.EventHandler;
import org.apache.hadoop.hbase.executor.ExecutorService;
+import org.apache.hadoop.hbase.ipc.CoprocessorProtocol;
import org.apache.hadoop.hbase.zookeeper.RegionServerTracker;
/**
@@ -78,4 +79,30 @@ public interface MasterServices extends
* @return true if master enables ServerShutdownHandler;
*/
public boolean isServerShutdownHandlerEnabled();
+
+ /**
+ * @return returns the master coprocessor host
+ */
+ public MasterCoprocessorHost getCoprocessorHost();
+
+ /**
+ * Registers a new CoprocessorProtocol subclass and instance to
+ * be available for handling
+ * {@link HMaster#execCoprocessor(org.apache.hadoop.hbase.client.coprocessor.Exec)} calls.
+ *
+ * <p>
+ * Only a single protocol type/handler combination may be registered.
+ *
+ * After the first registration, subsequent calls with the same protocol type
+ * will fail with a return value of {@code false}.
+ * </p>
+ * @param protocol a {@code CoprocessorProtocol} subinterface defining the
+ * protocol methods
+ * @param handler an instance implementing the interface
+ * @param <T> the protocol type
+ * @return {@code true} if the registration was successful, {@code false}
+ * otherwise
+ */
+ public <T extends CoprocessorProtocol> boolean registerProtocol(
+ Class<T> protocol, T handler);
}
Modified: hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorEndpoint.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorEndpoint.java?rev=1409431&r1=1409430&r2=1409431&view=diff
==============================================================================
--- hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorEndpoint.java (original)
+++ hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorEndpoint.java Wed Nov 14 21:37:09 2012
@@ -31,6 +31,7 @@ import org.apache.hadoop.hbase.HBaseTest
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.MediumTests;
import org.apache.hadoop.hbase.MiniHBaseCluster;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Scan;
@@ -76,6 +77,8 @@ public class TestCoprocessorEndpoint {
conf.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,
"org.apache.hadoop.hbase.coprocessor.ColumnAggregationEndpoint",
"org.apache.hadoop.hbase.coprocessor.GenericEndpoint");
+ conf.setStrings(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY,
+ "org.apache.hadoop.hbase.coprocessor.GenericEndpoint");
util.startMiniCluster(2);
cluster = util.getMiniHBaseCluster();
@@ -136,6 +139,34 @@ public class TestCoprocessorEndpoint {
table.close();
}
+ @Test
+ public void testMasterGeneric() throws Throwable {
+ HBaseAdmin admin = new HBaseAdmin(util.getConfiguration());
+ GenericProtocol protocol = admin.coprocessorProxy(GenericProtocol.class);
+ String workResult1 = protocol.doWork("foo");
+ assertEquals("foo", workResult1);
+ byte[] workResult2 = protocol.doWork(new byte[]{1});
+ assertArrayEquals(new byte[]{1}, workResult2);
+ byte workResult3 = protocol.doWork((byte)1);
+ assertEquals((byte)1, workResult3);
+ char workResult4 = protocol.doWork('c');
+ assertEquals('c', workResult4);
+ boolean workResult5 = protocol.doWork(true);
+ assertEquals(true, workResult5);
+ short workResult6 = protocol.doWork((short)1);
+ assertEquals((short)1, workResult6);
+ int workResult7 = protocol.doWork(5);
+ assertEquals(5, workResult7);
+ long workResult8 = protocol.doWork(5l);
+ assertEquals(5l, workResult8);
+ double workResult9 = protocol.doWork(6d);
+ assertEquals(6d, workResult9, 0.01);
+ float workResult10 = protocol.doWork(6f);
+ assertEquals(6f, workResult10, 0.01);
+ Text workResult11 = protocol.doWork(new Text("foo"));
+ assertEquals(new Text("foo"), workResult11);
+ }
+
@Ignore @Test
public void testAggregation() throws Throwable {
HTable table = new HTable(util.getConfiguration(), TEST_TABLE);
Modified: hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/master/TestCatalogJanitor.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/master/TestCatalogJanitor.java?rev=1409431&r1=1409430&r2=1409431&view=diff
==============================================================================
--- hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/master/TestCatalogJanitor.java (original)
+++ hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/master/TestCatalogJanitor.java Wed Nov 14 21:37:09 2012
@@ -58,6 +58,7 @@ import org.apache.hadoop.hbase.client.HC
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.executor.ExecutorService;
import org.apache.hadoop.hbase.io.Reference;
+import org.apache.hadoop.hbase.ipc.CoprocessorProtocol;
import org.apache.hadoop.hbase.master.CatalogJanitor.SplitParentFirstComparator;
import org.apache.hadoop.hbase.ipc.HRegionInterface;
import org.apache.hadoop.hbase.regionserver.Store;
@@ -274,6 +275,16 @@ public class TestCatalogJanitor {
public boolean isServerShutdownHandlerEnabled() {
return true;
}
+
+ @Override
+ public MasterCoprocessorHost getCoprocessorHost() {
+ return null;
+ }
+
+ @Override
+ public <T extends CoprocessorProtocol> boolean registerProtocol(Class<T> protocol, T handler) {
+ return false;
+ }
}
@Test