fix race condition in bg file reader file error (#18682)
This commit is contained in:
parent
cf31afdd6a
commit
ad3f18f031
|
@ -186,6 +186,7 @@ impl SharedBufferBgReader {
|
||||||
let mut max_bytes_read = 0;
|
let mut max_bytes_read = 0;
|
||||||
let mut wait_us = 0;
|
let mut wait_us = 0;
|
||||||
let mut total_bytes = 0;
|
let mut total_bytes = 0;
|
||||||
|
let mut error = SharedBufferReader::default_error();
|
||||||
loop {
|
loop {
|
||||||
if self.stop.load(Ordering::Relaxed) {
|
if self.stop.load(Ordering::Relaxed) {
|
||||||
// unsure what error is most appropriate here.
|
// unsure what error is most appropriate here.
|
||||||
|
@ -234,9 +235,9 @@ impl SharedBufferBgReader {
|
||||||
bytes_read += size;
|
bytes_read += size;
|
||||||
// loop to read some more. Underlying reader does not usually read all we ask for.
|
// loop to read some more. Underlying reader does not usually read all we ask for.
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(mut err) => {
|
||||||
error_received = true;
|
error_received = true;
|
||||||
self.set_error(err);
|
std::mem::swap(&mut error, &mut err);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -259,6 +260,8 @@ impl SharedBufferBgReader {
|
||||||
|
|
||||||
if error_received {
|
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.
|
// 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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,10 +695,12 @@ pub mod tests {
|
||||||
);
|
);
|
||||||
// #2 will read valid bytes first and succeed, then get error
|
// #2 will read valid bytes first and succeed, then get error
|
||||||
let mut data = vec![0; sent.len()];
|
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;
|
let expected_len = 1;
|
||||||
for i in 0..sent.len() {
|
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!(sent, data);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|
Loading…
Reference in New Issue