From b2cb10590eb76ea74f80d3f4194bb629203f3f63 Mon Sep 17 00:00:00 2001 From: Vlad Lazar Date: Thu, 12 Sep 2024 20:00:06 +0100 Subject: [PATCH] fixup: deserialize shenanigans --- pageserver/src/tenant/storage_layer.rs | 26 ++++++++++---------------- pageserver/src/tenant/timeline.rs | 2 +- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/pageserver/src/tenant/storage_layer.rs b/pageserver/src/tenant/storage_layer.rs index a20013ce7d..54faf1e9bb 100644 --- a/pageserver/src/tenant/storage_layer.rs +++ b/pageserver/src/tenant/storage_layer.rs @@ -16,7 +16,7 @@ use crate::context::{AccessStatsBehavior, RequestContext}; use crate::repository::{Value, ValueBytes}; use crate::walrecord::NeonWalRecord; use bytes::Bytes; -use pageserver_api::key::Key; +use pageserver_api::key::{Key, DBDIR_KEY}; use pageserver_api::keyspace::{KeySpace, KeySpaceRandomAccum}; use std::cmp::Ordering; use std::collections::hash_map::Entry; @@ -102,6 +102,7 @@ impl VectoredValueReconstructState { } pub(crate) async fn convert( + _key: Key, from: VectoredValueReconstructState, ) -> Result { let mut to = ValueReconstructState::default(); @@ -110,23 +111,16 @@ pub(crate) async fn convert( match fut.await { Ok(res) => match res { Ok(bytes) => { - let is_image = ValueBytes::is_image(&bytes).map_err(|err| { - PageReconstructError::Other(anyhow::anyhow!( - "Failed to check image discriminator: {err:?}" - )) - })?; + let value = Value::des(&bytes) + .map_err(|err| PageReconstructError::Other(err.into()))?; - if is_image { - to.img = Some((lsn, bytes)); - } else { - let value = Value::des(&bytes) - .map_err(|err| PageReconstructError::Other(err.into()))?; - if let Value::WalRecord(rec) = value { + match value { + Value::WalRecord(rec) => { to.records.push((lsn, rec)); - } else { - return Err(PageReconstructError::Other(anyhow::anyhow!( - "Deserialized to image" - ))); + }, + Value::Image(img) => { + assert!(to.img.is_none()); + to.img = Some((lsn, img)); } } } diff --git a/pageserver/src/tenant/timeline.rs b/pageserver/src/tenant/timeline.rs index d3ca5411ae..077a485859 100644 --- a/pageserver/src/tenant/timeline.rs +++ b/pageserver/src/tenant/timeline.rs @@ -1145,7 +1145,7 @@ impl Timeline { ValueReconstructSituation::Complete )); - let converted = match convert(state).await { + let converted = match convert(key, state).await { Ok(ok) => ok, Err(err) => { return (key, Err(err));