HDFS-14476. lock too long when fix inconsistent blocks between disk and in-memory. Contributed by Sean Chow.
This commit is contained in:
parent
76bb297db9
commit
313b76f8e9
@ -66,7 +66,7 @@ public class DirectoryScanner implements Runnable {
|
||||
LoggerFactory.getLogger(DirectoryScanner.class);
|
||||
|
||||
private static final int DEFAULT_MAP_SIZE = 32768;
|
||||
|
||||
private static final int RECONCILE_BLOCKS_BATCH_SIZE = 1000;
|
||||
private final FsDatasetSpi<?> dataset;
|
||||
private final ExecutorService reportCompileThreadPool;
|
||||
private final ScheduledExecutorService masterThread;
|
||||
@ -424,10 +424,23 @@ void shutdown() {
|
||||
*/
|
||||
@VisibleForTesting
|
||||
public void reconcile() throws IOException {
|
||||
LOG.debug("reconcile start DirectoryScanning");
|
||||
scan();
|
||||
|
||||
// HDFS-14476: run checkAndUpadte with batch to avoid holding the lock too
|
||||
// long
|
||||
int loopCount = 0;
|
||||
for (final Map.Entry<String, ScanInfo> entry : diffs.getEntries()) {
|
||||
dataset.checkAndUpdate(entry.getKey(), entry.getValue());
|
||||
|
||||
if (loopCount % RECONCILE_BLOCKS_BATCH_SIZE == 0) {
|
||||
try {
|
||||
Thread.sleep(2000);
|
||||
} catch (InterruptedException e) {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
loopCount++;
|
||||
}
|
||||
|
||||
if (!retainDiffs) {
|
||||
|
Loading…
Reference in New Issue
Block a user