fix race condition in bg file reader file error (#18682)

This commit is contained in:
Jeff Washington (jwash) 2021-07-14 19:04:55 -05:00 committed by GitHub
parent cf31afdd6a
commit ad3f18f031
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 4 deletions

View File

@ -186,6 +186,7 @@ impl SharedBufferBgReader {
let mut max_bytes_read = 0;
let mut wait_us = 0;
let mut total_bytes = 0;
let mut error = SharedBufferReader::default_error();
loop {
if self.stop.load(Ordering::Relaxed) {
// unsure what error is most appropriate here.
@ -234,9 +235,9 @@ impl SharedBufferBgReader {
bytes_read += size;
// loop to read some more. Underlying reader does not usually read all we ask for.
}
Err(err) => {
Err(mut err) => {
error_received = true;
self.set_error(err);
std::mem::swap(&mut error, &mut err);
break;
}
}
@ -259,6 +260,8 @@ impl SharedBufferBgReader {
if error_received {
// do not ask for more data from 'reader'. We got an error and saved all the data we got before the error.
// but, wait to set error until we have added our buffer to newly_read_data
self.set_error(error);
break;
}
}
@ -692,10 +695,12 @@ pub mod tests {
);
// #2 will read valid bytes first and succeed, then get error
let mut data = vec![0; sent.len()];
// this read should succeed because it was prior to error being received by bg reader
// this read should succeed because it is reading data prior to error being received by bg reader
let expected_len = 1;
for i in 0..sent.len() {
assert_eq!(reader2.read(&mut data[i..=i]).unwrap(), expected_len);
let len = reader2.read(&mut data[i..=i]);
assert!(len.is_ok(), "{:?}, progress: {}", len, i);
assert_eq!(len.unwrap(), expected_len, "progress: {}", i);
}
assert_eq!(sent, data);
assert_eq!(