From 394e675db31808a335f9dfeb1f2a63f1521cc545 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Sat, 27 Jan 2024 14:49:59 +0200 Subject: [PATCH] Print checkpoint key contents "pagectl print-layer-file" --- pageserver/src/pgdatadir_mapping.rs | 2 +- .../src/tenant/storage_layer/delta_layer.rs | 22 ++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/pageserver/src/pgdatadir_mapping.rs b/pageserver/src/pgdatadir_mapping.rs index d9cc85319e..ac9ee8d153 100644 --- a/pageserver/src/pgdatadir_mapping.rs +++ b/pageserver/src/pgdatadir_mapping.rs @@ -1832,7 +1832,7 @@ const CONTROLFILE_KEY: Key = Key { field6: 0, }; -const CHECKPOINT_KEY: Key = Key { +pub const CHECKPOINT_KEY: Key = Key { field1: 0x03, field2: 0, field3: 0, diff --git a/pageserver/src/tenant/storage_layer/delta_layer.rs b/pageserver/src/tenant/storage_layer/delta_layer.rs index 4ded6d6a8d..645f39dfbf 100644 --- a/pageserver/src/tenant/storage_layer/delta_layer.rs +++ b/pageserver/src/tenant/storage_layer/delta_layer.rs @@ -884,7 +884,7 @@ impl DeltaLayerInner { let keys = self.load_keys(ctx).await?; - async fn dump_blob(val: ValueRef<'_>, ctx: &RequestContext) -> anyhow::Result { + async fn dump_blob(val: &ValueRef<'_>, ctx: &RequestContext) -> anyhow::Result { let buf = val.reader.read_blob(val.blob_ref.pos(), ctx).await?; let val = Value::des(&buf)?; let desc = match val { @@ -905,14 +905,30 @@ impl DeltaLayerInner { } for entry in keys { - let DeltaEntry { key, lsn, val, .. } = entry; - let desc = match dump_blob(val, ctx).await { + let DeltaEntry { key, lsn, val, .. } = entry; + let desc = match dump_blob(&val, ctx).await { Ok(desc) => desc, Err(err) => { format!("ERROR: {err}") } }; println!(" key {key} at {lsn}: {desc}"); + use crate::pgdatadir_mapping::CHECKPOINT_KEY; + use postgres_ffi::CheckPoint; + if key == CHECKPOINT_KEY + { + let buf = val.reader.read_blob(val.blob_ref.pos(), ctx).await?; + let val = Value::des(&buf)?; + match val { + Value::Image(img) => { + let checkpoint = CheckPoint::decode(&img)?; + println!(" CHECKPOINT: {:?}", checkpoint); + } + Value::WalRecord(_rec) => { + format!(" unexpected walrecord for checkpoint key"); + } + } + } } Ok(())