From 1c1812df057f6fa58c7c73f2a3409c81093d0d85 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Mon, 22 Mar 2021 11:39:29 +0200 Subject: [PATCH] Fix decoding WAL segment header --- src/waldecoder.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/waldecoder.rs b/src/waldecoder.rs index fb6c8e8cf1..05ff4ba9eb 100644 --- a/src/waldecoder.rs +++ b/src/waldecoder.rs @@ -8,6 +8,8 @@ use bytes::{Buf, BufMut, Bytes, BytesMut}; use std::cmp::min; +use log::*; + const XLOG_BLCKSZ: u32 = 8192; // FIXME: this is configurable in PostgreSQL, 16 MB is the default @@ -17,6 +19,7 @@ const WAL_SEGMENT_SIZE: u64 = 16*1024*1024; // From PostgreSQL headers #[repr(C)] +#[derive(Debug)] struct XLogPageHeaderData { xlp_magic: u16, /* magic value for correctness checks */ @@ -31,6 +34,7 @@ struct XLogPageHeaderData const SizeOfXLogShortPHD: usize = 2+2+4+8+4 + 4; #[repr(C)] +#[derive(Debug)] struct XLogLongPageHeaderData { std: XLogPageHeaderData, /* standard header fields */ @@ -209,9 +213,9 @@ impl WalStreamDecoder { let hdr : XLogLongPageHeaderData = XLogLongPageHeaderData { std: self.decode_XLogPageHeaderData(), - xlp_sysid: self.recordbuf.get_u64_le(), - xlp_seg_size: self.recordbuf.get_u32_le(), - xlp_xlog_blcksz: self.recordbuf.get_u32_le(), + xlp_sysid: self.inputbuf.get_u64_le(), + xlp_seg_size: self.inputbuf.get_u32_le(), + xlp_xlog_blcksz: self.inputbuf.get_u32_le(), }; return hdr; @@ -289,6 +293,8 @@ pub struct DecodedWALRecord { // pub fn decode_wal_record(lsn: u64, rec: Bytes) -> DecodedWALRecord { + trace!("decoding record at {:08X}/{:08X} ({} bytes)", lsn >> 32, lsn & 0xffff_ffff, rec.remaining()); + let mut buf = rec.clone(); // FIXME: assume little-endian here