diff --git a/control_plane/src/storage.rs b/control_plane/src/storage.rs index 86c0d50327..b4608210d8 100644 --- a/control_plane/src/storage.rs +++ b/control_plane/src/storage.rs @@ -41,12 +41,9 @@ impl TestStorageControlPlane { }); pserver.init(); - if pgdata_base_path.is_empty() - { + if pgdata_base_path.is_empty() { pserver.start().unwrap(); - } - else - { + } else { pserver.start_fromdatadir(pgdata_base_path).unwrap(); } diff --git a/pageserver/src/bin/pageserver.rs b/pageserver/src/bin/pageserver.rs index f151e3773a..353a667827 100644 --- a/pageserver/src/bin/pageserver.rs +++ b/pageserver/src/bin/pageserver.rs @@ -165,7 +165,6 @@ fn start_pageserver(conf: PageServerConf) -> Result<(), io::Error> { restore_datadir::restore_main(&conf); } - // Create directory for wal-redo datadirs match fs::create_dir(conf.data_dir.join("wal-redo")) { Ok(_) => {} diff --git a/pageserver/src/lib.rs b/pageserver/src/lib.rs index 8614e0b5ca..9333fdae29 100644 --- a/pageserver/src/lib.rs +++ b/pageserver/src/lib.rs @@ -3,6 +3,7 @@ use std::path::PathBuf; pub mod page_cache; pub mod page_service; +pub mod pg_constants; pub mod restore_datadir; pub mod restore_s3; pub mod tui; diff --git a/pageserver/src/pg_constants.rs b/pageserver/src/pg_constants.rs new file mode 100644 index 0000000000..b59ddb5396 --- /dev/null +++ b/pageserver/src/pg_constants.rs @@ -0,0 +1,11 @@ +// From pg_tablespace_d.h +// +pub const DEFAULTTABLESPACE_OID: u32 = 1663; +pub const GLOBALTABLESPACE_OID: u32 = 1664; +//Special values for non-rel files' tags +//TODO maybe use enum? +pub const PG_CONTROLFILE_FORKNUM: u32 = 42; +pub const PG_FILENODEMAP_FORKNUM: u32 = 43; +pub const PG_XACT_FORKNUM: u32 = 44; +pub const PG_MXACT_OFFSETS_FORKNUM: u32 = 45; +pub const PG_MXACT_MEMBERS_FORKNUM: u32 = 46; diff --git a/pageserver/src/restore_datadir.rs b/pageserver/src/restore_datadir.rs index 7c038493b2..98a9de56f2 100644 --- a/pageserver/src/restore_datadir.rs +++ b/pageserver/src/restore_datadir.rs @@ -17,7 +17,7 @@ use tokio::runtime; use futures::future; -use crate::{page_cache, PageServerConf}; +use crate::{page_cache, pg_constants, PageServerConf}; use std::fs; use walkdir::WalkDir; @@ -90,12 +90,6 @@ async fn restore_chunk(conf: &PageServerConf) -> Result<(), FilePathError> { Ok(()) } -// From pg_tablespace_d.h -// -// FIXME: we'll probably need these elsewhere too, move to some common location -const DEFAULTTABLESPACE_OID: u32 = 1663; -const GLOBALTABLESPACE_OID: u32 = 1664; - #[derive(Debug)] struct FilePathError { msg: String, @@ -196,10 +190,32 @@ fn parse_rel_file_path(path: &str) -> Result. */ if let Some(fname) = path.strip_prefix("global/") { + if fname.contains("pg_control") { + return Ok(ParsedBaseImageFileName { + spcnode: pg_constants::GLOBALTABLESPACE_OID, + dbnode: 0, + relnode: 0, + forknum: pg_constants::PG_CONTROLFILE_FORKNUM, + segno: 0, + lsn: 0, + }); + } + + if fname.contains("pg_filenode") { + return Ok(ParsedBaseImageFileName { + spcnode: pg_constants::GLOBALTABLESPACE_OID, + dbnode: 0, + relnode: 0, + forknum: pg_constants::PG_FILENODEMAP_FORKNUM, + segno: 0, + lsn: 0, + }); + } + let (relnode, forknum, segno, lsn) = parse_filename(fname)?; return Ok(ParsedBaseImageFileName { - spcnode: GLOBALTABLESPACE_OID, + spcnode: pg_constants::GLOBALTABLESPACE_OID, dbnode: 0, relnode, forknum, @@ -219,16 +235,54 @@ fn parse_rel_file_path(path: &str) -> Result= 8192 { let tag = page_cache::BufferTag { spcnode: parsed.spcnode, @@ -265,6 +333,7 @@ async fn slurp_base_file( pcache.put_page_image(tag, parsed.lsn, bytes.copy_to_bytes(8192)); + pcache.relsize_inc(&reltag, Some(blknum)); blknum += 1; } }