mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 23:04:33 +00:00
Rollup merge of #119999 - onur-ozkan:remote-test-tools, r=Mark-Simulacrum
remote-test: use u64 to represent file size Currently, triggering a transfer of data exceeding the size of 4294967295 bytes results in a panic on the `remote-test-server` as `io::copy(&mut file, dst) failed with Connection reset by peer (os error 104)`. This issue happens because the size is transmitted as u32 to `remote-test-server`. First commit increases the supported file size. But I am not sure about its necessity — can we realistically encounter file sizes exceeding 4GB in builds, perhaps through some complicated configurations? ~The second commit adds a sanity check to avoid encountering the error `io::copy(&mut file, dst) failed with Connection reset by peer (os error 104)` on the `remote-test-server` side.~
This commit is contained in:
commit
9e896f42bd
@ -300,7 +300,7 @@ fn run(support_lib_count: usize, exe: String, all_args: Vec<String>) {
|
||||
|
||||
// Ok now it's time to read all the output. We're receiving "frames"
|
||||
// representing stdout/stderr, so we decode all that here.
|
||||
let mut header = [0; 5];
|
||||
let mut header = [0; 9];
|
||||
let mut stderr_done = false;
|
||||
let mut stdout_done = false;
|
||||
let mut client = t!(client.into_inner());
|
||||
@ -308,10 +308,8 @@ fn run(support_lib_count: usize, exe: String, all_args: Vec<String>) {
|
||||
let mut stderr = io::stderr();
|
||||
while !stdout_done || !stderr_done {
|
||||
t!(client.read_exact(&mut header));
|
||||
let amt = ((header[1] as u64) << 24)
|
||||
| ((header[2] as u64) << 16)
|
||||
| ((header[3] as u64) << 8)
|
||||
| ((header[4] as u64) << 0);
|
||||
let amt = u64::from_be_bytes(header[1..9].try_into().unwrap());
|
||||
|
||||
if header[0] == 0 {
|
||||
if amt == 0 {
|
||||
stdout_done = true;
|
||||
@ -349,7 +347,8 @@ fn send(path: &Path, dst: &mut dyn Write) {
|
||||
t!(dst.write_all(&[0]));
|
||||
let mut file = t!(File::open(&path));
|
||||
let amt = t!(file.metadata()).len();
|
||||
t!(dst.write_all(&[(amt >> 24) as u8, (amt >> 16) as u8, (amt >> 8) as u8, (amt >> 0) as u8,]));
|
||||
|
||||
t!(dst.write_all(&amt.to_be_bytes()));
|
||||
t!(io::copy(&mut file, dst));
|
||||
}
|
||||
|
||||
|
@ -347,7 +347,7 @@ fn recv<B: BufRead>(dir: &Path, io: &mut B) -> PathBuf {
|
||||
// the filesystem limits.
|
||||
let len = cmp::min(filename.len() - 1, 50);
|
||||
let dst = dir.join(t!(str::from_utf8(&filename[..len])));
|
||||
let amt = read_u32(io) as u64;
|
||||
let amt = read_u64(io);
|
||||
t!(io::copy(&mut io.take(amt), &mut t!(File::create(&dst))));
|
||||
set_permissions(&dst);
|
||||
dst
|
||||
@ -365,7 +365,7 @@ fn my_copy(src: &mut dyn Read, which: u8, dst: &Mutex<dyn Write>) {
|
||||
loop {
|
||||
let n = t!(src.read(&mut b));
|
||||
let mut dst = dst.lock().unwrap();
|
||||
t!(dst.write_all(&create_header(which, n as u32)));
|
||||
t!(dst.write_all(&create_header(which, n as u64)));
|
||||
if n > 0 {
|
||||
t!(dst.write_all(&b[..n]));
|
||||
} else {
|
||||
@ -377,7 +377,7 @@ fn my_copy(src: &mut dyn Read, which: u8, dst: &Mutex<dyn Write>) {
|
||||
fn batch_copy(buf: &[u8], which: u8, dst: &Mutex<dyn Write>) {
|
||||
let n = buf.len();
|
||||
let mut dst = dst.lock().unwrap();
|
||||
t!(dst.write_all(&create_header(which, n as u32)));
|
||||
t!(dst.write_all(&create_header(which, n as u64)));
|
||||
if n > 0 {
|
||||
t!(dst.write_all(buf));
|
||||
// Marking buf finished
|
||||
@ -385,13 +385,13 @@ fn batch_copy(buf: &[u8], which: u8, dst: &Mutex<dyn Write>) {
|
||||
}
|
||||
}
|
||||
|
||||
const fn create_header(which: u8, n: u32) -> [u8; 5] {
|
||||
const fn create_header(which: u8, n: u64) -> [u8; 9] {
|
||||
let bytes = n.to_be_bytes();
|
||||
[which, bytes[0], bytes[1], bytes[2], bytes[3]]
|
||||
[which, bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7]]
|
||||
}
|
||||
|
||||
fn read_u32(r: &mut dyn Read) -> u32 {
|
||||
let mut len = [0; 4];
|
||||
fn read_u64(r: &mut dyn Read) -> u64 {
|
||||
let mut len = [0; 8];
|
||||
t!(r.read_exact(&mut len));
|
||||
u32::from_be_bytes(len)
|
||||
u64::from_be_bytes(len)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user