HBASE-5606 SplitLogManger async delete node hangs log splitting when ZK connection is lost

(Prakash)


git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1309173 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Zhihong Yu 2012-04-03 22:04:45 +00:00
parent e72b67e20c
commit 5e07b71ed6
1 changed files with 20 additions and 4 deletions

View File

@ -404,6 +404,14 @@ public class SplitLogManager extends ZooKeeperListener {
tot_mgr_get_data_queued.incrementAndGet();
}
private void tryGetDataSetWatch(String path) {
// A negative retry count will lead to ignoring all error processing.
this.watcher.getRecoverableZooKeeper().getZooKeeper().
getData(path, this.watcher,
new GetDataAsyncCallback(), new Long(-1) /* retry count */);
tot_mgr_get_data_queued.incrementAndGet();
}
private void getDataSetWatchSuccess(String path, byte[] data, int version) {
if (data == null) {
if (version == Integer.MIN_VALUE) {
@ -916,11 +924,13 @@ public class SplitLogManager extends ZooKeeperListener {
for (Map.Entry<String, Task> e : tasks.entrySet()) {
String path = e.getKey();
Task task = e.getValue();
// we have to do this check again because tasks might have
// been asynchronously assigned.
if (task.isUnassigned()) {
// we have to do task.isUnassigned() check again because tasks might
// have been asynchronously assigned. There is no locking required
// for these checks ... it is OK even if tryGetDataSetWatch() is
// called unnecessarily for a task
if (task.isUnassigned() && (task.status != FAILURE)) {
// We just touch the znode to make sure its still there
getDataSetWatch(path, zkretries);
tryGetDataSetWatch(path);
}
}
createRescanNode(Long.MAX_VALUE);
@ -990,6 +1000,12 @@ public class SplitLogManager extends ZooKeeperListener {
return;
}
Long retry_count = (Long) ctx;
if (retry_count < 0) {
LOG.warn("getdata rc = " + KeeperException.Code.get(rc) + " " +
path + ". Ignoring error. No error handling. No retrying.");
return;
}
LOG.warn("getdata rc = " + KeeperException.Code.get(rc) + " " +
path + " remaining retries=" + retry_count);
if (retry_count == 0) {