diff --git a/dev-support/design-docs/Coprocessor_Design_Improvements-Use_composition_instead_of_inheritance-HBASE-17732-2017_09_27.pdf b/dev-support/design-docs/Coprocessor_Design_Improvements-Use_composition_instead_of_inheritance-HBASE-17732-2017_09_27.pdf new file mode 100644 index 00000000000..30a6d542b36 Binary files /dev/null and b/dev-support/design-docs/Coprocessor_Design_Improvements-Use_composition_instead_of_inheritance-HBASE-17732-2017_09_27.pdf differ diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/Coprocessor.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/Coprocessor.java index 38fe74e2b23..c4003ae6d69 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/Coprocessor.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/Coprocessor.java @@ -20,14 +20,42 @@ package org.apache.hadoop.hbase; import java.io.IOException; -import java.util.Optional; +import java.util.Collections; import com.google.protobuf.Service; import org.apache.yetus.audience.InterfaceAudience; import org.apache.yetus.audience.InterfaceStability; /** - * Coprocessor interface. + * Base interface for the 4 coprocessors - MasterCoprocessor, RegionCoprocessor, + * RegionServerCoprocessor, and WALCoprocessor. + * Do NOT implement this interface directly. Unless an implementation implements one (or more) of + * the above mentioned 4 coprocessors, it'll fail to be loaded by any coprocessor host. + * + * Example: + * Building a coprocessor to observer Master operations. + *
+ * class MyMasterCoprocessor implements MasterCoprocessor {
+ *   @Override
+ *   public Optional<MasterObserver> getMasterObserver() {
+ *     return new MyMasterObserver();
+ *   }
+ * }
+ *
+ * class MyMasterObserver implements MasterObserver {
+ *   ....
+ * }
+ * 
+ * + * Building a Service which can be loaded by both Master and RegionServer + *
+ * class MyCoprocessorService implements MasterCoprocessor, RegionServerCoprocessor {
+ *   @Override
+ *   public Optional<Service> getServices() {
+ *     return new ...;
+ *   }
+ * }
+ * 
*/ @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC) @InterfaceStability.Evolving @@ -70,7 +98,7 @@ public interface Coprocessor { /** * Coprocessor endpoints providing protobuf services should implement this interface. */ - default Optional getService() { - return Optional.empty(); + default Iterable getServices() { + return Collections.EMPTY_SET; } } diff --git a/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java b/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java index dcd6f44e939..6e0e6d447a9 100644 --- a/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java +++ b/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/AggregateImplementation.java @@ -29,9 +29,9 @@ import com.google.protobuf.Service; import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.NavigableSet; -import java.util.Optional; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -500,8 +500,8 @@ extends AggregateService implements RegionCoprocessor { } @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } /** diff --git a/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/Export.java b/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/Export.java index 50957525960..667f7a3dfa3 100644 --- a/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/Export.java +++ b/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/coprocessor/Export.java @@ -22,10 +22,10 @@ import java.io.Closeable; import java.io.IOException; import java.security.PrivilegedExceptionAction; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.TreeMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -313,8 +313,8 @@ public class Export extends ExportProtos.ExportService implements RegionCoproces } @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } @Override diff --git a/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/security/access/SecureBulkLoadEndpoint.java b/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/security/access/SecureBulkLoadEndpoint.java index 4286174458b..9477eb1cdba 100644 --- a/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/security/access/SecureBulkLoadEndpoint.java +++ b/hbase-endpoint/src/main/java/org/apache/hadoop/hbase/security/access/SecureBulkLoadEndpoint.java @@ -19,9 +19,9 @@ package org.apache.hadoop.hbase.security.access; import java.io.IOException; +import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Optional; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -175,7 +175,7 @@ public class SecureBulkLoadEndpoint extends SecureBulkLoadService implements Reg } @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } } diff --git a/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpoint.java b/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpoint.java index 54f1f5396b7..cfcb565cc3f 100644 --- a/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpoint.java +++ b/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpoint.java @@ -20,8 +20,8 @@ package org.apache.hadoop.hbase.coprocessor; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.Optional; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -40,7 +40,6 @@ import com.google.protobuf.RpcCallback; import com.google.protobuf.RpcController; import com.google.protobuf.Service; - /** * The aggregation implementation at a region. */ @@ -50,8 +49,8 @@ implements RegionCoprocessor { private RegionCoprocessorEnvironment env = null; @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } @Override diff --git a/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpointNullResponse.java b/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpointNullResponse.java index 43a0075b6ce..80316d3984a 100644 --- a/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpointNullResponse.java +++ b/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpointNullResponse.java @@ -19,8 +19,8 @@ package org.apache.hadoop.hbase.coprocessor; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.Optional; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -51,8 +51,8 @@ public class ColumnAggregationEndpointNullResponse private static final Log LOG = LogFactory.getLog(ColumnAggregationEndpointNullResponse.class); private RegionCoprocessorEnvironment env = null; @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } @Override diff --git a/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpointWithErrors.java b/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpointWithErrors.java index 0faa717e4dd..49b79ce51f6 100644 --- a/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpointWithErrors.java +++ b/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ColumnAggregationEndpointWithErrors.java @@ -19,8 +19,8 @@ package org.apache.hadoop.hbase.coprocessor; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.Optional; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -54,8 +54,8 @@ public class ColumnAggregationEndpointWithErrors private RegionCoprocessorEnvironment env = null; @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } @Override diff --git a/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ProtobufCoprocessorService.java b/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ProtobufCoprocessorService.java index bc8d3e9c4d3..c69baeeef18 100644 --- a/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ProtobufCoprocessorService.java +++ b/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/ProtobufCoprocessorService.java @@ -33,7 +33,7 @@ import org.apache.hadoop.hbase.ipc.protobuf.generated.TestRpcServiceProtos; import org.apache.hadoop.hbase.util.Threads; import java.io.IOException; -import java.util.Optional; +import java.util.Collections; /** * Test implementation of a coprocessor endpoint exposing the @@ -45,8 +45,8 @@ public class ProtobufCoprocessorService extends TestRpcServiceProtos.TestProtobu public ProtobufCoprocessorService() {} @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } @Override diff --git a/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/TestAsyncCoprocessorEndpoint.java b/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/TestAsyncCoprocessorEndpoint.java index 84c777ced6d..2e474bc9fc5 100644 --- a/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/TestAsyncCoprocessorEndpoint.java +++ b/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/TestAsyncCoprocessorEndpoint.java @@ -23,7 +23,7 @@ import static org.junit.Assert.fail; import java.io.FileNotFoundException; import java.io.IOException; -import java.util.Optional; +import java.util.Collections; import org.apache.hadoop.hbase.CoprocessorEnvironment; import org.apache.hadoop.hbase.HConstants; @@ -131,8 +131,8 @@ public class TestAsyncCoprocessorEndpoint extends TestAsyncAdminBase { public DummyRegionServerEndpoint() {} @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } @Override diff --git a/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorEndpoint.java b/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorEndpoint.java index 2e22a162df8..d6421080c1b 100644 --- a/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorEndpoint.java +++ b/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorEndpoint.java @@ -21,11 +21,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Optional; +import java.util.Collections; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.hbase.CoprocessorEnvironment; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.coprocessor.protobuf.generated.DummyRegionServerEndpointProtos; @@ -106,8 +104,8 @@ public class TestRegionServerCoprocessorEndpoint { implements RegionServerCoprocessor { @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } @Override diff --git a/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/regionserver/TestServerCustomProtocol.java b/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/regionserver/TestServerCustomProtocol.java index 90cf10c96ea..bad01f3eae7 100644 --- a/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/regionserver/TestServerCustomProtocol.java +++ b/hbase-endpoint/src/test/java/org/apache/hadoop/hbase/regionserver/TestServerCustomProtocol.java @@ -23,8 +23,8 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.IOException; +import java.util.Collections; import java.util.Map; -import java.util.Optional; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -124,8 +124,8 @@ public class TestServerCustomProtocol { } @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } } diff --git a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/BulkDeleteEndpoint.java b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/BulkDeleteEndpoint.java index 5001e043159..cb5373da1b1 100644 --- a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/BulkDeleteEndpoint.java +++ b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/BulkDeleteEndpoint.java @@ -19,9 +19,9 @@ package org.apache.hadoop.hbase.coprocessor.example; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.Optional; import java.util.Set; import java.util.TreeSet; @@ -102,8 +102,8 @@ public class BulkDeleteEndpoint extends BulkDeleteService implements RegionCopro private RegionCoprocessorEnvironment env; @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } @Override diff --git a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/RefreshHFilesEndpoint.java b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/RefreshHFilesEndpoint.java index 4709d55e707..71d40d43ecd 100644 --- a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/RefreshHFilesEndpoint.java +++ b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/RefreshHFilesEndpoint.java @@ -32,7 +32,7 @@ import org.apache.hadoop.hbase.protobuf.generated.RefreshHFilesProtos; import org.apache.hadoop.hbase.regionserver.Store; import java.io.IOException; -import java.util.Optional; +import java.util.Collections; /** * Coprocessor endpoint to refresh HFiles on replica. @@ -51,8 +51,8 @@ public class RefreshHFilesEndpoint extends RefreshHFilesProtos.RefreshHFilesServ } @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } @Override diff --git a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/RowCountEndpoint.java b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/RowCountEndpoint.java index 7e7532400f6..ff7b43dcef7 100644 --- a/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/RowCountEndpoint.java +++ b/hbase-examples/src/main/java/org/apache/hadoop/hbase/coprocessor/example/RowCountEndpoint.java @@ -20,8 +20,8 @@ package org.apache.hadoop.hbase.coprocessor.example; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.Optional; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; @@ -58,8 +58,8 @@ public class RowCountEndpoint extends ExampleProtos.RowCountService implements R * Just returns a reference to this object, which implements the RowCounterService interface. */ @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } /** diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java index 49e5ed7f11d..55062930cda 100644 --- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java +++ b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupAdminEndpoint.java @@ -19,6 +19,7 @@ package org.apache.hadoop.hbase.rsgroup; import java.io.IOException; +import java.util.Collections; import java.util.HashSet; import java.util.Optional; import java.util.Set; @@ -96,8 +97,8 @@ public class RSGroupAdminEndpoint implements MasterCoprocessor, MasterObserver { } @Override - public Optional getService() { - return Optional.of(groupAdminService); + public Iterable getServices() { + return Collections.singleton(groupAdminService); } @Override diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseRowProcessorEndpoint.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseRowProcessorEndpoint.java index df3ed233452..f460ac93256 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseRowProcessorEndpoint.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseRowProcessorEndpoint.java @@ -20,7 +20,7 @@ package org.apache.hadoop.hbase.coprocessor; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.Optional; +import java.util.Collections; import org.apache.yetus.audience.InterfaceAudience; import org.apache.yetus.audience.InterfaceStability; @@ -83,8 +83,8 @@ extends RowProcessorService implements RegionCoprocessor { } @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } /** diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorServiceBackwardCompatiblity.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorServiceBackwardCompatiblity.java index c677d638487..23c63a22496 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorServiceBackwardCompatiblity.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/CoprocessorServiceBackwardCompatiblity.java @@ -22,7 +22,7 @@ package org.apache.hadoop.hbase.coprocessor; import com.google.protobuf.Service; import org.apache.yetus.audience.InterfaceAudience; -import java.util.Optional; +import java.util.Collections; /** * Classes to help maintain backward compatibility with now deprecated {@link CoprocessorService} @@ -50,8 +50,8 @@ public class CoprocessorServiceBackwardCompatiblity { } @Override - public Optional getService() { - return Optional.of(service.getService()); + public Iterable getServices() { + return Collections.singleton(service.getService()); } } @@ -64,8 +64,8 @@ public class CoprocessorServiceBackwardCompatiblity { } @Override - public Optional getService() { - return Optional.of(service.getService()); + public Iterable getServices() { + return Collections.singleton(service.getService()); } } @@ -78,8 +78,8 @@ public class CoprocessorServiceBackwardCompatiblity { } @Override - public Optional getService() { - return Optional.of(service.getService()); + public Iterable getServices() { + return Collections.singleton(service.getService()); } } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MultiRowMutationEndpoint.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MultiRowMutationEndpoint.java index fbb410184c7..5d44cd6cd1c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MultiRowMutationEndpoint.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MultiRowMutationEndpoint.java @@ -19,8 +19,8 @@ package org.apache.hadoop.hbase.coprocessor; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.Optional; import java.util.SortedSet; import java.util.TreeSet; @@ -120,8 +120,8 @@ public class MultiRowMutationEndpoint extends MultiRowMutationService implements } @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } /** diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/WALCoprocessor.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/WALCoprocessor.java index d87c06d6ced..1deddf9407b 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/WALCoprocessor.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/WALCoprocessor.java @@ -26,7 +26,7 @@ import org.apache.yetus.audience.InterfaceStability; import java.util.Optional; /** - * WALCoprocessor don't support loading services using {@link #getService()}. + * WALCoprocessor don't support loading services using {@link #getServices()}. */ @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC) @InterfaceStability.Evolving 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 56cf496297a..5431ecee6ce 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 @@ -23,6 +23,7 @@ import java.io.IOException; import java.util.List; import java.util.Set; +import com.google.protobuf.Service; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; @@ -126,7 +127,10 @@ public class MasterCoprocessorHost @Override public MasterEnvironment createEnvironment(final MasterCoprocessor instance, final int priority, final int seq, final Configuration conf) { - instance.getService().ifPresent(masterServices::registerService); + // If coprocessor exposes any services, register them. + for (Service service : instance.getServices()) { + masterServices.registerService(service); + } return new MasterEnvironment(instance, priority, seq, conf, masterServices); } 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 84e9aa53671..1d9abca3dbd 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 @@ -393,9 +393,10 @@ public class RegionCoprocessorHost @Override public RegionEnvironment createEnvironment(RegionCoprocessor instance, int priority, int seq, Configuration conf) { - // Due to current dynamic protocol design, Endpoint uses a different way to be registered and - // executed. It uses a visitor pattern to invoke registered Endpoint method. - instance.getService().ifPresent(region::registerService); + // If coprocessor exposes any services, register them. + for (Service service : instance.getServices()) { + region.registerService(service); + } ConcurrentMap classData; // make sure only one thread can add maps synchronized (SHARED_DATA_MAP) { 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 3325ba30990..b083b3fe376 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 @@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.regionserver; import java.io.IOException; +import com.google.protobuf.Service; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; @@ -206,7 +207,10 @@ public class RegionServerCoprocessorHost extends final int seq, final Configuration conf, final RegionServerServices services) { super(impl, priority, seq, conf); this.regionServerServices = services; - impl.getService().ifPresent(regionServerServices::registerService); + // If coprocessor exposes any services, register them. + for (Service service : impl.getServices()) { + regionServerServices.registerService(service); + } this.metricRegistry = MetricsCoprocessor.createRegistryForRSCoprocessor(impl.getClass().getName()); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java index d66b754c53b..c8a089b43a7 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java @@ -23,6 +23,7 @@ import java.net.InetAddress; import java.security.PrivilegedExceptionAction; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -126,8 +127,6 @@ import org.apache.hadoop.hbase.shaded.com.google.common.collect.Lists; import org.apache.hadoop.hbase.shaded.com.google.common.collect.MapMaker; import org.apache.hadoop.hbase.shaded.com.google.common.collect.Maps; import org.apache.hadoop.hbase.shaded.com.google.common.collect.Sets; -import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.CleanupBulkLoadRequest; -import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.PrepareBulkLoadRequest; import org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils; import org.apache.hadoop.hbase.util.ByteRange; import org.apache.hadoop.hbase.util.Bytes; @@ -1019,8 +1018,9 @@ public class AccessController implements MasterCoprocessor, RegionCoprocessor, } @Override - public Optional getService() { - return Optional.of(AccessControlProtos.AccessControlService.newReflectiveService(this)); + public Iterable getServices() { + return Collections.singleton( + AccessControlProtos.AccessControlService.newReflectiveService(this)); } /*********************************** Observer implementations ***********************************/ diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/token/TokenProvider.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/token/TokenProvider.java index 4b1f28ea91d..e1b0f84a708 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/token/TokenProvider.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/token/TokenProvider.java @@ -19,7 +19,7 @@ package org.apache.hadoop.hbase.security.token; import java.io.IOException; -import java.util.Optional; +import java.util.Collections; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -96,8 +96,9 @@ public class TokenProvider implements AuthenticationProtos.AuthenticationService // AuthenticationService implementation @Override - public Optional getService() { - return Optional.of(AuthenticationProtos.AuthenticationService.newReflectiveService(this)); + public Iterable getServices() { + return Collections.singleton( + AuthenticationProtos.AuthenticationService.newReflectiveService(this)); } @Override diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/visibility/VisibilityController.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/visibility/VisibilityController.java index 671e98998c8..57b79a4c9ee 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/visibility/VisibilityController.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/visibility/VisibilityController.java @@ -26,6 +26,7 @@ import static org.apache.hadoop.hbase.security.visibility.VisibilityConstants.LA import java.io.IOException; import java.net.InetAddress; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -200,8 +201,9 @@ public class VisibilityController implements MasterCoprocessor, RegionCoprocesso } @Override - public Optional getService() { - return Optional.of(VisibilityLabelsProtos.VisibilityLabelsService.newReflectiveService(this)); + public Iterable getServices() { + return Collections.singleton( + VisibilityLabelsProtos.VisibilityLabelsService.newReflectiveService(this)); } /********************************* Master related hooks **********************************/ diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java index 05776ff5eb5..81c11fd4891 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java @@ -35,8 +35,8 @@ import java.io.IOException; import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; -import java.util.Optional; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -2564,8 +2564,8 @@ public class TestAccessController extends SecureTestUtil { public void stop(CoprocessorEnvironment env) throws IOException { } @Override - public Optional getService() { - return Optional.of(this); + public Iterable getServices() { + return Collections.singleton(this); } @Override