diff --git a/pageserver/src/tenant/layer_map.rs b/pageserver/src/tenant/layer_map.rs index de42fcec0b..ed1a32c8fd 100644 --- a/pageserver/src/tenant/layer_map.rs +++ b/pageserver/src/tenant/layer_map.rs @@ -52,13 +52,12 @@ use crate::repository::Key; use crate::tenant::storage_layer::InMemoryLayer; use crate::tenant::storage_layer::Layer; use anyhow::Result; -use std::collections::{BTreeSet, VecDeque}; +use std::collections::VecDeque; use std::ops::Range; use std::sync::Arc; use utils::lsn::Lsn; use historic_layer_coverage::BufferedHistoricLayerCoverage; -use pageserver_api::models::LayerMapInfo; use super::storage_layer::range_eq; @@ -675,26 +674,4 @@ where println!("End dump LayerMap"); Ok(()) } - - // TODO kb comments + swagger schema - pub fn info(&self) -> LayerMapInfo { - let mut in_memory_layers = BTreeSet::new(); - if let Some(open_layer) = &self.open_layer { - in_memory_layers.insert(open_layer.info()); - } - for frozen_layer in &self.frozen_layers { - in_memory_layers.insert(frozen_layer.info()); - } - - let mut historic_layers = BTreeSet::new(); - for historic_layer in self.iter_historic_layers() { - // TODO kb what to use here for `historic_layer: Arc` ? - // historic_layers.insert(historic_layer.info()); - } - - LayerMapInfo { - in_memory_layers, - historic_layers, - } - } } diff --git a/pageserver/src/tenant/storage_layer.rs b/pageserver/src/tenant/storage_layer.rs index 2149fc7eb7..e20263ee0a 100644 --- a/pageserver/src/tenant/storage_layer.rs +++ b/pageserver/src/tenant/storage_layer.rs @@ -10,6 +10,7 @@ use crate::repository::{Key, Value}; use crate::walrecord::NeonWalRecord; use anyhow::Result; use bytes::Bytes; +use pageserver_api::models::HistoricLayerInfo; use std::ops::Range; use std::path::PathBuf; use std::sync::Arc; @@ -185,6 +186,8 @@ pub trait PersistentLayer: Layer { /// Should not change over the lifetime of the layer object because /// current_physical_size is computed as the som of this value. fn file_size(&self) -> Option; + + fn info(&self) -> HistoricLayerInfo; } pub fn downcast_remote_layer( diff --git a/pageserver/src/tenant/storage_layer/delta_layer.rs b/pageserver/src/tenant/storage_layer/delta_layer.rs index 302ba2dc78..54f627d4c5 100644 --- a/pageserver/src/tenant/storage_layer/delta_layer.rs +++ b/pageserver/src/tenant/storage_layer/delta_layer.rs @@ -36,6 +36,7 @@ use crate::virtual_file::VirtualFile; use crate::{walrecord, TEMP_FILE_SUFFIX}; use crate::{DELTA_FILE_MAGIC, STORAGE_FORMAT_VERSION}; use anyhow::{bail, ensure, Context, Result}; +use pageserver_api::models::HistoricLayerInfo; use rand::{distributions::Alphanumeric, Rng}; use serde::{Deserialize, Serialize}; use std::fs::{self, File}; @@ -415,6 +416,21 @@ impl PersistentLayer for DeltaLayer { fn file_size(&self) -> Option { Some(self.file_size) } + + fn info(&self) -> HistoricLayerInfo { + let layer_file_name = self.filename().file_name(); + let key_range = self.get_key_range(); + let lsn_range = self.get_lsn_range(); + + HistoricLayerInfo::Delta { + layer_file_name, + key_start: key_range.start.to_string(), + key_end: key_range.end.to_string(), + lsn_start: lsn_range.start, + lsn_end: lsn_range.end, + remote: false, + } + } } impl DeltaLayer { diff --git a/pageserver/src/tenant/storage_layer/image_layer.rs b/pageserver/src/tenant/storage_layer/image_layer.rs index 9a26fce73b..52748a77de 100644 --- a/pageserver/src/tenant/storage_layer/image_layer.rs +++ b/pageserver/src/tenant/storage_layer/image_layer.rs @@ -33,6 +33,7 @@ use crate::{IMAGE_FILE_MAGIC, STORAGE_FORMAT_VERSION, TEMP_FILE_SUFFIX}; use anyhow::{bail, ensure, Context, Result}; use bytes::Bytes; use hex; +use pageserver_api::models::HistoricLayerInfo; use rand::{distributions::Alphanumeric, Rng}; use serde::{Deserialize, Serialize}; use std::fs::{self, File}; @@ -233,6 +234,20 @@ impl PersistentLayer for ImageLayer { fn file_size(&self) -> Option { Some(self.file_size) } + + fn info(&self) -> HistoricLayerInfo { + let layer_file_name = self.filename().file_name(); + let key_range = self.get_key_range(); + let lsn_range = self.get_lsn_range(); + + HistoricLayerInfo::Image { + layer_file_name, + key_start: key_range.start.to_string(), + key_end: key_range.end.to_string(), + lsn_start: lsn_range.start, + remote: false, + } + } } impl ImageLayer { diff --git a/pageserver/src/tenant/storage_layer/remote_layer.rs b/pageserver/src/tenant/storage_layer/remote_layer.rs index 33474bb4a2..90eff9ef9c 100644 --- a/pageserver/src/tenant/storage_layer/remote_layer.rs +++ b/pageserver/src/tenant/storage_layer/remote_layer.rs @@ -6,6 +6,7 @@ use crate::repository::Key; use crate::tenant::remote_timeline_client::index::LayerFileMetadata; use crate::tenant::storage_layer::{Layer, ValueReconstructResult, ValueReconstructState}; use anyhow::{bail, Result}; +use pageserver_api::models::HistoricLayerInfo; use std::ops::Range; use std::path::PathBuf; use std::sync::Arc; @@ -134,6 +135,31 @@ impl PersistentLayer for RemoteLayer { fn file_size(&self) -> Option { self.layer_metadata.file_size() } + + fn info(&self) -> HistoricLayerInfo { + let layer_file_name = self.filename().file_name(); + let key_range = self.get_key_range(); + let lsn_range = self.get_lsn_range(); + + if self.is_delta { + HistoricLayerInfo::Delta { + layer_file_name, + key_start: key_range.start.to_string(), + key_end: key_range.end.to_string(), + lsn_start: lsn_range.start, + lsn_end: lsn_range.end, + remote: true, + } + } else { + HistoricLayerInfo::Image { + layer_file_name, + key_start: key_range.start.to_string(), + key_end: key_range.end.to_string(), + lsn_start: lsn_range.start, + remote: true, + } + } + } } impl RemoteLayer { diff --git a/pageserver/src/tenant/timeline.rs b/pageserver/src/tenant/timeline.rs index e96daf1bb8..61697e1837 100644 --- a/pageserver/src/tenant/timeline.rs +++ b/pageserver/src/tenant/timeline.rs @@ -17,7 +17,7 @@ use tokio_util::sync::CancellationToken; use tracing::*; use std::cmp::{max, min, Ordering}; -use std::collections::HashMap; +use std::collections::{BTreeSet, HashMap}; use std::fs; use std::ops::{Deref, Range}; use std::path::{Path, PathBuf}; @@ -820,7 +820,24 @@ impl Timeline { } pub fn layer_map_info(&self) -> LayerMapInfo { - self.layers.read().unwrap().info() + let mut in_memory_layers = BTreeSet::new(); + let layer_map = self.layers.read().unwrap(); + if let Some(open_layer) = &layer_map.open_layer { + in_memory_layers.insert(open_layer.info()); + } + for frozen_layer in &layer_map.frozen_layers { + in_memory_layers.insert(frozen_layer.info()); + } + + let mut historic_layers = BTreeSet::new(); + for historic_layer in layer_map.iter_historic_layers() { + historic_layers.insert(historic_layer.info()); + } + + LayerMapInfo { + in_memory_layers, + historic_layers, + } } }