diff --git a/src/main/java/org/apache/hadoop/hbase/client/HTable.java b/src/main/java/org/apache/hadoop/hbase/client/HTable.java index f7927c0..9bea85f 100644 --- a/src/main/java/org/apache/hadoop/hbase/client/HTable.java +++ b/src/main/java/org/apache/hadoop/hbase/client/HTable.java @@ -56,6 +56,7 @@ import org.apache.hadoop.hbase.ipc.ExecRPCInvoker; import org.apache.hadoop.hbase.util.Addressing; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Pair; +import org.apache.hadoop.hbase.util.Threads; /** *

Used to communicate with a single HBase table. @@ -167,7 +168,7 @@ public class HTable implements HTableInterface { this.pool = new ThreadPoolExecutor(1, maxThreads, keepAliveTime, TimeUnit.SECONDS, new SynchronousQueue(), - new DaemonThreadFactory()); + Threads.newDaemonThreadFactory("hbase-table")); ((ThreadPoolExecutor)this.pool).allowCoreThreadTimeOut(true); this.finishSetup(); @@ -1101,35 +1102,6 @@ public class HTable implements HTableInterface { return this.pool; } - static class DaemonThreadFactory implements ThreadFactory { - static final AtomicInteger poolNumber = new AtomicInteger(1); - final ThreadGroup group; - final AtomicInteger threadNumber = new AtomicInteger(1); - final String namePrefix; - - DaemonThreadFactory() { - SecurityManager s = System.getSecurityManager(); - group = (s != null)? s.getThreadGroup() : - Thread.currentThread().getThreadGroup(); - namePrefix = "hbase-table-pool" + - poolNumber.getAndIncrement() + - "-thread-"; - } - - public Thread newThread(Runnable r) { - Thread t = new Thread(group, r, - namePrefix + threadNumber.getAndIncrement(), - 0); - if (!t.isDaemon()) { - t.setDaemon(true); - } - if (t.getPriority() != Thread.NORM_PRIORITY) { - t.setPriority(Thread.NORM_PRIORITY); - } - return t; - } - } - /** * Enable or disable region cache prefetch for the table. It will be * applied for the given table's all HTable instances who share the same diff --git a/src/main/java/org/apache/hadoop/hbase/util/Threads.java b/src/main/java/org/apache/hadoop/hbase/util/Threads.java index c1c7ea4..2d581f3 100644 --- a/src/main/java/org/apache/hadoop/hbase/util/Threads.java +++ b/src/main/java/org/apache/hadoop/hbase/util/Threads.java @@ -36,6 +36,7 @@ import org.apache.hadoop.util.ReflectionUtils; */ public class Threads { protected static final Log LOG = LogFactory.getLog(Threads.class); + private static final AtomicInteger poolNumber = new AtomicInteger(1); /** * Utility method that sets name, daemon status and starts passed thread. @@ -180,21 +181,50 @@ public class Threads { /** - * Returns a {@link java.util.concurrent.ThreadFactory} that names each - * created thread uniquely, with a common prefix. - * - * @param prefix The prefix of every created Thread's name + * Returns a {@link java.util.concurrent.ThreadFactory} that names each created thread uniquely, + * with a common prefix. + * @param prefix The prefix of every created Thread's name * @return a {@link java.util.concurrent.ThreadFactory} that names threads */ public static ThreadFactory getNamedThreadFactory(final String prefix) { + SecurityManager s = System.getSecurityManager(); + final ThreadGroup threadGroup = (s != null) ? s.getThreadGroup() : Thread.currentThread() + .getThreadGroup(); + return new ThreadFactory() { + final AtomicInteger threadNumber = new AtomicInteger(1); + private final int poolNumber = Threads.poolNumber.getAndIncrement(); + final ThreadGroup group = threadGroup; + + @Override + public Thread newThread(Runnable r) { + final String name = prefix + "pool-" + poolNumber + "-thread-" + + threadNumber.getAndIncrement(); + return new Thread(group, r, name); + } + }; + } - private final AtomicInteger threadNumber = new AtomicInteger(1); - + /** + * Get a named {@link ThreadFactory} that just builds daemon threads + * @param prefix name prefix for all threads created from the factory + * @return a thread factory that creates named, daemon threads + */ + public static ThreadFactory newDaemonThreadFactory(final String prefix) { + final ThreadFactory namedFactory = getNamedThreadFactory(prefix); + return new ThreadFactory() { @Override public Thread newThread(Runnable r) { - return new Thread(r, prefix + threadNumber.getAndIncrement()); + Thread t = namedFactory.newThread(r); + if (!t.isDaemon()) { + t.setDaemon(true); + } + if (t.getPriority() != Thread.NORM_PRIORITY) { + t.setPriority(Thread.NORM_PRIORITY); + } + return t; } + }; } } diff --git a/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java b/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java index 256ddb8..989c29e 100644 --- a/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java +++ b/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java @@ -63,7 +63,6 @@ import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.LargeTests; import org.apache.hadoop.hbase.ServerName; -import org.apache.hadoop.hbase.client.HTable.DaemonThreadFactory; import org.apache.hadoop.hbase.client.metrics.ScanMetrics; import org.apache.hadoop.hbase.coprocessor.CoprocessorHost; import org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint; @@ -86,6 +85,7 @@ import org.apache.hadoop.hbase.regionserver.HRegion; import org.apache.hadoop.hbase.regionserver.HRegionServer; import org.apache.hadoop.hbase.regionserver.Store; import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.util.Threads; import org.apache.hadoop.io.DataInputBuffer; import org.junit.After; import org.junit.AfterClass; @@ -3880,7 +3880,7 @@ public class TestFromClientSide { ExecutorService pool = new ThreadPoolExecutor(1, Integer.MAX_VALUE, 60, TimeUnit.SECONDS, new SynchronousQueue(), - new DaemonThreadFactory()); + Threads.newDaemonThreadFactory("test-from-client-table")); ((ThreadPoolExecutor)pool).allowCoreThreadTimeOut(true); HTable t = new HTable(tableName, conn, pool); HBaseAdmin ha = new HBaseAdmin(conn); diff --git a/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java b/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java index 603a4fb..023eaff 100644 --- a/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java +++ b/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java @@ -35,8 +35,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; -import org.apache.hadoop.hbase.client.HTable.DaemonThreadFactory; import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.util.Threads; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; @@ -148,7 +148,7 @@ public class TestHCM { ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 10, 60, TimeUnit.SECONDS, new SynchronousQueue(), - new DaemonThreadFactory()); + Threads.newDaemonThreadFactory("test-hcm-table")); HTable table = new HTable(TABLE_NAME1, conn, pool); table.close();