From b1134f68578222d19aa432080a7247d30c3883ee Mon Sep 17 00:00:00 2001 From: Joonas Koivunen Date: Thu, 24 Aug 2023 11:52:47 +0300 Subject: [PATCH] layere: add new ctor --- pageserver/src/tenant/storage_layer.rs | 51 ++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/pageserver/src/tenant/storage_layer.rs b/pageserver/src/tenant/storage_layer.rs index f1d707643b..41f5c50bf8 100644 --- a/pageserver/src/tenant/storage_layer.rs +++ b/pageserver/src/tenant/storage_layer.rs @@ -43,6 +43,7 @@ pub use inmemory_layer::InMemoryLayer; pub use layer_desc::{PersistentLayerDesc, PersistentLayerKey}; use self::delta_layer::DeltaEntry; +use super::remote_timeline_client::index::LayerFileMetadata; use super::remote_timeline_client::RemoteTimelineClient; use super::Timeline; use utils::sync::heavier_once_cell; @@ -520,6 +521,56 @@ impl LayerE { } } + pub(crate) fn for_resident( + conf: &'static PageServerConf, + timeline: &Arc, + file_name: LayerFileName, + metadata: &LayerFileMetadata, + ) -> ResidentLayer { + let path = conf + .timeline_path(&timeline.tenant_id, &timeline.timeline_id) + .join(file_name.file_name()); + + let desc = PersistentLayerDesc::from_filename( + timeline.tenant_id, + timeline.timeline_id, + file_name, + metadata.file_size(), + ); + + let mut resident = None; + + let outer = Arc::new_cyclic(|owner| { + let inner = Arc::new(DownloadedLayer { + owner: owner.clone(), + kind: tokio::sync::OnceCell::default(), + }); + resident = Some(inner.clone()); + LayerE { + conf, + path, + desc, + timeline: Arc::downgrade(timeline), + have_remote_client: timeline.remote_client.is_some(), + access_stats: LayerAccessStats::empty_will_record_residence_event_later(), + wanted_garbage_collected: AtomicBool::new(false), + wanted_evicted: AtomicBool::new(false), + inner: heavier_once_cell::OnceCell::new(ResidentOrWantedEvicted::Resident(inner)), + version: AtomicUsize::new(0), + status: tokio::sync::broadcast::channel(1).0, + } + }); + + debug_assert!(outer.needs_download_blocking().unwrap().is_none()); + + let _downloaded = resident.expect("just initialized"); + + ResidentLayer { + _downloaded, + owner: outer, + } + } + pub(crate) fn for_written( conf: &'static PageServerConf, timeline: &Arc,