Implement std::fmt::Display for RelTag, for debug messages.

This commit is contained in:
Heikki Linnakangas
2021-05-11 10:55:51 +03:00
parent ff76226a35
commit fb71c85a79
2 changed files with 33 additions and 70 deletions

View File

@@ -4,7 +4,9 @@ use crate::waldecoder::{DecodedWALRecord, Oid};
use crate::ZTimelineId;
use anyhow::Result;
use bytes::{Buf, BufMut, Bytes, BytesMut};
use std::fmt;
use std::sync::Arc;
use postgres_ffi::relfile_utils::forknumber_to_name;
use zenith_utils::lsn::Lsn;
///
@@ -138,6 +140,20 @@ impl RelTag {
}
}
/// Display RelTag in the same format that's used in most PostgreSQL debug messages:
///
/// <spcnode>/<dbnode>/<relnode>[_fsm|_vm|_init]
///
impl fmt::Display for RelTag {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if let Some(forkname) = forknumber_to_name(self.forknum) {
write!(f, "{}/{}/{}_{}", self.spcnode, self.dbnode, self.relnode, forkname)
} else {
write!(f, "{}/{}/{}", self.spcnode, self.dbnode, self.relnode)
}
}
}
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
pub struct BufferTag {
pub rel: RelTag,

View File

@@ -335,13 +335,13 @@ impl RocksTimeline {
break;
}
let relsize = tag.blknum + 1;
debug!("Size of relation {:?} at {} is {}", rel, lsn, relsize);
debug!("Size of relation {} at {} is {}", rel, lsn, relsize);
return Ok(relsize);
}
}
break;
}
debug!("Size of relation {:?} at {} is zero", rel, lsn);
debug!("Size of relation {} at {} is zero", rel, lsn);
Ok(0)
}
@@ -399,8 +399,8 @@ impl RocksTimeline {
let (base_img, records) =
self.collect_records_for_apply(key.tag, key.lsn);
trace!("Reconstruct most recent page {}/{}/{}_{} blk {} at {} from {} records",
key.tag.rel.spcnode, key.tag.rel.dbnode, key.tag.rel.relnode, key.tag.rel.forknum, key.tag.blknum, key.lsn, records.len());
trace!("Reconstruct most recent page {} blk {} at {} from {} records",
key.tag.rel, key.tag.blknum, key.lsn, records.len());
let new_img = self
.walredo_mgr
@@ -428,8 +428,8 @@ impl RocksTimeline {
if (v[0] & CONTENT_KIND_MASK) == CONTENT_WAL_RECORD {
let (base_img, records) =
self.collect_records_for_apply(key.tag, key.lsn);
trace!("Reconstruct horizon page {}/{}/{}_{} blk {} at {} from {} records",
key.tag.rel.spcnode, key.tag.rel.dbnode, key.tag.rel.relnode, key.tag.rel.forknum, key.tag.blknum, key.lsn, records.len());
trace!("Reconstruct horizon page {} blk {} at {} from {} records",
key.tag.rel, key.tag.blknum, key.lsn, records.len());
let new_img = self
.walredo_mgr
.request_redo(key.tag, key.lsn, base_img, records)?;
@@ -437,28 +437,11 @@ impl RocksTimeline {
truncated += 1;
} else {
trace!(
"Keeping horizon page {}/{}/{}_{} blk {} at {}",
key.tag.rel.spcnode,
key.tag.rel.dbnode,
key.tag.rel.relnode,
key.tag.rel.forknum,
key.tag.blknum,
key.lsn
);
trace!("Keeping horizon page {} blk {} at {}", key.tag.rel, key.tag.blknum, key.lsn);
}
}
} else {
trace!(
"Last page {}/{}/{}_{} blk {} at {}, horizon {}",
key.tag.rel.spcnode,
key.tag.rel.dbnode,
key.tag.rel.relnode,
key.tag.rel.forknum,
key.tag.blknum,
key.lsn,
horizon
);
trace!("Last page {} blk {} at {}, horizon {}", key.tag.rel, key.tag.blknum, key.lsn, horizon);
}
// remove records prior to horizon
loop {
@@ -479,15 +462,7 @@ impl RocksTimeline {
v[0] |= UNUSED_VERSION_FLAG;
self.db.put(k, &v[..])?;
deleted += 1;
trace!(
"deleted: {}/{}/{}_{} blk {} at {}",
key.tag.rel.spcnode,
key.tag.rel.dbnode,
key.tag.rel.relnode,
key.tag.rel.forknum,
key.tag.blknum,
key.lsn
);
trace!("deleted: {} blk {} at {}", key.tag.rel, key.tag.blknum, key.lsn);
} else {
break;
}
@@ -583,21 +558,17 @@ impl Timeline for RocksTimeline {
u32::from_le_bytes(page_img.get(0..4).unwrap().try_into().unwrap());
let page_lsn_lo =
u32::from_le_bytes(page_img.get(4..8).unwrap().try_into().unwrap());
debug!(
"Returning page with LSN {:X}/{:X} for {}/{}/{}.{} blk {}",
debug!("Returning page with LSN {:X}/{:X} for {} blk {}",
page_lsn_hi,
page_lsn_lo,
tag.rel.spcnode,
tag.rel.dbnode,
tag.rel.relnode,
tag.rel.forknum,
tag.rel,
tag.blknum
);
return Ok(page_img);
}
}
static ZERO_PAGE: [u8; 8192] = [0u8; 8192];
debug!("Page {:?} at {}({}) not found", tag, req_lsn, lsn);
debug!("Page {} blk {} at {}({}) not found", tag.rel, tag.blknum, req_lsn, lsn);
Ok(Bytes::from_static(&ZERO_PAGE))
/* return Err("could not find page image")?; */
}
@@ -633,11 +604,11 @@ impl Timeline for RocksTimeline {
buf.extend_from_slice(&k);
let tag = BufferTag::unpack(&mut buf);
if tag.rel == rel {
debug!("Relation {:?} exists at {}", rel, lsn);
debug!("Relation {} exists at {}", rel, lsn);
return Ok(true);
}
}
debug!("Relation {:?} doesn't exist at {}", rel, lsn);
debug!("Relation {} doesn't exist at {}", rel, lsn);
Ok(false)
}
@@ -659,15 +630,7 @@ impl Timeline for RocksTimeline {
content.pack(&mut val_buf);
let _res = self.db.put(&key_buf[..], &val_buf[..]);
trace!(
"put_wal_record {} {}/{}/{}_{} blk at {}",
tag.rel.spcnode,
tag.rel.dbnode,
tag.rel.relnode,
tag.rel.forknum,
tag.blknum,
lsn
);
trace!("put_wal_record rel {} blk {} at {}", tag.rel, tag.blknum, lsn);
self.num_entries.fetch_add(1, Ordering::Relaxed);
self.num_wal_records.fetch_add(1, Ordering::Relaxed);
@@ -684,15 +647,7 @@ impl Timeline for RocksTimeline {
let content = CacheEntryContent::Truncation;
// set new relation size
trace!(
"Truncate relation {}/{}/{}_{} to {} blocks at {}",
rel.spcnode,
rel.dbnode,
rel.relnode,
rel.forknum,
nblocks,
lsn
);
trace!("Truncate relation {} to {} blocks at {}", rel, nblocks, lsn);
let mut key_buf = BytesMut::new();
let mut val_buf = BytesMut::new();
@@ -729,15 +684,7 @@ impl Timeline for RocksTimeline {
trace!("put_wal_record lsn: {}", key.lsn);
let _res = self.db.put(&key_buf[..], &val_buf[..]);
trace!(
"put_page_image {} {}/{}/{}_{} blk at {}",
tag.rel.spcnode,
tag.rel.dbnode,
tag.rel.relnode,
tag.rel.forknum,
tag.blknum,
lsn
);
trace!("put_page_image rel {} blk {} at {}", tag.rel, tag.blknum, lsn);
self.num_page_images.fetch_add(1, Ordering::Relaxed);
}