HDFS-9521. TransferFsImage.receiveFile should account and log separate times for image download and fsync to disk. Contributed by Wellington Chevreuil
(cherry picked from commit fd1c09be3e
)
This commit is contained in:
parent
78919f8c34
commit
ed421cb128
|
@ -30,6 +30,7 @@ import java.net.URL;
|
|||
import java.security.DigestInputStream;
|
||||
import java.security.MessageDigest;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
@ -458,6 +459,9 @@ public class TransferFsImage {
|
|||
MD5Hash advertisedDigest, String fsImageName, InputStream stream,
|
||||
DataTransferThrottler throttler) throws IOException {
|
||||
long startTime = Time.monotonicNow();
|
||||
Map<FileOutputStream, File> streamPathMap = new HashMap<>();
|
||||
StringBuilder xferStats = new StringBuilder();
|
||||
double xferCombined = 0;
|
||||
if (localPaths != null) {
|
||||
// If the local paths refer to directories, use the server-provided header
|
||||
// as the filename within that directory
|
||||
|
@ -494,7 +498,9 @@ public class TransferFsImage {
|
|||
LOG.warn("Overwriting existing file " + f
|
||||
+ " with file downloaded from " + url);
|
||||
}
|
||||
outputStreams.add(new FileOutputStream(f));
|
||||
FileOutputStream fos = new FileOutputStream(f);
|
||||
outputStreams.add(fos);
|
||||
streamPathMap.put(fos, f);
|
||||
} catch (IOException ioe) {
|
||||
LOG.warn("Unable to download file " + f, ioe);
|
||||
// This will be null if we're downloading the fsimage to a file
|
||||
|
@ -527,11 +533,26 @@ public class TransferFsImage {
|
|||
}
|
||||
}
|
||||
finishedReceiving = true;
|
||||
double xferSec = Math.max(
|
||||
((float)(Time.monotonicNow() - startTime)) / 1000.0, 0.001);
|
||||
long xferKb = received / 1024;
|
||||
xferCombined += xferSec;
|
||||
xferStats.append(
|
||||
String.format(" The fsimage download took %.2fs at %.2f KB/s.",
|
||||
xferSec, xferKb / xferSec));
|
||||
} finally {
|
||||
stream.close();
|
||||
for (FileOutputStream fos : outputStreams) {
|
||||
long flushStartTime = Time.monotonicNow();
|
||||
fos.getChannel().force(true);
|
||||
fos.close();
|
||||
double writeSec = Math.max(((float)
|
||||
(flushStartTime - Time.monotonicNow())) / 1000.0, 0.001);
|
||||
xferCombined += writeSec;
|
||||
xferStats.append(String
|
||||
.format(" Synchronous (fsync) write to disk of " +
|
||||
streamPathMap.get(fos).getAbsolutePath() +
|
||||
" took %.2fs.", writeSec));
|
||||
}
|
||||
|
||||
// Something went wrong and did not finish reading.
|
||||
|
@ -550,11 +571,11 @@ public class TransferFsImage {
|
|||
advertisedSize);
|
||||
}
|
||||
}
|
||||
double xferSec = Math.max(
|
||||
((float)(Time.monotonicNow() - startTime)) / 1000.0, 0.001);
|
||||
long xferKb = received / 1024;
|
||||
LOG.info(String.format("Transfer took %.2fs at %.2f KB/s",
|
||||
xferSec, xferKb / xferSec));
|
||||
xferStats.insert(
|
||||
0, String.format(
|
||||
"Combined time for fsimage download and fsync " +
|
||||
"to all disks took %.2fs.", xferCombined));
|
||||
LOG.info(xferStats.toString());
|
||||
|
||||
if (digester != null) {
|
||||
MD5Hash computedDigest = new MD5Hash(digester.digest());
|
||||
|
|
Loading…
Reference in New Issue