From 1a3c8cb92e97348b11ed3441380e13ee852523de Mon Sep 17 00:00:00 2001 From: Chris Larsen <clarsen@euphoriaaudio.com> Date: Thu, 21 Sep 2017 12:56:44 -0700 Subject: [PATCH] =?UTF-8?q?[hbase10]=20Address=20#701=20by=20mimicking=20t?= =?UTF-8?q?he=20same=20locks=20from=20the=20HBase=200.9=E2=80=A6=20(#1028)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [hbase10] Fix #701 by mimicking the same locks from the HBase 0.98 client in the HBase 10 client. * Address CR comments, thanks @allanbank. * Addressed the table lock. * Restore the lock on the connection shutdown. --- .../java/com/yahoo/ycsb/db/HBaseClient10.java | 57 ++++++++----------- 1 file changed, 24 insertions(+), 33 deletions(-) diff --git a/hbase10/src/main/java/com/yahoo/ycsb/db/HBaseClient10.java b/hbase10/src/main/java/com/yahoo/ycsb/db/HBaseClient10.java index 96d8cf06..12b13d99 100644 --- a/hbase10/src/main/java/com/yahoo/ycsb/db/HBaseClient10.java +++ b/hbase10/src/main/java/com/yahoo/ycsb/db/HBaseClient10.java @@ -66,10 +66,10 @@ import static com.yahoo.ycsb.workloads.CoreWorkload.TABLENAME_PROPERTY_DEFAULT; * durability. */ public class HBaseClient10 extends com.yahoo.ycsb.DB { + private static final AtomicInteger THREAD_COUNT = new AtomicInteger(0); + private Configuration config = HBaseConfiguration.create(); - - private static AtomicInteger threadCount = new AtomicInteger(0); - + private boolean debug = false; private String tableName = ""; @@ -82,7 +82,6 @@ public class HBaseClient10 extends com.yahoo.ycsb.DB { * @See #CONNECTION_LOCK. */ private static Connection connection = null; - private static final Object CONNECTION_LOCK = new Object(); // Depending on the value of clientSideBuffering, either bufferedMutator // (clientSideBuffering) or currentTable (!clientSideBuffering) will be used. @@ -144,12 +143,19 @@ public class HBaseClient10 extends com.yahoo.ycsb.DB { } } + String table = getProperties().getProperty(TABLENAME_PROPERTY, TABLENAME_PROPERTY_DEFAULT); try { - threadCount.getAndIncrement(); - synchronized (CONNECTION_LOCK) { + THREAD_COUNT.getAndIncrement(); + synchronized (THREAD_COUNT) { if (connection == null) { // Initialize if not set up already. connection = ConnectionFactory.createConnection(config); + + // Terminate right now if table does not exist, since the client + // will not propagate this error upstream once the workload + // starts. + final TableName tName = TableName.valueOf(table); + connection.getTable(tName).getTableDescriptor(); } } } catch (java.io.IOException e) { @@ -172,19 +178,6 @@ public class HBaseClient10 extends com.yahoo.ycsb.DB { throw new DBException("No columnfamily specified"); } columnFamilyBytes = Bytes.toBytes(columnFamily); - - // Terminate right now if table does not exist, since the client - // will not propagate this error upstream once the workload - // starts. - String table = getProperties().getProperty(TABLENAME_PROPERTY, TABLENAME_PROPERTY_DEFAULT); - try { - final TableName tName = TableName.valueOf(table); - synchronized (CONNECTION_LOCK) { - connection.getTable(tName).getTableDescriptor(); - } - } catch (IOException e) { - throw new DBException(e); - } } /** @@ -208,14 +201,14 @@ public class HBaseClient10 extends com.yahoo.ycsb.DB { long en = System.nanoTime(); final String type = clientSideBuffering ? "UPDATE" : "CLEANUP"; measurements.measure(type, (int) ((en - st) / 1000)); - threadCount.decrementAndGet(); - if (threadCount.get() <= 0) { + int threadCount = THREAD_COUNT.decrementAndGet(); + if (threadCount <= 0) { // Means we are done so ok to shut down the Connection. - synchronized (CONNECTION_LOCK) { - if (connection != null) { - connection.close(); - connection = null; - } + synchronized (THREAD_COUNT) { + if (connection != null) { + connection.close(); + connection = null; + } } } } catch (IOException e) { @@ -225,13 +218,11 @@ public class HBaseClient10 extends com.yahoo.ycsb.DB { public void getHTable(String table) throws IOException { final TableName tName = TableName.valueOf(table); - synchronized (CONNECTION_LOCK) { - this.currentTable = connection.getTable(tName); - if (clientSideBuffering) { - final BufferedMutatorParams p = new BufferedMutatorParams(tName); - p.writeBufferSize(writeBufferSize); - this.bufferedMutator = connection.getBufferedMutator(p); - } + this.currentTable = connection.getTable(tName); + if (clientSideBuffering) { + final BufferedMutatorParams p = new BufferedMutatorParams(tName); + p.writeBufferSize(writeBufferSize); + this.bufferedMutator = connection.getBufferedMutator(p); } } -- GitLab