From 222b7233540d93327d26cb0566b1c30379451656 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Mon, 4 Apr 2022 20:12:28 +0300 Subject: [PATCH] Handle read errors when dumping a delta layer file. If a file is corrupt, let's not stop on first read error, but continue dumping. --- .../src/layered_repository/delta_layer.rs | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/pageserver/src/layered_repository/delta_layer.rs b/pageserver/src/layered_repository/delta_layer.rs index 955d4145f3..7013c2417c 100644 --- a/pageserver/src/layered_repository/delta_layer.rs +++ b/pageserver/src/layered_repository/delta_layer.rs @@ -293,25 +293,31 @@ impl Layer for DeltaLayer { for (lsn, blob_ref) in versions.as_slice() { let mut desc = String::new(); let mut buf = vec![0u8; blob_ref.size()]; - chapter.read_exact_at(&mut buf, blob_ref.pos())?; - let val = Value::des(&buf); + match chapter.read_exact_at(&mut buf, blob_ref.pos()) { + Ok(()) => { + let val = Value::des(&buf); - match val { - Ok(Value::Image(img)) => { - write!(&mut desc, " img {} bytes", img.len())?; - } - Ok(Value::WalRecord(rec)) => { - let wal_desc = walrecord::describe_wal_record(&rec); - write!( - &mut desc, - " rec {} bytes will_init: {} {}", - buf.len(), - rec.will_init(), - wal_desc - )?; + match val { + Ok(Value::Image(img)) => { + write!(&mut desc, " img {} bytes", img.len())?; + } + Ok(Value::WalRecord(rec)) => { + let wal_desc = walrecord::describe_wal_record(&rec); + write!( + &mut desc, + " rec {} bytes will_init: {} {}", + buf.len(), + rec.will_init(), + wal_desc + )?; + } + Err(err) => { + write!(&mut desc, " DESERIALIZATION ERROR: {}", err)?; + } + } } Err(err) => { - write!(&mut desc, " DESERIALIZATION ERROR: {}", err)?; + write!(&mut desc, " READ ERROR: {}", err)?; } } println!(" key {} at {}: {}", key, lsn, desc);