HBASE-5084 Clow different HTable instances to share one ExecutorService
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1307661 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
81b15f1907
commit
86f8282bef
|
@ -119,7 +119,8 @@ public class HTable implements HTableInterface {
|
||||||
private boolean closed;
|
private boolean closed;
|
||||||
private int operationTimeout;
|
private int operationTimeout;
|
||||||
private static final int DOPUT_WB_CHECK = 10; // i.e., doPut checks the writebuffer every X Puts.
|
private static final int DOPUT_WB_CHECK = 10; // i.e., doPut checks the writebuffer every X Puts.
|
||||||
private final boolean cleanupOnClose; // close the connection in close()
|
private final boolean cleanupPoolOnClose; // shutdown the pool in close()
|
||||||
|
private final boolean cleanupConnectionOnClose; // close the connection in close()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an object to access a HBase table.
|
* Creates an object to access a HBase table.
|
||||||
|
@ -150,7 +151,7 @@ public class HTable implements HTableInterface {
|
||||||
public HTable(Configuration conf, final byte [] tableName)
|
public HTable(Configuration conf, final byte [] tableName)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
this.tableName = tableName;
|
this.tableName = tableName;
|
||||||
this.cleanupOnClose = true;
|
this.cleanupPoolOnClose = this.cleanupConnectionOnClose = true;
|
||||||
if (conf == null) {
|
if (conf == null) {
|
||||||
this.connection = null;
|
this.connection = null;
|
||||||
return;
|
return;
|
||||||
|
@ -177,6 +178,30 @@ public class HTable implements HTableInterface {
|
||||||
this.finishSetup();
|
this.finishSetup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an object to access a HBase table.
|
||||||
|
* Shares zookeeper connection and other resources with other HTable instances
|
||||||
|
* created with the same <code>conf</code> instance. Uses already-populated
|
||||||
|
* region cache if one is available, populated by any other HTable instances
|
||||||
|
* sharing this <code>conf</code> instance.
|
||||||
|
* Use this constructor when the ExecutorService is externally managed.
|
||||||
|
* @param conf Configuration object to use.
|
||||||
|
* @param tableName Name of the table.
|
||||||
|
* @param pool ExecutorService to be used.
|
||||||
|
* @throws IOException if a remote or network exception occurs
|
||||||
|
*/
|
||||||
|
public HTable(Configuration conf, final byte[] tableName, final ExecutorService pool)
|
||||||
|
throws IOException {
|
||||||
|
this.connection = HConnectionManager.getConnection(conf);
|
||||||
|
this.configuration = conf;
|
||||||
|
this.pool = pool;
|
||||||
|
this.tableName = tableName;
|
||||||
|
this.cleanupPoolOnClose = false;
|
||||||
|
this.cleanupConnectionOnClose = true;
|
||||||
|
|
||||||
|
this.finishSetup();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an object to access a HBase table.
|
* Creates an object to access a HBase table.
|
||||||
* Shares zookeeper connection and other resources with other HTable instances
|
* Shares zookeeper connection and other resources with other HTable instances
|
||||||
|
@ -197,7 +222,7 @@ public class HTable implements HTableInterface {
|
||||||
throw new IllegalArgumentException("Connection is null or closed.");
|
throw new IllegalArgumentException("Connection is null or closed.");
|
||||||
}
|
}
|
||||||
this.tableName = tableName;
|
this.tableName = tableName;
|
||||||
this.cleanupOnClose = false;
|
this.cleanupPoolOnClose = this.cleanupConnectionOnClose = false;
|
||||||
this.connection = connection;
|
this.connection = connection;
|
||||||
this.configuration = connection.getConfiguration();
|
this.configuration = connection.getConfiguration();
|
||||||
this.pool = pool;
|
this.pool = pool;
|
||||||
|
@ -965,8 +990,10 @@ public class HTable implements HTableInterface {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
flushCommits();
|
flushCommits();
|
||||||
if (cleanupOnClose) {
|
if (cleanupPoolOnClose) {
|
||||||
this.pool.shutdown();
|
this.pool.shutdown();
|
||||||
|
}
|
||||||
|
if (cleanupConnectionOnClose) {
|
||||||
if (this.connection != null) {
|
if (this.connection != null) {
|
||||||
this.connection.close();
|
this.connection.close();
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,22 +23,19 @@ import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Set;
|
import java.util.concurrent.SynchronousQueue;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.apache.commons.httpclient.HostConfiguration;
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.hbase.*;
|
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.Bytes;
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
@ -54,6 +51,7 @@ public class TestHCM {
|
||||||
private static final Log LOG = LogFactory.getLog(TestHCM.class);
|
private static final Log LOG = LogFactory.getLog(TestHCM.class);
|
||||||
private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
|
private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
|
||||||
private static final byte[] TABLE_NAME = Bytes.toBytes("test");
|
private static final byte[] TABLE_NAME = Bytes.toBytes("test");
|
||||||
|
private static final byte[] TABLE_NAME1 = Bytes.toBytes("test1");
|
||||||
private static final byte[] FAM_NAM = Bytes.toBytes("f");
|
private static final byte[] FAM_NAM = Bytes.toBytes("f");
|
||||||
private static final byte[] ROW = Bytes.toBytes("bbb");
|
private static final byte[] ROW = Bytes.toBytes("bbb");
|
||||||
|
|
||||||
|
@ -136,10 +134,33 @@ public class TestHCM {
|
||||||
conn.deleteCachedLocation(TABLE_NAME, ROW);
|
conn.deleteCachedLocation(TABLE_NAME, ROW);
|
||||||
HRegionLocation rl = conn.getCachedLocation(TABLE_NAME, ROW);
|
HRegionLocation rl = conn.getCachedLocation(TABLE_NAME, ROW);
|
||||||
assertNull("What is this location?? " + rl, rl);
|
assertNull("What is this location?? " + rl, rl);
|
||||||
conn.close();
|
|
||||||
table.close();
|
table.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that Connection or Pool are not closed when managed externally
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testConnectionManagement() throws Exception{
|
||||||
|
TEST_UTIL.createTable(TABLE_NAME1, FAM_NAM);
|
||||||
|
HConnection conn = HConnectionManager.createConnection(TEST_UTIL.getConfiguration());
|
||||||
|
ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 10,
|
||||||
|
60, TimeUnit.SECONDS,
|
||||||
|
new SynchronousQueue<Runnable>(),
|
||||||
|
new DaemonThreadFactory());
|
||||||
|
|
||||||
|
HTable table = new HTable(TABLE_NAME1, conn, pool);
|
||||||
|
table.close();
|
||||||
|
assertFalse(conn.isClosed());
|
||||||
|
assertFalse(pool.isShutdown());
|
||||||
|
table = new HTable(TEST_UTIL.getConfiguration(), TABLE_NAME1, pool);
|
||||||
|
table.close();
|
||||||
|
assertFalse(pool.isShutdown());
|
||||||
|
conn.close();
|
||||||
|
pool.shutdownNow();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make sure that {@link HConfiguration} instances that are essentially the
|
* Make sure that {@link HConfiguration} instances that are essentially the
|
||||||
* same map to the same {@link HConnection} instance.
|
* same map to the same {@link HConnection} instance.
|
||||||
|
|
Loading…
Reference in New Issue