From f4039c65a99dc18149d62beab1bbfc4fdb96af7a Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Tue, 31 Jan 2023 15:13:40 +0200 Subject: [PATCH] (De)Serialize Lsn and Key in LayerInfo in human-readable format --- libs/pageserver_api/src/models.rs | 34 +++++++++++++++++++++++++------ pageserver/src/keyspace.rs | 4 ++-- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/libs/pageserver_api/src/models.rs b/libs/pageserver_api/src/models.rs index b4f08f2923..a0deba2eaf 100644 --- a/libs/pageserver_api/src/models.rs +++ b/libs/pageserver_api/src/models.rs @@ -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, } +#[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) -> u32 { } } -pub fn singleton_range(key: Key) -> Range { - 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::from_hex(s) + } +} + impl Key { pub const MIN: Key = Key { field1: u8::MIN, diff --git a/pageserver/src/keyspace.rs b/pageserver/src/keyspace.rs index 2d68b48d15..2d402bf7cd 100644 --- a/pageserver/src/keyspace.rs +++ b/pageserver/src/keyspace.rs @@ -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) {