From 0e897e8bf2d40f0155b11cea3a262488c66af295 Mon Sep 17 00:00:00 2001 From: Yuchen Liang Date: Mon, 17 Jun 2024 14:01:08 -0400 Subject: [PATCH] expose duration as a param for ; catch invalid(gc-ed) lsn lease request Signed-off-by: Yuchen Liang --- pageserver/src/http/routes.rs | 3 ++- pageserver/src/page_service.rs | 3 ++- pageserver/src/tenant.rs | 3 ++- pageserver/src/tenant/timeline.rs | 8 +++++++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/pageserver/src/http/routes.rs b/pageserver/src/http/routes.rs index 657708c0d6..250939918b 100644 --- a/pageserver/src/http/routes.rs +++ b/pageserver/src/http/routes.rs @@ -21,6 +21,7 @@ use pageserver_api::models::IngestAuxFilesRequest; use pageserver_api::models::ListAuxFilesRequest; use pageserver_api::models::LocationConfig; use pageserver_api::models::LocationConfigListResponse; +use pageserver_api::models::LsnLease; use pageserver_api::models::ShardParameters; use pageserver_api::models::TenantDetails; use pageserver_api::models::TenantLocationConfigResponse; @@ -1730,7 +1731,7 @@ async fn lsn_lease_handler( active_timeline_of_active_tenant(&state.tenant_manager, tenant_shard_id, timeline_id) .await?; let result = timeline - .make_lsn_lease(lsn, &ctx) + .make_lsn_lease(lsn, LsnLease::DEFAULT_LENGTH, &ctx) .map_err(|e| ApiError::InternalServerError(e.context("lsn lease http handler")))?; json_response(StatusCode::OK, result) diff --git a/pageserver/src/page_service.rs b/pageserver/src/page_service.rs index ae389826d5..472eec7fad 100644 --- a/pageserver/src/page_service.rs +++ b/pageserver/src/page_service.rs @@ -9,6 +9,7 @@ use futures::stream::FuturesUnordered; use futures::Stream; use futures::StreamExt; use pageserver_api::key::Key; +use pageserver_api::models::LsnLease; use pageserver_api::models::TenantState; use pageserver_api::models::{ PagestreamBeMessage, PagestreamDbSizeRequest, PagestreamDbSizeResponse, @@ -935,7 +936,7 @@ impl PageServerHandler { let timeline = self .get_active_tenant_timeline(tenant_shard_id.tenant_id, timeline_id, shard_selector) .await?; - let lease = timeline.make_lsn_lease(lsn, ctx)?; + let lease = timeline.make_lsn_lease(lsn, LsnLease::DEFAULT_LENGTH, ctx)?; let valid_until = lease .valid_until .duration_since(SystemTime::UNIX_EPOCH) diff --git a/pageserver/src/tenant.rs b/pageserver/src/tenant.rs index 2f0e1c8b58..6e57bde3df 100644 --- a/pageserver/src/tenant.rs +++ b/pageserver/src/tenant.rs @@ -4050,6 +4050,7 @@ mod tests { use bytes::{Bytes, BytesMut}; use hex_literal::hex; use itertools::Itertools; + use models::LsnLease; use pageserver_api::key::{AUX_FILES_KEY, AUX_KEY_PREFIX, NON_INHERITED_RANGE}; use pageserver_api::keyspace::KeySpace; use pageserver_api::models::{CompactionAlgorithm, CompactionAlgorithmSettings}; @@ -4293,7 +4294,7 @@ mod tests { let leased_lsns = [0x30, 0x50, 0x70]; let _: anyhow::Result<_> = leased_lsns.iter().try_for_each(|n| { - let _ = timeline.make_lsn_lease(Lsn(*n), &ctx)?; + let _ = timeline.make_lsn_lease(Lsn(*n), LsnLease::DEFAULT_LENGTH, &ctx)?; Ok(()) }); diff --git a/pageserver/src/tenant/timeline.rs b/pageserver/src/tenant/timeline.rs index f7572e2335..3bf7627800 100644 --- a/pageserver/src/tenant/timeline.rs +++ b/pageserver/src/tenant/timeline.rs @@ -1565,10 +1565,16 @@ impl Timeline { pub(crate) fn make_lsn_lease( &self, lsn: Lsn, + length: Duration, _ctx: &RequestContext, ) -> anyhow::Result { + let latest_gc_cutoff_lsn = self.get_latest_gc_cutoff_lsn(); + if lsn < *latest_gc_cutoff_lsn { + bail!("tried to request a page version that was garbage collected. requested at {} gc cutoff {}", lsn, *latest_gc_cutoff_lsn); + } + let mut lease = LsnLease { - valid_until: SystemTime::now() + LsnLease::DEFAULT_LENGTH, + valid_until: SystemTime::now() + length, }; {