diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftServer.java index 7a13ae46e4c..c06b2ecb910 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftServer.java @@ -40,6 +40,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; +import org.apache.hadoop.hbase.filter.ParseFilter; import org.apache.hadoop.hbase.thrift.CallQueue; import org.apache.hadoop.hbase.thrift.CallQueue.Call; import org.apache.hadoop.hbase.thrift.ThriftMetrics; @@ -129,7 +130,7 @@ public class ThriftServer { } /* - * If bindValue is null, we don't bind. + * If bindValue is null, we don't bind. */ private static InetSocketAddress bindToPort(String bindValue, int listenPort) throws UnknownHostException { @@ -193,9 +194,28 @@ public class ThriftServer { return new TThreadPoolServer(serverArgs); } + /** + * Adds the option to pre-load filters at startup. + * + * @param conf The current configuration instance. + */ + protected static void registerFilters(Configuration conf) { + String[] filters = conf.getStrings("hbase.thrift.filters"); + if(filters != null) { + for(String filterClass: filters) { + String[] filterPart = filterClass.split(":"); + if(filterPart.length != 2) { + log.warn("Invalid filter specification " + filterClass + " - skipping"); + } else { + ParseFilter.registerFilter(filterPart[0], filterPart[1]); + } + } + } + } + /** * Start up the Thrift2 server. - * + * * @param args */ public static void main(String[] args) throws Exception { @@ -237,6 +257,7 @@ public class ThriftServer { conf.set("hbase.regionserver.thrift.server.type", implType); conf.setInt("hbase.regionserver.thrift.port", listenPort); + registerFilters(conf); // Construct correct ProtocolFactory boolean compact = cmd.hasOption("compact"); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.java index c77c9b78764..ddb29505d4a 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.java @@ -27,6 +27,7 @@ import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.MediumTests; import org.apache.hadoop.hbase.client.HBaseAdmin; +import org.apache.hadoop.hbase.filter.ParseFilter; import org.apache.hadoop.hbase.test.MetricsAssertHelper; import org.apache.hadoop.hbase.thrift.ThriftMetrics; import org.apache.hadoop.hbase.thrift2.generated.TColumn; @@ -55,6 +56,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Map; import static org.junit.Assert.*; import static java.nio.ByteBuffer.wrap; @@ -625,7 +627,6 @@ public class TestThriftHBaseServiceHandler { int scanId = handler.openScanner(table, scan); List results = null; for (int i = 0; i < 10; i++) { - System.out.println("batch: " + i); // get batch for single row (10x10 is what we expect) results = handler.getScannerRows(scanId, 1); assertEquals(1, results.size()); @@ -636,7 +637,6 @@ public class TestThriftHBaseServiceHandler { for (int y = 0; y < 10; y++) { int colNum = y + (10 * i); String colNumPad = pad(colNum, (byte) 3); - System.out.println("col" + colNumPad + ": " + new String(cols.get(y).getQualifier())); assertArrayEquals(("col" + colNumPad).getBytes(), cols.get(y).getQualifier()); } } @@ -654,6 +654,15 @@ public class TestThriftHBaseServiceHandler { } } + @Test + public void testFilterRegistration() throws Exception { + Configuration conf = UTIL.getConfiguration(); + conf.set("hbase.thrift.filters", "MyFilter:filterclass"); + ThriftServer.registerFilters(conf); + Map registeredFilters = ParseFilter.getAllFilters(); + assertEquals("filterclass", registeredFilters.get("MyFilter")); + } + @Test public void testMetrics() throws Exception { Configuration conf = UTIL.getConfiguration();