From 72430eb539fa07561d4869b25511ba1ae0d203ee Mon Sep 17 00:00:00 2001 From: Joonas Koivunen Date: Thu, 24 Aug 2023 14:29:55 +0300 Subject: [PATCH] layere: remove impossible error case --- pageserver/src/tenant/storage_layer.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pageserver/src/tenant/storage_layer.rs b/pageserver/src/tenant/storage_layer.rs index 451399d6e5..f207365254 100644 --- a/pageserver/src/tenant/storage_layer.rs +++ b/pageserver/src/tenant/storage_layer.rs @@ -714,7 +714,7 @@ impl LayerE { } layer - .get_value_reconstruct_data(key, lsn_range, reconstruct_data) + .get_value_reconstruct_data(key, lsn_range, reconstruct_data, self) .await } @@ -1245,7 +1245,7 @@ impl ResidentLayer { ) -> anyhow::Result>> { use LayerKind::*; - match self.downloaded.get().await? { + match self.downloaded.get(&self.owner).await? { Delta(d) => { self.owner .access_stats @@ -1319,12 +1319,11 @@ impl Drop for DownloadedLayer { } impl DownloadedLayer { - async fn get(&self) -> anyhow::Result<&LayerKind> { + async fn get(&self, owner: &LayerE) -> anyhow::Result<&LayerKind> { + // the owner is required so that we don't have to upgrade the self.owner, which will only + // be used on drop. this way, initializing a DownloadedLayer without an owner is statically + // impossible, so we can just not worry about it. let init = || async { - let Some(owner) = self.owner.upgrade() else { - anyhow::bail!("Cannot init, the layer has already been dropped"); - }; - // there is nothing async here, but it should be async if owner.desc.is_delta { let summary = Some(delta_layer::Summary::expected( @@ -1359,10 +1358,11 @@ impl DownloadedLayer { key: Key, lsn_range: Range, reconstruct_data: &mut ValueReconstructState, + owner: &LayerE, ) -> anyhow::Result { use LayerKind::*; - match self.get().await? { + match self.get(owner).await? { Delta(d) => { d.get_value_reconstruct_data(key, lsn_range, reconstruct_data) .await