From a2841c750dc80663db83a310bb19a9efcf4ba588 Mon Sep 17 00:00:00 2001 From: Konstantin Knizhnik Date: Wed, 5 May 2021 08:21:03 +0300 Subject: [PATCH] Fix handling truncated WAL records in GC --- pageserver/src/page_cache.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/pageserver/src/page_cache.rs b/pageserver/src/page_cache.rs index 562bbd392b..00200abc26 100644 --- a/pageserver/src/page_cache.rs +++ b/pageserver/src/page_cache.rs @@ -202,6 +202,7 @@ pub struct CacheEntryContent { const PAGE_IMAGE_FLAG: u8 = 1u8; const UNUSED_VERSION_FLAG: u8 = 2u8; +const TRUNCATED_FLAG: u8 = 4u8; impl CacheEntryContent { pub fn pack(&self, buf: &mut BytesMut) { @@ -210,7 +211,11 @@ impl CacheEntryContent { buf.put_u16(image.len() as u16); buf.put_slice(&image[..]); } else if let Some(rec) = &self.wal_record { - buf.put_u8(0); + if rec.truncated { + buf.put_u8(TRUNCATED_FLAG); + } else { + buf.put_u8(0); + } rec.pack(buf); } } @@ -790,7 +795,7 @@ impl PageCache { minkey.lsn = Lsn(0); // first version // reconstruct most recent page version - if (v[0] & PAGE_IMAGE_FLAG) == 0 { + if (v[0] & (TRUNCATED_FLAG | PAGE_IMAGE_FLAG)) == 0 { trace!("Reconstruct most recent page {:?}", key); // force reconstruction of most recent page version let (base_img, records) = @@ -818,7 +823,7 @@ impl PageCache { let key = CacheKey::unpack(&mut buf); if key.tag == maxkey.tag { let v = iter.value().unwrap(); - if (v[0] & PAGE_IMAGE_FLAG) == 0 { + if (v[0] & (TRUNCATED_FLAG | PAGE_IMAGE_FLAG)) == 0 { trace!("Reconstruct horizon page {:?}", key); let (base_img, records) = self.collect_records_for_apply(key.tag, key.lsn);