diff --git a/pageserver/src/basebackup.rs b/pageserver/src/basebackup.rs index 349075f2d3..cf0314dde2 100644 --- a/pageserver/src/basebackup.rs +++ b/pageserver/src/basebackup.rs @@ -7,6 +7,8 @@ use walkdir::WalkDir; use crate::ZTimelineId; +use zenith_utils::lsn::Lsn; + /// /// Send a tarball containing a snapshot of all non-relation files in the /// PostgreSQL data directory, at given LSN @@ -17,11 +19,11 @@ use crate::ZTimelineId; pub fn send_snapshot_tarball( write: &mut dyn Write, timelineid: ZTimelineId, - snapshotlsn: u64, + snapshotlsn: Lsn, ) -> Result<(), std::io::Error> { let mut ar = Builder::new(write); - let snappath = format!("timelines/{}/snapshots/{:016X}", timelineid, snapshotlsn); + let snappath = format!("timelines/{}/snapshots/{:016X}", timelineid, snapshotlsn.0); let walpath = format!("timelines/{}/wal", timelineid); debug!("sending tarball of snapshot in {}", snappath); diff --git a/pageserver/src/restore_local_repo.rs b/pageserver/src/restore_local_repo.rs index b77253ae50..0e0108eb33 100644 --- a/pageserver/src/restore_local_repo.rs +++ b/pageserver/src/restore_local_repo.rs @@ -84,18 +84,21 @@ pub fn restore_timeline( /// /// Find latest snapshot in a timeline's 'snapshots' directory /// -pub fn find_latest_snapshot(_conf: &PageServerConf, timeline: ZTimelineId) -> Result { +pub fn find_latest_snapshot(_conf: &PageServerConf, timeline: ZTimelineId) -> Result { let snapshotspath = format!("timelines/{}/snapshots", timeline); - let mut last_snapshot_lsn = 0; + let mut last_snapshot_lsn = Lsn(0); for direntry in fs::read_dir(&snapshotspath).unwrap() { - let filename = direntry.unwrap().file_name().to_str().unwrap().to_owned(); + let filename = direntry.unwrap().file_name(); - let lsn = u64::from_str_radix(&filename, 16)?; - last_snapshot_lsn = max(lsn, last_snapshot_lsn); + if let Ok(lsn) = Lsn::from_filename(&filename) { + last_snapshot_lsn = max(lsn, last_snapshot_lsn); + } else { + error!("unrecognized file in snapshots directory: {:?}", filename); + } } - if last_snapshot_lsn == 0 { + if last_snapshot_lsn == Lsn(0) { error!("could not find valid snapshot in {}", &snapshotspath); // TODO return error? }