diff --git a/pageserver/src/pg_import.rs b/pageserver/src/pg_import.rs index f5c31d34d0..b8f9f357e6 100644 --- a/pageserver/src/pg_import.rs +++ b/pageserver/src/pg_import.rs @@ -64,9 +64,9 @@ impl PgImportEnv { } pub async fn import_datadir(&mut self, pgdata_path: &Utf8PathBuf) -> anyhow::Result<()> { - - let pgdata_lsn = import_datadir::get_lsn_from_controlfile(&pgdata_path)?.align(); - + // Read control file + let control_file = self.import_controlfile(pgdata_path).await?; + let pgdata_lsn = Lsn(control_file.checkPoint).align(); let timeline_path = self.conf.timeline_path(&self.tsi, &self.tli); println!("Importing {pgdata_path} to {timeline_path} as lsn {pgdata_lsn}..."); @@ -97,7 +97,7 @@ impl PgImportEnv { // should we anything about the wal? // Create index_part.json file - self.create_index_part(&[layerdesc]).await?; + self.create_index_part(&[layerdesc], &control_file).await?; Ok(()) } @@ -142,6 +142,13 @@ impl PgImportEnv { Ok(()) } + async fn import_controlfile(&mut self, pgdata_path: &Utf8Path) -> anyhow::Result { + let controlfile_path = pgdata_path.join("global").join("pg_control"); + let controlfile_buf = std::fs::read(&controlfile_path) + .with_context(|| format!("reading controlfile: {controlfile_path}"))?; + ControlFileData::decode(&controlfile_buf) + } + async fn import_db( &mut self, layer_writer: &mut ImageLayerWriter, @@ -204,9 +211,17 @@ impl PgImportEnv { Ok(()) } - async fn create_index_part(&mut self, layers: &[PersistentLayerDesc]) -> anyhow::Result<()> { + async fn create_index_part(&mut self, layers: &[PersistentLayerDesc], control_file: &ControlFileData) -> anyhow::Result<()> { let dstdir = &self.conf.workdir; + let pg_version = match control_file.catalog_version_no { + // thesea are from catversion.h + 202107181 => 14, + 202209061 => 15, + 202307071 => 16, + catversion => { bail!("unrecognized catalog version {catversion}")}, + }; + let metadata = TimelineMetadata::new( self.pgdata_lsn, None, // prev_record_lsn @@ -214,7 +229,7 @@ impl PgImportEnv { Lsn(0), self.pgdata_lsn, // latest_gc_cutoff_lsn self.pgdata_lsn, // initdb_lsn - 16, // FIXME: Postgres version. Read from control file + pg_version, ); let generation = Generation::none(); let mut index_part = IndexPart::empty(metadata);