Skip to content

Commit 1920a65

Browse files
authored
Replace BufWriter by Vec<u8> in logger buffer (#890)
The logger buffer should never flush automatically when some buffer limit is reached, therefore, using a Vec<u8> helps convey the intended behavior, and removes the extremely unlikely scenario where a BufWriter flushes before the expected
1 parent 2636efd commit 1920a65

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

src/utils/logger.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ enum MessageLevel {
172172

173173
mod logger_thread {
174174
use std::{
175-
io::{self, Write},
175+
io::{stderr, Write},
176176
sync::{mpsc::RecvTimeoutError, Arc, Barrier},
177177
time::Duration,
178178
};
@@ -245,13 +245,13 @@ mod logger_thread {
245245
fn run_logger(log_receiver: LogReceiver) {
246246
const FLUSH_TIMEOUT: Duration = Duration::from_millis(200);
247247

248-
let mut writer = io::BufWriter::new(io::stderr());
248+
let mut buffer = Vec::new();
249249

250250
loop {
251251
let msg = match log_receiver.recv_timeout(FLUSH_TIMEOUT) {
252252
Ok(msg) => msg,
253253
Err(RecvTimeoutError::Timeout) => {
254-
writer.flush().unwrap();
254+
flush_logs_to_stderr(&mut buffer);
255255
continue;
256256
}
257257
Err(RecvTimeoutError::Disconnected) => unreachable!("sender is static"),
@@ -261,19 +261,28 @@ mod logger_thread {
261261
LoggerCommand::Print(msg) => {
262262
// Append message to buffer
263263
if msg.should_display() {
264-
writeln!(writer, "{msg}").unwrap();
264+
writeln!(buffer, "{msg}").unwrap();
265265
}
266266
}
267267
LoggerCommand::Flush { finished_barrier } => {
268-
writer.flush().unwrap();
268+
flush_logs_to_stderr(&mut buffer);
269269
finished_barrier.wait();
270270
}
271271
LoggerCommand::FlushAndShutdown { finished_barrier } => {
272-
writer.flush().unwrap();
272+
flush_logs_to_stderr(&mut buffer);
273273
finished_barrier.wait();
274274
return;
275275
}
276276
}
277277
}
278278
}
279+
280+
fn flush_logs_to_stderr(buffer: &mut Vec<u8>) {
281+
if !buffer.is_empty() {
282+
if let Err(err) = stderr().write_all(buffer) {
283+
panic!("Failed to write to STDERR: {err}");
284+
}
285+
buffer.clear();
286+
}
287+
}
279288
}

0 commit comments

Comments
 (0)