diff --git a/pageserver/src/tenant/storage_layer/inmemory_layer.rs b/pageserver/src/tenant/storage_layer/inmemory_layer.rs index 43942ba2db..8d37a12211 100644 --- a/pageserver/src/tenant/storage_layer/inmemory_layer.rs +++ b/pageserver/src/tenant/storage_layer/inmemory_layer.rs @@ -11,9 +11,10 @@ use crate::tenant::block_io::BlockReader; use crate::tenant::ephemeral_file::EphemeralFile; use crate::tenant::storage_layer::ValueReconstructResult; use crate::tenant::timeline::GetVectoredError; -use crate::tenant::{PageReconstructError, Timeline}; +use crate::tenant::{AttachedTenantConf, PageReconstructError, Timeline}; use crate::{page_cache, walrecord}; use anyhow::{anyhow, ensure, Result}; +use arc_swap::ArcSwap; use pageserver_api::keyspace::KeySpace; use pageserver_api::models::InMemoryLayerInfo; use pageserver_api::shard::TenantShardId; @@ -40,6 +41,7 @@ use super::{ pub(crate) struct InMemoryLayerFileId(page_cache::FileId); pub struct InMemoryLayer { + tenant_conf: Arc>, conf: &'static PageServerConf, tenant_shard_id: TenantShardId, timeline_id: TimelineId, @@ -444,6 +446,7 @@ impl InMemoryLayer { /// Create a new, empty, in-memory layer pub async fn create( conf: &'static PageServerConf, + tenant_conf: Arc>, timeline_id: TimelineId, tenant_shard_id: TenantShardId, start_lsn: Lsn, diff --git a/pageserver/src/tenant/timeline.rs b/pageserver/src/tenant/timeline.rs index c5eda44b7d..ca9801f4a7 100644 --- a/pageserver/src/tenant/timeline.rs +++ b/pageserver/src/tenant/timeline.rs @@ -1790,7 +1790,7 @@ impl Timeline { generation, shard_identity, pg_version, - layers: Default::default(), + layers: LayerManager::new(Arc::clone(&tenant_conf)), walredo_mgr, walreceiver: Mutex::new(None), diff --git a/pageserver/src/tenant/timeline/layer_manager.rs b/pageserver/src/tenant/timeline/layer_manager.rs index d54dc1642c..da5dbbcb4d 100644 --- a/pageserver/src/tenant/timeline/layer_manager.rs +++ b/pageserver/src/tenant/timeline/layer_manager.rs @@ -1,4 +1,5 @@ use anyhow::{bail, ensure, Context, Result}; +use arc_swap::ArcSwap; use pageserver_api::shard::TenantShardId; use std::{collections::HashMap, sync::Arc}; use tracing::trace; @@ -11,22 +12,29 @@ use crate::{ config::PageServerConf, metrics::TimelineMetrics, tenant::{ - layer_map::{BatchedUpdates, LayerMap}, - storage_layer::{ + layer_map::{BatchedUpdates, LayerMap}, storage_layer::{ AsLayerDesc, InMemoryLayer, Layer, PersistentLayerDesc, PersistentLayerKey, ResidentLayer, - }, + }, AttachedTenantConf }, }; /// Provides semantic APIs to manipulate the layer map. -#[derive(Default)] pub(crate) struct LayerManager { layer_map: LayerMap, layer_fmgr: LayerFileManager, + tenant_conf: Arc> } impl LayerManager { + pub(crate) fn new(tenant_conf: Arc>) -> Self { + Self { + layer_map: LayerMap::default(), + layer_fmgr: LayerFileManager::default(), + tenant_conf + } + } + pub(crate) fn get_from_desc(&self, desc: &PersistentLayerDesc) -> Layer { self.layer_fmgr.get_from_desc(desc) } @@ -105,7 +113,7 @@ impl LayerManager { ); let new_layer = - InMemoryLayer::create(conf, timeline_id, tenant_shard_id, start_lsn).await?; + InMemoryLayer::create(conf, Arc::clone(&self.tenant_conf), timeline_id, tenant_shard_id, start_lsn).await?; let layer = Arc::new(new_layer); self.layer_map.open_layer = Some(layer.clone());