From 1b49081ed29edb7155169be8693b89a99ee985f3 Mon Sep 17 00:00:00 2001 From: Michael Stack Date: Tue, 24 Oct 2017 15:37:32 -0700 Subject: [PATCH] HBASE-19077 Have Region*CoprocessorEnvironment provide an ImmutableOnlineRegions Change name of Interface OnlineRegions to MutableOnlineRegions. Change name of Interface ImmutableOnlineRegions to OnlineRegions. Did this since OnlineRegions is for consumer other than internals. Add a getOnlineRegions to the RegionCoprocessorEnvironment and to RegionServerCoprocessorEnvironment so CPs can 'access' local Regions directly. --- .../RegionCoprocessorEnvironment.java | 6 +++ .../RegionServerCoprocessorEnvironment.java | 6 +++ ...Regions.java => MutableOnlineRegions.java} | 42 +++++------------ .../hbase/regionserver/OnlineRegions.java | 47 ++++++++++++------- .../regionserver/RegionCoprocessorHost.java | 6 +++ .../RegionServerCoprocessorHost.java | 7 +++ .../regionserver/RegionServerServices.java | 2 +- .../handler/OpenRegionHandler.java | 2 +- .../token/TestTokenAuthentication.java | 6 +++ 9 files changed, 77 insertions(+), 47 deletions(-) rename hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/{ImmutableOnlineRegions.java => MutableOnlineRegions.java} (50%) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.java index 8058a9ddb56..05df33d3672 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.java @@ -27,6 +27,7 @@ import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.metrics.MetricRegistry; +import org.apache.hadoop.hbase.regionserver.OnlineRegions; import org.apache.hadoop.hbase.regionserver.Region; import org.apache.yetus.audience.InterfaceAudience; import org.apache.yetus.audience.InterfaceStability; @@ -40,6 +41,11 @@ public interface RegionCoprocessorEnvironment extends CoprocessorEnvironment getSharedData(); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessorEnvironment.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessorEnvironment.java index d0a728e2b67..116d86ddfcf 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessorEnvironment.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/RegionServerCoprocessorEnvironment.java @@ -23,6 +23,7 @@ import org.apache.hadoop.hbase.HBaseInterfaceAudience; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.metrics.MetricRegistry; +import org.apache.hadoop.hbase.regionserver.OnlineRegions; import org.apache.yetus.audience.InterfaceAudience; import org.apache.yetus.audience.InterfaceStability; @@ -35,6 +36,11 @@ public interface RegionServerCoprocessorEnvironment */ ServerName getServerName(); + /** + * @return Interface to Map of regions online on this RegionServer {@link #getServerName()}}. + */ + OnlineRegions getOnlineRegions(); + /** * Be careful RPC'ing from a Coprocessor context. * RPC's will fail, stall, retry, and/or crawl because the remote side is not online, is diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ImmutableOnlineRegions.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MutableOnlineRegions.java similarity index 50% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ImmutableOnlineRegions.java rename to hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MutableOnlineRegions.java index ffd1fa7992c..11c9af9a343 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ImmutableOnlineRegions.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MutableOnlineRegions.java @@ -18,43 +18,27 @@ */ package org.apache.hadoop.hbase.regionserver; -import java.io.IOException; -import java.util.List; - -import org.apache.hadoop.hbase.HBaseInterfaceAudience; -import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.ServerName; import org.apache.yetus.audience.InterfaceAudience; -import org.apache.yetus.audience.InterfaceStability; /** * Interface to Map of online regions. In the Map, the key is the region's * encoded name and the value is an {@link Region} instance. */ -@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC) -@InterfaceStability.Evolving -public interface ImmutableOnlineRegions { +@InterfaceAudience.Private +public interface MutableOnlineRegions extends OnlineRegions { /** - * Return {@link Region} instance. - * Only works if caller is in same context, in same JVM. Region is not - * serializable. - * @param encodedRegionName - * @return Region for the passed encoded encodedRegionName or - * null if named region is not member of the online regions. + * Add to online regions. + * @param r */ - Region getRegion(String encodedRegionName); + void addRegion(final HRegion r); - /** - * Get all online regions of a table in this RS. - * @param tableName - * @return List of Region - * @throws java.io.IOException - */ - List getRegions(TableName tableName) throws IOException; - - /** - * Get all online regions in this RS. - * @return List of online Region - */ - List getRegions(); + /** + * Removes the given Region from the list of onlineRegions. + * @param r Region to remove. + * @param destination Destination, if any, null otherwise. + * @return True if we removed a region from online list. + */ + boolean removeRegion(final HRegion r, ServerName destination); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/OnlineRegions.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/OnlineRegions.java index c9f1c47c42e..25594b79cc1 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/OnlineRegions.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/OnlineRegions.java @@ -18,28 +18,43 @@ */ package org.apache.hadoop.hbase.regionserver; -import org.apache.hadoop.hbase.ServerName; +import java.io.IOException; +import java.util.List; + +import org.apache.hadoop.hbase.HBaseInterfaceAudience; +import org.apache.hadoop.hbase.TableName; import org.apache.yetus.audience.InterfaceAudience; +import org.apache.yetus.audience.InterfaceStability; /** - * Interface to Map of online regions. In the Map, the key is the region's - * encoded name and the value is an {@link Region} instance. + * Provides read-only access to the Regions presently online on the + * current RegionServer */ -@InterfaceAudience.Private -public interface OnlineRegions extends ImmutableOnlineRegions { +@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC) +@InterfaceStability.Evolving +public interface OnlineRegions { /** - * Add to online regions. - * @param r + * Return {@link Region} instance. + * Only works if caller is in same context, in same JVM. Region is not + * serializable. + * @param encodedRegionName + * @return Region for the passed encoded encodedRegionName or + * null if named region is not member of the online regions. */ - void addRegion(final HRegion r); + Region getRegion(String encodedRegionName); - /** - * This method removes Region corresponding to hri from the Map of onlineRegions. - * - * @param r Region to remove. - * @param destination Destination, if any, null otherwise. - * @return True if we removed a region from online list. - */ - boolean removeRegion(final HRegion r, ServerName destination); + /** + * Get all online regions of a table in this RS. + * @param tableName + * @return List of Region + * @throws java.io.IOException + */ + List getRegions(TableName tableName) throws IOException; + + /** + * Get all online regions in this RS. + * @return List of online Region + */ + List getRegions(); } 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 735d7ba6ec1..42d7ac99161 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 @@ -117,6 +117,7 @@ public class RegionCoprocessorHost private final MetricRegistry metricRegistry; private final Connection connection; private final ServerName serverName; + private final OnlineRegions onlineRegions; /** * Constructor @@ -132,6 +133,7 @@ public class RegionCoprocessorHost this.connection = services != null? services.getConnection(): null; this.serverName = services != null? services.getServerName(): null; this.sharedData = sharedData; + this.onlineRegions = services; this.metricRegistry = MetricsCoprocessor.createRegistryForRegionCoprocessor(impl.getClass().getName()); } @@ -142,6 +144,10 @@ public class RegionCoprocessorHost return region; } + public OnlineRegions getOnlineRegions() { + return this.onlineRegions; + } + @Override public Connection getConnection() { return this.connection; 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 33be4796d87..27a3e201eab 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 @@ -206,6 +206,7 @@ public class RegionServerCoprocessorHost extends private final MetricRegistry metricRegistry; private final Connection connection; private final ServerName serverName; + private final OnlineRegions onlineRegions; @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="BC_UNCONFIRMED_CAST", justification="Intentional; FB has trouble detecting isAssignableFrom") @@ -216,12 +217,18 @@ public class RegionServerCoprocessorHost extends for (Service service : impl.getServices()) { services.registerService(service); } + this.onlineRegions = services; this.connection = services.getConnection(); this.serverName = services.getServerName(); this.metricRegistry = MetricsCoprocessor.createRegistryForRSCoprocessor(impl.getClass().getName()); } + @Override + public OnlineRegions getOnlineRegions() { + return this.onlineRegions; + } + @Override public ServerName getServerName() { return this.serverName; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java index af883a38a8c..2334302500c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java @@ -48,7 +48,7 @@ import com.google.protobuf.Service; * the code base. */ @InterfaceAudience.Private -public interface RegionServerServices extends Server, OnlineRegions, FavoredNodesForRegion { +public interface RegionServerServices extends Server, MutableOnlineRegions, FavoredNodesForRegion { /** @return the WAL for a particular region. Pass null for getting the * default (common) WAL */ diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java index e664cd52a9f..e4b3ed2d094 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java @@ -121,7 +121,7 @@ public class OpenRegionHandler extends EventHandler { return; } - // Successful region open, and add it to OnlineRegions + // Successful region open, and add it to MutableOnlineRegions this.rsServices.addRegion(region); openSuccessful = true; diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/token/TestTokenAuthentication.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/token/TestTokenAuthentication.java index 11af0deea42..e849b30fa40 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/token/TestTokenAuthentication.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/token/TestTokenAuthentication.java @@ -59,6 +59,7 @@ import org.apache.hadoop.hbase.ipc.SimpleRpcServer; import org.apache.hadoop.hbase.metrics.MetricRegistry; import org.apache.hadoop.hbase.protobuf.generated.AuthenticationProtos; import org.apache.hadoop.hbase.regionserver.HRegion; +import org.apache.hadoop.hbase.regionserver.OnlineRegions; import org.apache.hadoop.hbase.regionserver.RegionServerServices; import org.apache.hadoop.hbase.security.SecurityInfo; import org.apache.hadoop.hbase.security.User; @@ -272,6 +273,11 @@ public class TestTokenAuthentication { @Override public HRegion getRegion() { return null; } + @Override + public OnlineRegions getOnlineRegions() { + return null; + } + @Override public void startup() throws IOException {}