From 92ae912ebe9fccb9fff5a0e488e52b80dbf4eaf4 Mon Sep 17 00:00:00 2001 From: Konstantin Knizhnik Date: Thu, 3 Oct 2024 17:25:38 +0300 Subject: [PATCH] Handle lack of checkpoint in basebackup --- pageserver/src/basebackup.rs | 44 ++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/pageserver/src/basebackup.rs b/pageserver/src/basebackup.rs index 8aa4a3671d..8765acd725 100644 --- a/pageserver/src/basebackup.rs +++ b/pageserver/src/basebackup.rs @@ -258,29 +258,29 @@ where async fn send_tarball(mut self) -> Result<(), BasebackupError> { // TODO include checksum - let checkpoint = CheckPoint::decode( - &self - .timeline - .get_checkpoint(self.lsn, self.ctx) - .await - .context("failed to get checkpoint bytes")?, - ) - .context("deserialize checkpoint")?; - let checkpoint_end = - checkpoint.redo + ((XLOG_SIZE_OF_XLOG_RECORD + 8 + SIZEOF_CHECKPOINT) as u64); - let checkpoint_end_lsn = Lsn(checkpoint_end - + (if (XLOG_BLCKSZ as u64) - checkpoint.redo % (XLOG_BLCKSZ as u64) - < (SIZEOF_CHECKPOINT as u64) - { - if (checkpoint_end & ((WAL_SEGMENT_SIZE - 1) as u64)) < (XLOG_BLCKSZ as u64) { - XLOG_SIZE_OF_XLOG_LONG_PHD + let normal_shutdown = if let Ok(checkpoint_bytes) = + self.timeline.get_checkpoint(self.lsn, self.ctx).await + { + let checkpoint = + CheckPoint::decode(&checkpoint_bytes).context("deserialize checkpoint")?; + let checkpoint_end = + checkpoint.redo + ((XLOG_SIZE_OF_XLOG_RECORD + 8 + SIZEOF_CHECKPOINT) as u64); + let checkpoint_end_lsn = Lsn(checkpoint_end + + (if (XLOG_BLCKSZ as u64) - checkpoint.redo % (XLOG_BLCKSZ as u64) + < (SIZEOF_CHECKPOINT as u64) + { + if (checkpoint_end & ((WAL_SEGMENT_SIZE - 1) as u64)) < (XLOG_BLCKSZ as u64) { + XLOG_SIZE_OF_XLOG_LONG_PHD + } else { + XLOG_SIZE_OF_XLOG_SHORT_PHD + } } else { - XLOG_SIZE_OF_XLOG_SHORT_PHD - } - } else { - 0 - }) as u64); - let normal_shutdown = checkpoint_end_lsn == self.lsn; + 0 + }) as u64); + checkpoint_end_lsn == self.lsn + } else { + false + }; let lazy_slru_download = self.timeline.get_lazy_slru_download() && !self.full_backup;