HDFS-13694. Making md5 computing being in parallel with image loading.
This commit is contained in:
parent
c9c3429a16
commit
9c90729486
|
@ -172,13 +172,76 @@ public final class FSImageFormatProtobuf {
|
|||
return ctx;
|
||||
}
|
||||
|
||||
/**
|
||||
* Thread to compute the MD5 of a file as this can be in parallel while
|
||||
* loading the image without interfering much.
|
||||
*/
|
||||
private static class DigestThread extends Thread {
|
||||
|
||||
/**
|
||||
* Exception thrown when computing the digest if it cannot be calculated.
|
||||
*/
|
||||
private volatile IOException ioe = null;
|
||||
|
||||
/**
|
||||
* Calculated digest if there are no error.
|
||||
*/
|
||||
private volatile MD5Hash digest = null;
|
||||
|
||||
/**
|
||||
* FsImage file computed MD5.
|
||||
*/
|
||||
private final File file;
|
||||
|
||||
DigestThread(File inFile) {
|
||||
file = inFile;
|
||||
setName(inFile.getName() + " MD5 compute");
|
||||
setDaemon(true);
|
||||
}
|
||||
|
||||
public MD5Hash getDigest() throws IOException {
|
||||
if (ioe != null) {
|
||||
throw ioe;
|
||||
}
|
||||
return digest;
|
||||
}
|
||||
|
||||
public IOException getException() {
|
||||
return ioe;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
digest = MD5FileUtils.computeMd5ForFile(file);
|
||||
} catch (IOException e) {
|
||||
ioe = e;
|
||||
} catch (Throwable t) {
|
||||
ioe = new IOException(t);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "DigestThread{ ThreadName=" + getName() + ", digest=" + digest
|
||||
+ ", file=" + file + '}';
|
||||
}
|
||||
}
|
||||
|
||||
void load(File file) throws IOException {
|
||||
long start = Time.monotonicNow();
|
||||
imgDigest = MD5FileUtils.computeMd5ForFile(file);
|
||||
DigestThread dt = new DigestThread(file);
|
||||
dt.start();
|
||||
RandomAccessFile raFile = new RandomAccessFile(file, "r");
|
||||
FileInputStream fin = new FileInputStream(file);
|
||||
try {
|
||||
loadInternal(raFile, fin);
|
||||
try {
|
||||
dt.join();
|
||||
imgDigest = dt.getDigest();
|
||||
} catch (InterruptedException ie) {
|
||||
throw new IOException(ie);
|
||||
}
|
||||
long end = Time.monotonicNow();
|
||||
LOG.info("Loaded FSImage in {} seconds.", (end - start) / 1000);
|
||||
} finally {
|
||||
|
|
Loading…
Reference in New Issue