diff --git a/pageserver/src/layered_repository.rs b/pageserver/src/layered_repository.rs index 2e0813eb44..1fae0ba10b 100644 --- a/pageserver/src/layered_repository.rs +++ b/pageserver/src/layered_repository.rs @@ -11,7 +11,7 @@ //! parent timeline, and the last LSN that has been written to disk. //! -use anyhow::{anyhow, bail, Context, Result}; +use anyhow::{bail, Context, Result}; use bookfile::Book; use bytes::Bytes; use lazy_static::lazy_static; @@ -785,47 +785,39 @@ impl Timeline for LayeredTimeline { debug!("put_truncation: {} to {} blocks at {}", rel, relsize, lsn); - let oldsize = self - .get_relish_size(rel, self.get_last_record_lsn())? - .ok_or_else(|| { - anyhow!( - "attempted to truncate non-existent relish {} at {}", + if let Some(oldsize) = self.get_relish_size(rel, self.get_last_record_lsn())? { + if oldsize <= relsize { + return Ok(()); + } + let old_last_seg = (oldsize - 1) / RELISH_SEG_SIZE; + + let last_remain_seg = if relsize == 0 { + 0 + } else { + (relsize - 1) / RELISH_SEG_SIZE + }; + + // Drop segments beyond the last remaining segment. + for remove_segno in (last_remain_seg + 1)..=old_last_seg { + let seg = SegmentTag { rel, - lsn - ) - })?; + segno: remove_segno, + }; + self.perform_write_op(seg, lsn, |layer| layer.drop_segment(lsn))?; + } - if oldsize <= relsize { - return Ok(()); + // Truncate the last remaining segment to the specified size + if relsize == 0 || relsize % RELISH_SEG_SIZE != 0 { + let seg = SegmentTag { + rel, + segno: last_remain_seg, + }; + self.perform_write_op(seg, lsn, |layer| { + layer.put_truncation(lsn, relsize % RELISH_SEG_SIZE) + })?; + } + self.decrease_current_logical_size((oldsize - relsize) * BLCKSZ as u32); } - let old_last_seg = (oldsize - 1) / RELISH_SEG_SIZE; - - let last_remain_seg = if relsize == 0 { - 0 - } else { - (relsize - 1) / RELISH_SEG_SIZE - }; - - // Drop segments beyond the last remaining segment. - for remove_segno in (last_remain_seg + 1)..=old_last_seg { - let seg = SegmentTag { - rel, - segno: remove_segno, - }; - self.perform_write_op(seg, lsn, |layer| layer.drop_segment(lsn))?; - } - - // Truncate the last remaining segment to the specified size - if relsize == 0 || relsize % RELISH_SEG_SIZE != 0 { - let seg = SegmentTag { - rel, - segno: last_remain_seg, - }; - self.perform_write_op(seg, lsn, |layer| { - layer.put_truncation(lsn, relsize % RELISH_SEG_SIZE) - })?; - } - self.decrease_current_logical_size((oldsize - relsize) * BLCKSZ as u32); Ok(()) } diff --git a/vendor/postgres b/vendor/postgres index 9374fe0963..ef039e4222 160000 --- a/vendor/postgres +++ b/vendor/postgres @@ -1 +1 @@ -Subproject commit 9374fe0963907770132e99a57dfe24497f28392f +Subproject commit ef039e422200f84064621b04eaab692ae940c6ca