Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
public class HBaseCommonTestingUtility {
protected static final Log LOG = LogFactory.getLog(HBaseCommonTestingUtility.class);

protected Configuration conf;
protected final Configuration conf;

public HBaseCommonTestingUtility() {
this(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import java.util.Set;
import java.util.TreeSet;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.TimeUnit;

import org.apache.commons.io.FileUtils;
Expand Down Expand Up @@ -190,10 +191,7 @@ public class HBaseTestingUtility extends HBaseCommonTestingUtility {
* HBaseTestingUtility*/
private Path dataTestDirOnTestFS = null;

/**
* Shared cluster connection.
*/
private volatile Connection connection;
private final AtomicReference<Connection> connection = new AtomicReference<>();

/**
* System property key to get test directory value.
Expand Down Expand Up @@ -1170,10 +1168,6 @@ public MiniHBaseCluster getMiniHBaseCluster() {
*/
public void shutdownMiniCluster() throws Exception {
LOG.info("Shutting down minicluster");
if (this.connection != null && !this.connection.isClosed()) {
this.connection.close();
this.connection = null;
}
shutdownMiniHBaseCluster();
if (!this.passedZkCluster){
shutdownMiniZKCluster();
Expand Down Expand Up @@ -1203,10 +1197,7 @@ public boolean cleanupTestDir() {
* @throws IOException
*/
public void shutdownMiniHBaseCluster() throws IOException {
if (hbaseAdmin != null) {
hbaseAdmin.close0();
hbaseAdmin = null;
}
closeConnection();

// unset the configuration for MIN and MAX RS to start
conf.setInt(ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, -1);
Expand Down Expand Up @@ -3020,16 +3011,26 @@ public HBaseCluster getHBaseClusterInterface() {
}

/**
* Get a Connection to the cluster.
* Not thread-safe (This class needs a lot of work to make it thread-safe).
* Get a shared Connection to the cluster.
* this method is threadsafe.
* @return A Connection that can be shared. Don't close. Will be closed on shutdown of cluster.
* @throws IOException
*/
public Connection getConnection() throws IOException {
if (this.connection == null) {
this.connection = ConnectionFactory.createConnection(this.conf);
Connection connection = this.connection.get();
while (connection == null) {
connection = ConnectionFactory.createConnection(this.conf);
if (! this.connection.compareAndSet(null, connection)) {
try {
connection.close();
} catch (IOException exception) {
LOG.debug("Ignored failure while closing connection on contended connection creation.",
exception);
}
connection = this.connection.get();
Copy link
Contributor

@virajjasani virajjasani Aug 3, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This logic is perfect, but for a while I got confused with connection being Connection and this.connection being AtomicReference.
Can we rename connection to connectionRef to indicate AtomicReference?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sure! should I update master and branches-2 to similarly use asyncConnectionRef instead of asyncConnection? Or less confusing there because the instance and local names are already different?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think branch-2+ seem good because names are different already 👍

}
}
return this.connection;
return connection;
}

/**
Expand Down Expand Up @@ -3067,6 +3068,25 @@ private synchronized void close0() throws IOException {
}
}

public void closeConnection() throws IOException {
if (hbaseAdmin != null) {
try {
hbaseAdmin.close0();
} catch (IOException exception) {
LOG.debug("Ignored failure while closing admin.", exception);
}
hbaseAdmin = null;
}
Connection connection = this.connection.getAndSet(null);
if (connection != null) {
try {
connection.close();
} catch (IOException exception) {
LOG.debug("Ignored failure while closing connection.", exception);
}
}
}

/**
* Returns a ZooKeeperWatcher instance.
* This instance is shared between HBaseTestingUtility instance users.
Expand Down Expand Up @@ -3240,7 +3260,7 @@ public String explainTableAvailability(TableName tableName) throws IOException {
.getRegionAssignments();
final List<Pair<HRegionInfo, ServerName>> metaLocations =
MetaTableAccessor
.getTableRegionsAndLocations(getZooKeeperWatcher(), connection, tableName);
.getTableRegionsAndLocations(getZooKeeperWatcher(), getConnection(), tableName);
for (Pair<HRegionInfo, ServerName> metaLocation : metaLocations) {
HRegionInfo hri = metaLocation.getFirst();
ServerName sn = metaLocation.getSecond();
Expand Down