Skip to content

Commit 1a2f111

Browse files
authored
commitlog: Error context for commit decode errors (#5129)
Adds some context to various errors that can occur during commit decoding. # Expected complexity level and risk 1 # Testing Not a functional change.
1 parent f23eb15 commit 1a2f111

1 file changed

Lines changed: 18 additions & 12 deletions

File tree

crates/commitlog/src/commit.rs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ impl Header {
6767
match &mut hdr.as_slice() {
6868
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] => Ok(None),
6969
buf => {
70-
let min_tx_offset = buf.get_u64().map_err(decode_error)?;
71-
let n = buf.get_u16().map_err(decode_error)?;
72-
let len = buf.get_u32().map_err(decode_error)?;
70+
let min_tx_offset = buf.get_u64().map_err(|e| decode_header_error(e, "min_tx_offset"))?;
71+
let n = buf.get_u16().map_err(|e| decode_header_error(e, "n"))?;
72+
let len = buf.get_u32().map_err(|e| decode_header_error(e, "len"))?;
7373

7474
Ok(Some(Self {
7575
min_tx_offset,
@@ -88,15 +88,15 @@ impl Header {
8888
return Ok(None);
8989
}
9090

91-
return Err(e);
91+
return Err(io::Error::new(e.kind(), format!("error reading commit header: {e}")));
9292
}
9393
match &mut hdr.as_slice() {
9494
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] => Ok(None),
9595
buf => {
96-
let min_tx_offset = buf.get_u64().map_err(decode_error)?;
97-
let epoch = buf.get_u64().map_err(decode_error)?;
98-
let n = buf.get_u16().map_err(decode_error)?;
99-
let len = buf.get_u32().map_err(decode_error)?;
96+
let min_tx_offset = buf.get_u64().map_err(|e| decode_header_error(e, "min_tx_offset"))?;
97+
let epoch = buf.get_u64().map_err(|e| decode_header_error(e, "epoch"))?;
98+
let n = buf.get_u16().map_err(|e| decode_header_error(e, "n"))?;
99+
let len = buf.get_u32().map_err(|e| decode_header_error(e, "len"))?;
100100

101101
Ok(Some(Self {
102102
min_tx_offset,
@@ -310,10 +310,16 @@ impl StoredCommit {
310310
return Ok(None);
311311
};
312312
let mut records = vec![0; hdr.len as usize];
313-
reader.read_exact(&mut records)?;
313+
reader.read_exact(&mut records).map_err(|e| {
314+
io::Error::new(
315+
e.kind(),
316+
format!("failed to read {} bytes of commit payload: {}", hdr.len, e),
317+
)
318+
})?;
314319

315320
let chk = reader.crc32c();
316-
let crc = decode_u32(reader.into_inner())?;
321+
let crc = decode_u32(reader.into_inner())
322+
.map_err(|e| io::Error::new(e.kind(), format!("failed to read checksum: {e}")))?;
317323

318324
if chk != crc {
319325
return Err(invalid_data(ChecksumMismatch));
@@ -385,8 +391,8 @@ fn decode_u32<R: Read>(mut read: R) -> io::Result<u32> {
385391
Ok(u32::from_le_bytes(buf))
386392
}
387393

388-
fn decode_error(e: DecodeError) -> io::Error {
389-
invalid_data(e)
394+
fn decode_header_error(e: DecodeError, field: &str) -> io::Error {
395+
invalid_data(format!("failed to decode commit header field '{field}': {e}"))
390396
}
391397

392398
fn invalid_data<E>(e: E) -> io::Error

0 commit comments

Comments
 (0)