Skip to content

Commit d32a733

Browse files
committed
optimize file read in Config::verify
`Config::verify` refactored to improve the efficiency and memory usage of file hashing. Signed-off-by: onur-ozkan <[email protected]>
1 parent 7ed044c commit d32a733

File tree

1 file changed

+27
-10
lines changed

1 file changed

+27
-10
lines changed

src/bootstrap/download.rs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::{
22
env,
33
ffi::{OsStr, OsString},
44
fs::{self, File},
5-
io::{BufRead, BufReader, BufWriter, ErrorKind, Write},
5+
io::{BufRead, BufReader, BufWriter, ErrorKind, Read, Write},
66
path::{Path, PathBuf},
77
process::{Command, Stdio},
88
};
@@ -324,21 +324,38 @@ impl Config {
324324
use sha2::Digest;
325325

326326
self.verbose(&format!("verifying {}", path.display()));
327+
328+
if self.dry_run() {
329+
return false;
330+
}
331+
327332
let mut hasher = sha2::Sha256::new();
328-
// FIXME: this is ok for rustfmt (4.1 MB large at time of writing), but it seems memory-intensive for rustc and larger components.
329-
// Consider using streaming IO instead?
330-
let contents = if self.dry_run() { vec![] } else { t!(fs::read(path)) };
331-
hasher.update(&contents);
332-
let found = hex::encode(hasher.finalize().as_slice());
333-
let verified = found == expected;
334-
if !verified && !self.dry_run() {
333+
334+
let file = t!(File::open(path));
335+
let mut reader = BufReader::new(file);
336+
let mut buffer = [0; 4096]; // read in chunks of 4KB
337+
338+
loop {
339+
let read_len = t!(reader.read(&mut buffer));
340+
// break if EOF
341+
if read_len == 0 {
342+
break;
343+
}
344+
hasher.update(&buffer[0..read_len]);
345+
}
346+
347+
let checksum = hex::encode(hasher.finalize().as_slice());
348+
let verified = checksum == expected;
349+
350+
if !verified {
335351
println!(
336352
"invalid checksum: \n\
337-
found: {found}\n\
353+
found: {checksum}\n\
338354
expected: {expected}",
339355
);
340356
}
341-
return verified;
357+
358+
verified
342359
}
343360
}
344361

0 commit comments

Comments
 (0)