diff --git a/libs/pageserver_api/src/models.rs b/libs/pageserver_api/src/models.rs index c8db210089..33356f8ea5 100644 --- a/libs/pageserver_api/src/models.rs +++ b/libs/pageserver_api/src/models.rs @@ -518,6 +518,8 @@ pub enum HistoricLayerInfo { lsn_end: Lsn, remote: bool, access_stats: LayerAccessStats, + + remote_path: Option, }, Image { layer_file_name: String, @@ -526,6 +528,8 @@ pub enum HistoricLayerInfo { lsn_start: Lsn, remote: bool, access_stats: LayerAccessStats, + + remote_path: Option, }, } diff --git a/pageserver/src/tenant/storage_layer/layer.rs b/pageserver/src/tenant/storage_layer/layer.rs index 69a2893456..e4809fde5c 100644 --- a/pageserver/src/tenant/storage_layer/layer.rs +++ b/pageserver/src/tenant/storage_layer/layer.rs @@ -4,6 +4,7 @@ use pageserver_api::models::{ HistoricLayerInfo, LayerAccessKind, LayerResidenceEventReason, LayerResidenceStatus, }; use pageserver_api::shard::ShardIndex; +use remote_storage::RemotePath; use std::ops::Range; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::{Arc, Weak}; @@ -313,6 +314,12 @@ impl Layer { &self.0.path } + /// This can return None even though it should return Some in some edge cases. + #[allow(unused)] + pub(crate) fn remote_path(&self) -> Option { + self.0.remote_path() + } + pub(crate) fn metadata(&self) -> LayerFileMetadata { self.0.metadata() } @@ -970,6 +977,17 @@ impl LayerInner { } } + /// This can return None even though it should return Some in some edge cases. + fn remote_path(&self) -> Option { + let tl = self.timeline.upgrade()?; // TODO: should distinguish this case, but, accuracy doesn't matter for this field. + Some(crate::tenant::remote_timeline_client::remote_layer_path( + &tl.tenant_id, + &tl.timeline_id, + &self.desc.filename(), + self.generation, + )) + } + fn info(&self, reset: LayerAccessStatsReset) -> HistoricLayerInfo { let layer_file_name = self.desc.filename().file_name(); @@ -989,6 +1007,7 @@ impl LayerInner { lsn_end: lsn_range.end, remote, access_stats, + remote_path: self.remote_path().map(|p| p.into()), } } else { let lsn = self.desc.image_layer_lsn(); @@ -999,6 +1018,7 @@ impl LayerInner { lsn_start: lsn, remote, access_stats, + remote_path: self.remote_path().map(|p| p.into()), } } }