Implement the timeline info using regular API

This commit is contained in:
Kirill Bulatov
2023-01-30 13:41:58 +02:00
parent f3096d85e0
commit aae4382613
6 changed files with 80 additions and 26 deletions
+1 -24
View File
@@ -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,
}
}
}
+3
View File
@@ -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 {
+19 -2
View File
@@ -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,
}
}
}