(De)Serialize Lsn and Key in LayerInfo in human-readable format

This commit is contained in:
Kirill Bulatov
2023-01-31 15:13:40 +02:00
parent eab1f375e6
commit f4039c65a9
2 changed files with 30 additions and 8 deletions

View File

@@ -3,6 +3,7 @@ use std::{
fmt,
num::{NonZeroU64, NonZeroUsize},
ops::Range,
str::FromStr,
};
use byteorder::{BigEndian, ByteOrder, ReadBytesExt, BE};
@@ -237,28 +238,45 @@ pub struct LayerMapInfo {
pub historic_layers: BTreeSet<HistoricLayerInfo>,
}
#[serde_as]
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Copy, Clone, Serialize, Deserialize)]
#[serde(tag = "kind")]
pub enum InMemoryLayerInfo {
Open { lsn_start: Lsn },
Frozen { lsn_start: Lsn, lsn_end: Lsn },
Open {
#[serde_as(as = "DisplayFromStr")]
lsn_start: Lsn,
},
Frozen {
#[serde_as(as = "DisplayFromStr")]
lsn_start: Lsn,
#[serde_as(as = "DisplayFromStr")]
lsn_end: Lsn,
},
}
#[serde_as]
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Serialize, Deserialize)]
#[serde(tag = "kind")]
pub enum HistoricLayerInfo {
Delta {
layer_file_name: String,
#[serde_as(as = "DisplayFromStr")]
key_start: Key,
#[serde_as(as = "DisplayFromStr")]
key_end: Key,
#[serde_as(as = "DisplayFromStr")]
lsn_start: Lsn,
#[serde_as(as = "DisplayFromStr")]
lsn_end: Lsn,
remote: bool,
},
Image {
layer_file_name: String,
#[serde_as(as = "DisplayFromStr")]
key_start: Key,
#[serde_as(as = "DisplayFromStr")]
key_end: Key,
#[serde_as(as = "DisplayFromStr")]
lsn_start: Lsn,
remote: bool,
},
@@ -625,10 +643,6 @@ pub fn key_range_size(key_range: &Range<Key>) -> u32 {
}
}
pub fn singleton_range(key: Key) -> Range<Key> {
key..key.next()
}
impl fmt::Display for Key {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
@@ -639,6 +653,14 @@ impl fmt::Display for Key {
}
}
impl FromStr for Key {
type Err = anyhow::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Self::from_hex(s)
}
}
impl Key {
pub const MIN: Key = Key {
field1: u8::MIN,

View File

@@ -1,4 +1,4 @@
use pageserver_api::models::{key_range_size, singleton_range, Key};
use pageserver_api::models::{key_range_size, Key};
use postgres_ffi::BLCKSZ;
use std::ops::Range;
@@ -102,7 +102,7 @@ impl KeySpaceAccum {
}
pub fn add_key(&mut self, key: Key) {
self.add_range(singleton_range(key))
self.add_range(key..key.next())
}
pub fn add_range(&mut self, range: Range<Key>) {