mirror of
https://github.com/neondatabase/neon.git
synced 2026-10-29 14:57:25 +00:00
Implement the timeline info using regular API
This commit is contained in:
@@ -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<L>` ?
|
||||
// historic_layers.insert(historic_layer.info());
|
||||
}
|
||||
|
||||
LayerMapInfo {
|
||||
in_memory_layers,
|
||||
historic_layers,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<u64>;
|
||||
|
||||
fn info(&self) -> HistoricLayerInfo;
|
||||
}
|
||||
|
||||
pub fn downcast_remote_layer(
|
||||
|
||||
@@ -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<u64> {
|
||||
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 {
|
||||
|
||||
@@ -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<u64> {
|
||||
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 {
|
||||
|
||||
@@ -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<u64> {
|
||||
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 {
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user