HBASE-10516 Refactor code where Threads.sleep is called within a while/for loop (Feng Honghua)
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1570524 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
7378dd8521
commit
b0c77d1d7e
|
@ -32,7 +32,6 @@ import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.hbase.Abortable;
|
import org.apache.hadoop.hbase.Abortable;
|
||||||
import org.apache.hadoop.hbase.HConstants;
|
import org.apache.hadoop.hbase.HConstants;
|
||||||
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
|
import org.apache.hadoop.hbase.ZooKeeperConnectionException;
|
||||||
import org.apache.hadoop.hbase.util.Threads;
|
|
||||||
import org.apache.zookeeper.KeeperException;
|
import org.apache.zookeeper.KeeperException;
|
||||||
import org.apache.zookeeper.WatchedEvent;
|
import org.apache.zookeeper.WatchedEvent;
|
||||||
import org.apache.zookeeper.Watcher;
|
import org.apache.zookeeper.Watcher;
|
||||||
|
@ -372,9 +371,16 @@ public class ZooKeeperWatcher implements Watcher, Abortable, Closeable {
|
||||||
long finished = System.currentTimeMillis() +
|
long finished = System.currentTimeMillis() +
|
||||||
this.conf.getLong("hbase.zookeeper.watcher.sync.connected.wait", 2000);
|
this.conf.getLong("hbase.zookeeper.watcher.sync.connected.wait", 2000);
|
||||||
while (System.currentTimeMillis() < finished) {
|
while (System.currentTimeMillis() < finished) {
|
||||||
Threads.sleep(1);
|
try {
|
||||||
|
Thread.sleep(1);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
LOG.warn("Interrupted while sleeping");
|
||||||
|
throw new RuntimeException("Interrupted while waiting for" +
|
||||||
|
" recoverableZooKeeper is set");
|
||||||
|
}
|
||||||
if (this.recoverableZooKeeper != null) break;
|
if (this.recoverableZooKeeper != null) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.recoverableZooKeeper == null) {
|
if (this.recoverableZooKeeper == null) {
|
||||||
LOG.error("ZK is null on connection event -- see stack trace " +
|
LOG.error("ZK is null on connection event -- see stack trace " +
|
||||||
"for the stack trace when constructor was called on this zkw",
|
"for the stack trace when constructor was called on this zkw",
|
||||||
|
|
|
@ -51,7 +51,6 @@ import org.apache.hadoop.hbase.util.Bytes;
|
||||||
import org.apache.hadoop.hbase.util.ClassSize;
|
import org.apache.hadoop.hbase.util.ClassSize;
|
||||||
import org.apache.hadoop.hbase.util.FSUtils;
|
import org.apache.hadoop.hbase.util.FSUtils;
|
||||||
import org.apache.hadoop.hbase.util.HasThread;
|
import org.apache.hadoop.hbase.util.HasThread;
|
||||||
import org.apache.hadoop.hbase.util.Threads;
|
|
||||||
import org.apache.hadoop.util.StringUtils;
|
import org.apache.hadoop.util.StringUtils;
|
||||||
|
|
||||||
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||||
|
@ -869,8 +868,17 @@ public class LruBlockCache implements ResizableBlockCache, HeapSize {
|
||||||
victimHandler.shutdown();
|
victimHandler.shutdown();
|
||||||
this.scheduleThreadPool.shutdown();
|
this.scheduleThreadPool.shutdown();
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
if (!this.scheduleThreadPool.isShutdown()) Threads.sleep(10);
|
if (!this.scheduleThreadPool.isShutdown()) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(10);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
LOG.warn("Interrupted while sleeping");
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!this.scheduleThreadPool.isShutdown()) {
|
if (!this.scheduleThreadPool.isShutdown()) {
|
||||||
List<Runnable> runnables = this.scheduleThreadPool.shutdownNow();
|
List<Runnable> runnables = this.scheduleThreadPool.shutdownNow();
|
||||||
LOG.debug("Still running " + runnables);
|
LOG.debug("Still running " + runnables);
|
||||||
|
|
|
@ -1449,7 +1449,8 @@ public class AssignmentManager extends ZooKeeperListener {
|
||||||
* @param regions Regions to assign.
|
* @param regions Regions to assign.
|
||||||
* @return true if successful
|
* @return true if successful
|
||||||
*/
|
*/
|
||||||
boolean assign(final ServerName destination, final List<HRegionInfo> regions) {
|
boolean assign(final ServerName destination, final List<HRegionInfo> regions)
|
||||||
|
throws InterruptedException {
|
||||||
long startTime = EnvironmentEdgeManager.currentTimeMillis();
|
long startTime = EnvironmentEdgeManager.currentTimeMillis();
|
||||||
try {
|
try {
|
||||||
int regionCount = regions.size();
|
int regionCount = regions.size();
|
||||||
|
@ -1512,7 +1513,7 @@ public class AssignmentManager extends ZooKeeperListener {
|
||||||
oldCounter = count;
|
oldCounter = count;
|
||||||
}
|
}
|
||||||
if (count >= total) break;
|
if (count >= total) break;
|
||||||
Threads.sleep(5);
|
Thread.sleep(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (server.isStopped()) {
|
if (server.isStopped()) {
|
||||||
|
@ -1615,8 +1616,6 @@ public class AssignmentManager extends ZooKeeperListener {
|
||||||
LOG.info("Unable to communicate with " + destination
|
LOG.info("Unable to communicate with " + destination
|
||||||
+ " in order to assign regions, ", e);
|
+ " in order to assign regions, ", e);
|
||||||
return false;
|
return false;
|
||||||
} catch (InterruptedException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
for (Lock lock : locks.values()) {
|
for (Lock lock : locks.values()) {
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hadoop.hbase.master.handler;
|
package org.apache.hadoop.hbase.master.handler;
|
||||||
|
|
||||||
|
import java.io.InterruptedIOException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -39,7 +40,6 @@ import org.apache.hadoop.hbase.master.MasterFileSystem;
|
||||||
import org.apache.hadoop.hbase.master.MasterServices;
|
import org.apache.hadoop.hbase.master.MasterServices;
|
||||||
import org.apache.hadoop.hbase.master.RegionStates;
|
import org.apache.hadoop.hbase.master.RegionStates;
|
||||||
import org.apache.hadoop.hbase.master.RegionState.State;
|
import org.apache.hadoop.hbase.master.RegionState.State;
|
||||||
import org.apache.hadoop.hbase.util.Threads;
|
|
||||||
import org.apache.zookeeper.KeeperException;
|
import org.apache.zookeeper.KeeperException;
|
||||||
|
|
||||||
@InterfaceAudience.Private
|
@InterfaceAudience.Private
|
||||||
|
@ -78,7 +78,12 @@ public class DeleteTableHandler extends TableEventHandler {
|
||||||
am.regionOffline(region);
|
am.regionOffline(region);
|
||||||
}
|
}
|
||||||
if (!states.isRegionInTransition(region)) break;
|
if (!states.isRegionInTransition(region)) break;
|
||||||
Threads.sleep(waitingTimeForEvents);
|
try {
|
||||||
|
Thread.sleep(waitingTimeForEvents);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
LOG.warn("Interrupted while sleeping");
|
||||||
|
throw (InterruptedIOException)new InterruptedIOException().initCause(e);
|
||||||
|
}
|
||||||
LOG.debug("Waiting on region to clear regions in transition; "
|
LOG.debug("Waiting on region to clear regions in transition; "
|
||||||
+ am.getRegionStates().getRegionTransitionState(region));
|
+ am.getRegionStates().getRegionTransitionState(region));
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
package org.apache.hadoop.hbase.regionserver;
|
package org.apache.hadoop.hbase.regionserver;
|
||||||
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.InterruptedIOException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
@ -911,7 +912,11 @@ public class HRegionFileSystem {
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
lastIOE = ioe;
|
lastIOE = ioe;
|
||||||
if (fs.exists(dir)) return true; // directory is present
|
if (fs.exists(dir)) return true; // directory is present
|
||||||
|
try {
|
||||||
sleepBeforeRetry("Create Directory", i+1);
|
sleepBeforeRetry("Create Directory", i+1);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw (InterruptedIOException)new InterruptedIOException().initCause(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} while (++i <= hdfsClientRetriesNumber);
|
} while (++i <= hdfsClientRetriesNumber);
|
||||||
throw new IOException("Exception in createDir", lastIOE);
|
throw new IOException("Exception in createDir", lastIOE);
|
||||||
|
@ -934,9 +939,14 @@ public class HRegionFileSystem {
|
||||||
lastIOE = ioe;
|
lastIOE = ioe;
|
||||||
if (!fs.exists(srcpath) && fs.exists(dstPath)) return true; // successful move
|
if (!fs.exists(srcpath) && fs.exists(dstPath)) return true; // successful move
|
||||||
// dir is not there, retry after some time.
|
// dir is not there, retry after some time.
|
||||||
|
try {
|
||||||
sleepBeforeRetry("Rename Directory", i+1);
|
sleepBeforeRetry("Rename Directory", i+1);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw (InterruptedIOException)new InterruptedIOException().initCause(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} while (++i <= hdfsClientRetriesNumber);
|
} while (++i <= hdfsClientRetriesNumber);
|
||||||
|
|
||||||
throw new IOException("Exception in rename", lastIOE);
|
throw new IOException("Exception in rename", lastIOE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -956,16 +966,21 @@ public class HRegionFileSystem {
|
||||||
lastIOE = ioe;
|
lastIOE = ioe;
|
||||||
if (!fs.exists(dir)) return true;
|
if (!fs.exists(dir)) return true;
|
||||||
// dir is there, retry deleting after some time.
|
// dir is there, retry deleting after some time.
|
||||||
|
try {
|
||||||
sleepBeforeRetry("Delete Directory", i+1);
|
sleepBeforeRetry("Delete Directory", i+1);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw (InterruptedIOException)new InterruptedIOException().initCause(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} while (++i <= hdfsClientRetriesNumber);
|
} while (++i <= hdfsClientRetriesNumber);
|
||||||
|
|
||||||
throw new IOException("Exception in DeleteDir", lastIOE);
|
throw new IOException("Exception in DeleteDir", lastIOE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sleeping logic; handles the interrupt exception.
|
* sleeping logic; handles the interrupt exception.
|
||||||
*/
|
*/
|
||||||
private void sleepBeforeRetry(String msg, int sleepMultiplier) {
|
private void sleepBeforeRetry(String msg, int sleepMultiplier) throws InterruptedException {
|
||||||
sleepBeforeRetry(msg, sleepMultiplier, baseSleepBeforeRetries, hdfsClientRetriesNumber);
|
sleepBeforeRetry(msg, sleepMultiplier, baseSleepBeforeRetries, hdfsClientRetriesNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -993,9 +1008,14 @@ public class HRegionFileSystem {
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
lastIOE = ioe;
|
lastIOE = ioe;
|
||||||
if (fs.exists(dir)) return true; // directory is present
|
if (fs.exists(dir)) return true; // directory is present
|
||||||
|
try {
|
||||||
sleepBeforeRetry("Create Directory", i+1, baseSleepBeforeRetries, hdfsClientRetriesNumber);
|
sleepBeforeRetry("Create Directory", i+1, baseSleepBeforeRetries, hdfsClientRetriesNumber);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw (InterruptedIOException)new InterruptedIOException().initCause(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} while (++i <= hdfsClientRetriesNumber);
|
} while (++i <= hdfsClientRetriesNumber);
|
||||||
|
|
||||||
throw new IOException("Exception in createDir", lastIOE);
|
throw new IOException("Exception in createDir", lastIOE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1004,12 +1024,12 @@ public class HRegionFileSystem {
|
||||||
* for this to avoid re-looking for the integer values.
|
* for this to avoid re-looking for the integer values.
|
||||||
*/
|
*/
|
||||||
private static void sleepBeforeRetry(String msg, int sleepMultiplier, int baseSleepBeforeRetries,
|
private static void sleepBeforeRetry(String msg, int sleepMultiplier, int baseSleepBeforeRetries,
|
||||||
int hdfsClientRetriesNumber) {
|
int hdfsClientRetriesNumber) throws InterruptedException {
|
||||||
if (sleepMultiplier > hdfsClientRetriesNumber) {
|
if (sleepMultiplier > hdfsClientRetriesNumber) {
|
||||||
LOG.debug(msg + ", retries exhausted");
|
LOG.debug(msg + ", retries exhausted");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
LOG.debug(msg + ", sleeping " + baseSleepBeforeRetries + " times " + sleepMultiplier);
|
LOG.debug(msg + ", sleeping " + baseSleepBeforeRetries + " times " + sleepMultiplier);
|
||||||
Threads.sleep((long)baseSleepBeforeRetries * sleepMultiplier);
|
Thread.sleep((long)baseSleepBeforeRetries * sleepMultiplier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1127,6 +1127,8 @@ public class HRegionServer implements ClientProtos.ClientService.BlockingInterfa
|
||||||
int lastCount = -1;
|
int lastCount = -1;
|
||||||
long previousLogTime = 0;
|
long previousLogTime = 0;
|
||||||
Set<String> closedRegions = new HashSet<String>();
|
Set<String> closedRegions = new HashSet<String>();
|
||||||
|
boolean interrupted = false;
|
||||||
|
try {
|
||||||
while (!isOnlineRegionsEmpty()) {
|
while (!isOnlineRegionsEmpty()) {
|
||||||
int count = getNumberOfOnlineRegions();
|
int count = getNumberOfOnlineRegions();
|
||||||
// Only print a message if the count of regions has changed.
|
// Only print a message if the count of regions has changed.
|
||||||
|
@ -1163,7 +1165,17 @@ public class HRegionServer implements ClientProtos.ClientService.BlockingInterfa
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Threads.sleep(200);
|
try {
|
||||||
|
Thread.sleep(200);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
interrupted = true;
|
||||||
|
LOG.warn("Interrupted while sleeping");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (interrupted) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1188,7 +1188,8 @@ public class TestAssignmentManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
boolean assign(ServerName destination, List<HRegionInfo> regions) {
|
boolean assign(ServerName destination, List<HRegionInfo> regions)
|
||||||
|
throws InterruptedException {
|
||||||
if (enabling) {
|
if (enabling) {
|
||||||
for (HRegionInfo region : regions) {
|
for (HRegionInfo region : regions) {
|
||||||
assignmentCount++;
|
assignmentCount++;
|
||||||
|
|
Loading…
Reference in New Issue