From 2b0193e6bffae54a02cc09a4621b0e2bdd565947 Mon Sep 17 00:00:00 2001 From: anastasia Date: Fri, 4 Jun 2021 15:46:47 +0300 Subject: [PATCH] implement from_bytes for XLogPageHeader structs --- pageserver/src/waldecoder.rs | 40 ++++------------------------------ postgres_ffi/src/xlog_utils.rs | 26 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 36 deletions(-) diff --git a/pageserver/src/waldecoder.rs b/pageserver/src/waldecoder.rs index a3d17a0f9c..3d589b89c0 100644 --- a/pageserver/src/waldecoder.rs +++ b/pageserver/src/waldecoder.rs @@ -79,7 +79,8 @@ impl WalStreamDecoder { return Ok(None); } - let hdr = self.decode_XLogLongPageHeaderData(); + let hdr = XLogLongPageHeaderData::from_bytes(&mut self.inputbuf); + if hdr.std.xlp_pageaddr != self.lsn.0 { return Err(WalDecodeError { msg: "invalid xlog segment header".into(), @@ -95,7 +96,8 @@ impl WalStreamDecoder { return Ok(None); } - let hdr = self.decode_XLogPageHeaderData(); + let hdr = XLogPageHeaderData::from_bytes(&mut self.inputbuf); + if hdr.xlp_pageaddr != self.lsn.0 { return Err(WalDecodeError { msg: "invalid xlog page header".into(), @@ -184,40 +186,6 @@ impl WalStreamDecoder { // deal with xlog_switch records } - - #[allow(non_snake_case)] - fn decode_XLogPageHeaderData(&mut self) -> XLogPageHeaderData { - let buf = &mut self.inputbuf; - - // FIXME: Assume little-endian - - let hdr: XLogPageHeaderData = XLogPageHeaderData { - xlp_magic: buf.get_u16_le(), - xlp_info: buf.get_u16_le(), - xlp_tli: buf.get_u32_le(), - xlp_pageaddr: buf.get_u64_le(), - xlp_rem_len: buf.get_u32_le(), - }; - // 4 bytes of padding, on 64-bit systems - buf.advance(4); - - // FIXME: check that hdr.xlp_rem_len matches self.contlen - //println!("next xlog page (xlp_rem_len: {})", hdr.xlp_rem_len); - - hdr - } - - #[allow(non_snake_case)] - fn decode_XLogLongPageHeaderData(&mut self) -> XLogLongPageHeaderData { - let hdr: XLogLongPageHeaderData = XLogLongPageHeaderData { - std: self.decode_XLogPageHeaderData(), - xlp_sysid: self.inputbuf.get_u64_le(), - xlp_seg_size: self.inputbuf.get_u32_le(), - xlp_xlog_blcksz: self.inputbuf.get_u32_le(), - }; - - hdr - } } #[allow(dead_code)] diff --git a/postgres_ffi/src/xlog_utils.rs b/postgres_ffi/src/xlog_utils.rs index 22f8232f24..5d1ed5b456 100644 --- a/postgres_ffi/src/xlog_utils.rs +++ b/postgres_ffi/src/xlog_utils.rs @@ -301,8 +301,23 @@ pub struct XLogPageHeaderData { pub xlp_tli: u32, /* TimeLineID of first record on page */ pub xlp_pageaddr: u64, /* XLOG address of this page */ pub xlp_rem_len: u32, /* total len of remaining data for record */ + padding: u32, /* Add explicit padding */ } +impl XLogPageHeaderData { + pub fn from_bytes(buf: &mut B) -> XLogPageHeaderData { + XLogPageHeaderData { + xlp_magic: buf.get_u16_le(), + xlp_info: buf.get_u16_le(), + xlp_tli: buf.get_u32_le(), + xlp_pageaddr: buf.get_u64_le(), + xlp_rem_len: buf.get_u32_le(), + padding: buf.get_u32_le(), + } + } +} + + #[repr(C)] #[derive(Debug)] pub struct XLogLongPageHeaderData { @@ -311,3 +326,14 @@ pub struct XLogLongPageHeaderData { pub xlp_seg_size: u32, /* just as a cross-check */ pub xlp_xlog_blcksz: u32, /* just as a cross-check */ } + +impl XLogLongPageHeaderData { + pub fn from_bytes(buf: &mut B) -> XLogLongPageHeaderData { + XLogLongPageHeaderData { + std: XLogPageHeaderData::from_bytes(buf), + xlp_sysid: buf.get_u64_le(), + xlp_seg_size: buf.get_u32_le(), + xlp_xlog_blcksz: buf.get_u32_le(), + } + } +}