HBASE-7578 TestCatalogTracker hangs occasionally
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1434436 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
7b17ed9e91
commit
ec117ea67d
|
@ -122,11 +122,6 @@ public class CatalogTracker {
|
||||||
*/
|
*/
|
||||||
private ServerName metaLocation;
|
private ServerName metaLocation;
|
||||||
|
|
||||||
/*
|
|
||||||
* Timeout waiting on root or meta to be set.
|
|
||||||
*/
|
|
||||||
private final int defaultTimeout;
|
|
||||||
|
|
||||||
private boolean stopped = false;
|
private boolean stopped = false;
|
||||||
|
|
||||||
static final byte [] ROOT_REGION_NAME =
|
static final byte [] ROOT_REGION_NAME =
|
||||||
|
@ -162,33 +157,13 @@ public class CatalogTracker {
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public CatalogTracker(final ZooKeeperWatcher zk, final Configuration conf,
|
public CatalogTracker(final ZooKeeperWatcher zk, final Configuration conf,
|
||||||
final Abortable abortable)
|
Abortable abortable)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
this(zk, conf, abortable,
|
this(zk, conf, HConnectionManager.getConnection(conf), abortable);
|
||||||
conf.getInt("hbase.catalogtracker.default.timeout", 1000));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs the catalog tracker. Find current state of catalog tables.
|
|
||||||
* Begin active tracking by executing {@link #start()} post construction.
|
|
||||||
* @param zk If zk is null, we'll create an instance (and shut it down
|
|
||||||
* when {@link #stop()} is called) else we'll use what is passed.
|
|
||||||
* @param conf
|
|
||||||
* @param abortable If fatal exception we'll call abort on this. May be null.
|
|
||||||
* If it is we'll use the Connection associated with the passed
|
|
||||||
* {@link Configuration} as our Abortable.
|
|
||||||
* @param defaultTimeout Timeout to use. Pass zero for no timeout
|
|
||||||
* ({@link Object#wait(long)} when passed a <code>0</code> waits for ever).
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
public CatalogTracker(final ZooKeeperWatcher zk, final Configuration conf,
|
|
||||||
Abortable abortable, final int defaultTimeout)
|
|
||||||
throws IOException {
|
|
||||||
this(zk, conf, HConnectionManager.getConnection(conf), abortable, defaultTimeout);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public CatalogTracker(final ZooKeeperWatcher zk, final Configuration conf,
|
public CatalogTracker(final ZooKeeperWatcher zk, final Configuration conf,
|
||||||
HConnection connection, Abortable abortable, final int defaultTimeout)
|
HConnection connection, Abortable abortable)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
this.connection = connection;
|
this.connection = connection;
|
||||||
if (abortable == null) {
|
if (abortable == null) {
|
||||||
|
@ -226,7 +201,6 @@ public class CatalogTracker {
|
||||||
ct.resetMetaLocation();
|
ct.resetMetaLocation();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
this.defaultTimeout = defaultTimeout;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -363,24 +337,6 @@ public class CatalogTracker {
|
||||||
return getCachedConnection(waitForRoot(timeout));
|
return getCachedConnection(waitForRoot(timeout));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a connection to the server hosting root, as reported by ZooKeeper,
|
|
||||||
* waiting for the default timeout specified on instantiation.
|
|
||||||
* @see #waitForRoot(long) for additional information
|
|
||||||
* @return connection to server hosting root
|
|
||||||
* @throws NotAllMetaRegionsOnlineException if timed out waiting
|
|
||||||
* @throws IOException
|
|
||||||
* @deprecated Use #getRootServerConnection(long)
|
|
||||||
*/
|
|
||||||
public AdminProtocol waitForRootServerConnectionDefault()
|
|
||||||
throws NotAllMetaRegionsOnlineException, IOException {
|
|
||||||
try {
|
|
||||||
return getRootServerConnection(this.defaultTimeout);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
throw new NotAllMetaRegionsOnlineException("Interrupted");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a connection to the server currently hosting <code>.META.</code> or
|
* Gets a connection to the server currently hosting <code>.META.</code> or
|
||||||
* null if location is not currently available.
|
* null if location is not currently available.
|
||||||
|
@ -470,10 +426,10 @@ public class CatalogTracker {
|
||||||
*/
|
*/
|
||||||
public ServerName waitForMeta(long timeout)
|
public ServerName waitForMeta(long timeout)
|
||||||
throws InterruptedException, IOException, NotAllMetaRegionsOnlineException {
|
throws InterruptedException, IOException, NotAllMetaRegionsOnlineException {
|
||||||
long stop = System.currentTimeMillis() + timeout;
|
long stop = timeout == 0 ? Long.MAX_VALUE : System.currentTimeMillis() + timeout;
|
||||||
long waitTime = Math.min(50, timeout);
|
long waitTime = Math.min(50, timeout);
|
||||||
synchronized (metaAvailable) {
|
synchronized (metaAvailable) {
|
||||||
while(!stopped && (timeout == 0 || System.currentTimeMillis() < stop)) {
|
while(!stopped && System.currentTimeMillis() < stop) {
|
||||||
if (getMetaServerConnection() != null) {
|
if (getMetaServerConnection() != null) {
|
||||||
return metaLocation;
|
return metaLocation;
|
||||||
}
|
}
|
||||||
|
@ -502,25 +458,6 @@ public class CatalogTracker {
|
||||||
return getCachedConnection(waitForMeta(timeout));
|
return getCachedConnection(waitForMeta(timeout));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a connection to the server hosting meta, as reported by ZooKeeper,
|
|
||||||
* waiting up to the specified timeout for availability.
|
|
||||||
* Used in tests.
|
|
||||||
* @see #waitForMeta(long) for additional information
|
|
||||||
* @return connection to server hosting meta
|
|
||||||
* @throws NotAllMetaRegionsOnlineException if timed out or interrupted
|
|
||||||
* @throws IOException
|
|
||||||
* @deprecated Does not retry; use an HTable instance instead.
|
|
||||||
*/
|
|
||||||
public AdminProtocol waitForMetaServerConnectionDefault()
|
|
||||||
throws NotAllMetaRegionsOnlineException, IOException {
|
|
||||||
try {
|
|
||||||
return getCachedConnection(waitForMeta(defaultTimeout));
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
throw new NotAllMetaRegionsOnlineException("Interrupted");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when we figure current meta is off (called from zk callback).
|
* Called when we figure current meta is off (called from zk callback).
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -541,8 +541,7 @@ Server {
|
||||||
*/
|
*/
|
||||||
private void initializeZKBasedSystemTrackers() throws IOException,
|
private void initializeZKBasedSystemTrackers() throws IOException,
|
||||||
InterruptedException, KeeperException {
|
InterruptedException, KeeperException {
|
||||||
this.catalogTracker = createCatalogTracker(this.zooKeeper, this.conf,
|
this.catalogTracker = createCatalogTracker(this.zooKeeper, this.conf, this);
|
||||||
this, conf.getInt("hbase.master.catalog.timeout", 600000));
|
|
||||||
this.catalogTracker.start();
|
this.catalogTracker.start();
|
||||||
|
|
||||||
this.balancer = LoadBalancerFactory.getLoadBalancer(conf);
|
this.balancer = LoadBalancerFactory.getLoadBalancer(conf);
|
||||||
|
@ -585,9 +584,9 @@ Server {
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
CatalogTracker createCatalogTracker(final ZooKeeperWatcher zk,
|
CatalogTracker createCatalogTracker(final ZooKeeperWatcher zk,
|
||||||
final Configuration conf, Abortable abortable, final int defaultTimeout)
|
final Configuration conf, Abortable abortable)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
return new CatalogTracker(zk, conf, abortable, defaultTimeout);
|
return new CatalogTracker(zk, conf, abortable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if we should stop every 100ms
|
// Check if we should stop every 100ms
|
||||||
|
|
|
@ -769,8 +769,7 @@ public class HRegionServer implements ClientProtocol,
|
||||||
blockAndCheckIfStopped(this.clusterStatusTracker);
|
blockAndCheckIfStopped(this.clusterStatusTracker);
|
||||||
|
|
||||||
// Create the catalog tracker and start it;
|
// Create the catalog tracker and start it;
|
||||||
this.catalogTracker = new CatalogTracker(this.zooKeeper, this.conf,
|
this.catalogTracker = new CatalogTracker(this.zooKeeper, this.conf, this);
|
||||||
this, this.conf.getInt("hbase.regionserver.catalog.timeout", 600000));
|
|
||||||
catalogTracker.start();
|
catalogTracker.start();
|
||||||
|
|
||||||
// Retrieve clusterId
|
// Retrieve clusterId
|
||||||
|
|
|
@ -115,7 +115,7 @@ public class TestCatalogTracker {
|
||||||
private CatalogTracker constructAndStartCatalogTracker(final HConnection c)
|
private CatalogTracker constructAndStartCatalogTracker(final HConnection c)
|
||||||
throws IOException, InterruptedException {
|
throws IOException, InterruptedException {
|
||||||
CatalogTracker ct = new CatalogTracker(this.watcher, UTIL.getConfiguration(),
|
CatalogTracker ct = new CatalogTracker(this.watcher, UTIL.getConfiguration(),
|
||||||
c, this.abortable, 0);
|
c, this.abortable);
|
||||||
ct.start();
|
ct.start();
|
||||||
return ct;
|
return ct;
|
||||||
}
|
}
|
||||||
|
@ -234,10 +234,8 @@ public class TestCatalogTracker {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
metaSet.set(ct.waitForMetaServerConnectionDefault() != null);
|
metaSet.set(ct.waitForMetaServerConnection(100000) != null);
|
||||||
} catch (NotAllMetaRegionsOnlineException e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException(e);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -195,7 +195,7 @@ public class TestMetaReaderEditorNoCluster {
|
||||||
when(connection).getClient(Mockito.anyString(), Mockito.anyInt());
|
when(connection).getClient(Mockito.anyString(), Mockito.anyInt());
|
||||||
|
|
||||||
// Now start up the catalogtracker with our doctored Connection.
|
// Now start up the catalogtracker with our doctored Connection.
|
||||||
ct = new CatalogTracker(zkw, null, connection, ABORTABLE, 0);
|
ct = new CatalogTracker(zkw, null, connection, ABORTABLE);
|
||||||
ct.start();
|
ct.start();
|
||||||
// Scan meta for user tables and verify we got back expected answer.
|
// Scan meta for user tables and verify we got back expected answer.
|
||||||
NavigableMap<HRegionInfo, Result> hris = MetaReader.getServerUserRegions(ct, sn);
|
NavigableMap<HRegionInfo, Result> hris = MetaReader.getServerUserRegions(ct, sn);
|
||||||
|
|
|
@ -116,7 +116,7 @@ public class TestCatalogJanitor {
|
||||||
this.ct = Mockito.mock(CatalogTracker.class);
|
this.ct = Mockito.mock(CatalogTracker.class);
|
||||||
AdminProtocol hri = Mockito.mock(AdminProtocol.class);
|
AdminProtocol hri = Mockito.mock(AdminProtocol.class);
|
||||||
Mockito.when(this.ct.getConnection()).thenReturn(this.connection);
|
Mockito.when(this.ct.getConnection()).thenReturn(this.connection);
|
||||||
Mockito.when(ct.waitForMetaServerConnectionDefault()).thenReturn(hri);
|
Mockito.when(ct.waitForMetaServerConnection(Mockito.anyLong())).thenReturn(hri);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -198,7 +198,7 @@ public class TestMasterNoCluster {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
CatalogTracker createCatalogTracker(ZooKeeperWatcher zk,
|
CatalogTracker createCatalogTracker(ZooKeeperWatcher zk,
|
||||||
Configuration conf, Abortable abortable, int defaultTimeout)
|
Configuration conf, Abortable abortable)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
// Insert a mock for the connection used by the CatalogTracker. Any
|
// Insert a mock for the connection used by the CatalogTracker. Any
|
||||||
// regionserver should do. Use TESTUTIL.getConfiguration rather than
|
// regionserver should do. Use TESTUTIL.getConfiguration rather than
|
||||||
|
@ -207,7 +207,7 @@ public class TestMasterNoCluster {
|
||||||
HConnection connection =
|
HConnection connection =
|
||||||
HConnectionTestingUtility.getMockedConnectionAndDecorate(TESTUTIL.getConfiguration(),
|
HConnectionTestingUtility.getMockedConnectionAndDecorate(TESTUTIL.getConfiguration(),
|
||||||
rs0, rs0, rs0.getServerName(), HRegionInfo.ROOT_REGIONINFO);
|
rs0, rs0, rs0.getServerName(), HRegionInfo.ROOT_REGIONINFO);
|
||||||
return new CatalogTracker(zk, conf, connection, abortable, defaultTimeout);
|
return new CatalogTracker(zk, conf, connection, abortable);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
master.start();
|
master.start();
|
||||||
|
@ -284,7 +284,7 @@ public class TestMasterNoCluster {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
CatalogTracker createCatalogTracker(ZooKeeperWatcher zk,
|
CatalogTracker createCatalogTracker(ZooKeeperWatcher zk,
|
||||||
Configuration conf, Abortable abortable, int defaultTimeout)
|
Configuration conf, Abortable abortable)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
// Insert a mock for the connection used by the CatalogTracker. Use
|
// Insert a mock for the connection used by the CatalogTracker. Use
|
||||||
// TESTUTIL.getConfiguration rather than the conf from the master; the
|
// TESTUTIL.getConfiguration rather than the conf from the master; the
|
||||||
|
@ -293,7 +293,7 @@ public class TestMasterNoCluster {
|
||||||
HConnection connection =
|
HConnection connection =
|
||||||
HConnectionTestingUtility.getMockedConnectionAndDecorate(TESTUTIL.getConfiguration(),
|
HConnectionTestingUtility.getMockedConnectionAndDecorate(TESTUTIL.getConfiguration(),
|
||||||
rs0, rs0, rs0.getServerName(), HRegionInfo.ROOT_REGIONINFO);
|
rs0, rs0, rs0.getServerName(), HRegionInfo.ROOT_REGIONINFO);
|
||||||
return new CatalogTracker(zk, conf, connection, abortable, defaultTimeout);
|
return new CatalogTracker(zk, conf, connection, abortable);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
master.start();
|
master.start();
|
||||||
|
|
Loading…
Reference in New Issue