From 33bdf09f7762b6239db9d228339b278fc63caa92 Mon Sep 17 00:00:00 2001 From: Duo Zhang Date: Thu, 14 Feb 2019 11:41:05 +0800 Subject: [PATCH] HBASE-21888 Add a isClosed method to AsyncConnection Signed-off-by: Guanghao Zhang --- .../apache/hadoop/hbase/client/AsyncConnection.java | 7 ++++++- .../hadoop/hbase/client/AsyncConnectionImpl.java | 13 +++++++++++++ .../apache/hadoop/hbase/client/TestAsyncTable.java | 2 ++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnection.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnection.java index 564d4db3d59..75971ad610c 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnection.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnection.java @@ -21,7 +21,6 @@ import java.io.Closeable; import java.io.IOException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; - import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseInterfaceAudience; import org.apache.hadoop.hbase.ServerName; @@ -196,6 +195,12 @@ public interface AsyncConnection extends Closeable { */ AsyncBufferedMutatorBuilder getBufferedMutatorBuilder(TableName tableName, ExecutorService pool); + /** + * Returns whether the connection is closed or not. + * @return true if this connection is closed + */ + boolean isClosed(); + /** * Retrieve an Hbck implementation to fix an HBase cluster. The returned Hbck is not guaranteed to * be thread-safe. A new instance should be created by each thread. This is a lightweight diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java index 07f62a8c9ee..e47d4ccf1e6 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncConnectionImpl.java @@ -105,6 +105,8 @@ class AsyncConnectionImpl implements AsyncConnection { private ChoreService authService; + private volatile boolean closed = false; + public AsyncConnectionImpl(Configuration conf, AsyncRegistry registry, String clusterId, User user) { this.conf = conf; @@ -140,11 +142,22 @@ class AsyncConnectionImpl implements AsyncConnection { @Override public void close() { + // As the code below is safe to be executed in parallel, here we do not use CAS or lock, just a + // simple volatile flag. + if (closed) { + return; + } IOUtils.closeQuietly(rpcClient); IOUtils.closeQuietly(registry); if (authService != null) { authService.shutdown(); } + closed = true; + } + + @Override + public boolean isClosed() { + return closed; } @Override diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTable.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTable.java index 85a6d9d07b2..89ebf8d5749 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTable.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncTable.java @@ -111,11 +111,13 @@ public class TestAsyncTable { TEST_UTIL.createTable(TABLE_NAME, FAMILY); TEST_UTIL.waitTableAvailable(TABLE_NAME); ASYNC_CONN = ConnectionFactory.createAsyncConnection(TEST_UTIL.getConfiguration()).get(); + assertFalse(ASYNC_CONN.isClosed()); } @AfterClass public static void tearDownAfterClass() throws Exception { IOUtils.closeQuietly(ASYNC_CONN); + assertTrue(ASYNC_CONN.isClosed()); TEST_UTIL.shutdownMiniCluster(); }