diff --git a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java index 5133a96..184f4b0 100644 --- a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java +++ b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java @@ -47,10 +47,6 @@ public class MetricsTableAggregateSourceImpl extends BaseSourceImpl super(metricsName, metricsDescription, metricsContext, metricsJmxContext); } - private void register(MetricsTableSource source) { - source.registerMetrics(); - } - @Override public void deleteTableSource(String table) { try { @@ -72,9 +68,9 @@ public class MetricsTableAggregateSourceImpl extends BaseSourceImpl if (source != null) { return source; } - MetricsTableSource newSource = CompatibilitySingletonFactory - .getInstance(MetricsRegionServerSourceFactory.class).createTable(table, wrapper); return tableSources.computeIfAbsent(table, k -> { + MetricsTableSource newSource = CompatibilitySingletonFactory + .getInstance(MetricsRegionServerSourceFactory.class).createTable(table, wrapper); // register the new metrics now newSource.registerMetrics(); return newSource; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index aec94d4..210f305 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -40,9 +40,11 @@ import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import java.util.TreeSet; +import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentSkipListMap; +import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Function; @@ -59,6 +61,7 @@ import org.apache.hadoop.hbase.CacheEvictionStats; import org.apache.hadoop.hbase.ChoreService; import org.apache.hadoop.hbase.ClockOutOfSyncException; import org.apache.hadoop.hbase.CoordinatedStateManager; +import org.apache.hadoop.hbase.DaemonThreadFactory; import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HBaseInterfaceAudience; @@ -285,6 +288,7 @@ public class HRegionServer extends HasThread implements */ protected final Map onlineRegions = new ConcurrentHashMap<>(); + private final java.util.concurrent.ExecutorService executorForMetrics; /** * Map of encoded region names to the DataNode locations they should be hosted on * We store the value as InetSocketAddress since this is used only in HDFS @@ -606,6 +610,9 @@ public class HRegionServer extends HasThread implements this.configurationManager = new ConfigurationManager(); setupWindows(getConfiguration(), getConfigurationManager()); + executorForMetrics = Executors.newSingleThreadExecutor( + new DaemonThreadFactory("metrics registration")); + // Some unit tests don't need a cluster, so no zookeeper at all if (!conf.getBoolean("hbase.testing.nocluster", false)) { // Open connection to zookeeper and set primary watcher @@ -2762,9 +2769,17 @@ public class HRegionServer extends HasThread implements } @Override + @SuppressWarnings("FutureReturnValueIgnored") public void addRegion(HRegion region) { this.onlineRegions.put(region.getRegionInfo().getEncodedName(), region); configurationManager.registerObserver(region); + executorForMetrics.submit(new Callable() { + @Override + public Void call() { + metricsRegionServer.register(region.getRegionInfo().getTable().getNameAsString()); + return null; + } + }); } private void addRegion(SortedMap> sortedRegions, HRegion region, diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java index 21534ce..cd0f435 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java @@ -99,6 +99,14 @@ public class MetricsRegionServer { return regionServerWrapper; } + /** + * Registers MetricsTableSource for table + * @param table the table for which to register MetricsTableSource + */ + public void register(String table) { + metricsTable.register(table); + } + public void updatePutBatch(TableName tn, long t) { if (tableMetrics != null && tn != null) { tableMetrics.updatePut(tn, t); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTable.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTable.java index a3f0dff..2da648a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTable.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTable.java @@ -36,6 +36,15 @@ public class MetricsTable { return wrapper; } + /** + * Registers MetricsTableSource for table through getOrCreateTableSource + * which does the registration. + * @param table the table for which to register MetricsTableSource + */ + void register(String table) { + tableSourceAgg.getOrCreateTableSource(table, wrapper); + } + public MetricsTableAggregateSource getTableSourceAgg() { return tableSourceAgg; }