From cffe724b01b540318719cda33169ee5a93ab2afc Mon Sep 17 00:00:00 2001 From: Vlad Lazar Date: Mon, 4 Mar 2024 16:04:08 +0000 Subject: [PATCH] test: get control values req --- libs/pageserver_api/src/models.rs | 28 +++++++++++++++++++++++ pageserver/client/src/page_service.rs | 2 ++ pageserver/src/page_service.rs | 32 +++++++++++++++++++++++++++ trace/src/main.rs | 1 + 4 files changed, 63 insertions(+) diff --git a/libs/pageserver_api/src/models.rs b/libs/pageserver_api/src/models.rs index 8ed27409e1..4cab976ebc 100644 --- a/libs/pageserver_api/src/models.rs +++ b/libs/pageserver_api/src/models.rs @@ -739,6 +739,7 @@ pub enum PagestreamFeMessage { DbSize(PagestreamDbSizeRequest), GetSlruSegment(PagestreamGetSlruSegmentRequest), GetVectoredPages(PagestreamGetVectoredPagesRequest), + GetControlFileValues(PagestreamGetControlFileValuesRequest), } // Wrapped in libpq CopyData @@ -751,6 +752,7 @@ pub enum PagestreamBeMessage { DbSize(PagestreamDbSizeResponse), GetSlruSegment(PagestreamGetSlruSegmentResponse), GetVectoredPages(PagestreamGetVectoredPagesResponse), + GetControlFileValues(PagestreamGetControlFileValuesResponse), } // Keep in sync with `pagestore_client.h` @@ -763,6 +765,7 @@ enum PagestreamBeMessageTag { DbSize = 104, GetSlruSegment = 105, GetVectoredPages = 106, + GetControlFileValues = 107, } impl TryFrom for PagestreamBeMessageTag { type Error = u8; @@ -826,6 +829,11 @@ pub struct PagestreamGetVectoredPagesRequest { pub count: u8, } +#[derive(Debug, PartialEq, Eq)] +pub struct PagestreamGetControlFileValuesRequest { + pub lsn: Lsn, +} + #[derive(Debug)] pub struct PagestreamExistsResponse { pub exists: bool, @@ -852,6 +860,9 @@ pub struct PagestreamGetVectoredPagesResponse { pub pages: Bytes, } +#[derive(Debug)] +pub struct PagestreamGetControlFileValuesResponse {} + #[derive(Debug)] pub struct PagestreamErrorResponse { pub message: String, @@ -935,6 +946,10 @@ impl PagestreamFeMessage { bytes.put_u32(req.blkno); bytes.put_u8(req.count); } + Self::GetControlFileValues(req) => { + bytes.put_u8(6); + bytes.put_u64(req.lsn.0); + } } bytes.into() @@ -1007,6 +1022,11 @@ impl PagestreamFeMessage { count: body.read_u8()?, }, )), + 6 => Ok(PagestreamFeMessage::GetControlFileValues( + PagestreamGetControlFileValuesRequest { + lsn: Lsn::from(body.read_u64::()?), + }, + )), _ => bail!("unknown smgr message tag: {:?}", msg_tag), } } @@ -1054,6 +1074,10 @@ impl PagestreamBeMessage { bytes.put_u8(resp.page_count); bytes.put(&resp.pages[..]); } + + Self::GetControlFileValues(_resp) => { + bytes.put_u8(Tag::GetControlFileValues as u8); + } } bytes.into() @@ -1111,6 +1135,9 @@ impl PagestreamBeMessage { pages: pages.into(), }) } + Tag::GetControlFileValues => { + Self::GetControlFileValues(PagestreamGetControlFileValuesResponse {}) + } }; let remaining = buf.into_inner(); if !remaining.is_empty() { @@ -1131,6 +1158,7 @@ impl PagestreamBeMessage { Self::DbSize(_) => "DbSize", Self::GetSlruSegment(_) => "GetSlruSegment", Self::GetVectoredPages(_) => "GetVectoredPages", + Self::GetControlFileValues(_) => "GetControlFileValues", } } } diff --git a/pageserver/client/src/page_service.rs b/pageserver/client/src/page_service.rs index 0d7f9a1440..6fcc05a292 100644 --- a/pageserver/client/src/page_service.rs +++ b/pageserver/client/src/page_service.rs @@ -159,6 +159,7 @@ impl PagestreamClient { | PagestreamBeMessage::Nblocks(_) | PagestreamBeMessage::DbSize(_) | PagestreamBeMessage::GetSlruSegment(_) + | PagestreamBeMessage::GetControlFileValues(_) | PagestreamBeMessage::GetVectoredPages(_) => { anyhow::bail!( "unexpected be message kind in response to getpage request: {}", @@ -190,6 +191,7 @@ impl PagestreamClient { | PagestreamBeMessage::Nblocks(_) | PagestreamBeMessage::DbSize(_) | PagestreamBeMessage::GetSlruSegment(_) + | PagestreamBeMessage::GetControlFileValues(_) | PagestreamBeMessage::GetPage(_) => { anyhow::bail!( "unexpected be message kind in response to getpage request: {}", diff --git a/pageserver/src/page_service.rs b/pageserver/src/page_service.rs index 6c383ee1c3..63240fa260 100644 --- a/pageserver/src/page_service.rs +++ b/pageserver/src/page_service.rs @@ -17,6 +17,11 @@ use futures::stream::FuturesUnordered; use futures::Stream; use futures::StreamExt; use pageserver_api::key::Key; +use pageserver_api::key::AUX_FILES_KEY; +use pageserver_api::key::CONTROLFILE_KEY; +use pageserver_api::keyspace::KeySpace; +use pageserver_api::models::PagestreamGetControlFileValuesRequest; +use pageserver_api::models::PagestreamGetControlFileValuesResponse; use pageserver_api::models::PagestreamGetVectoredPagesRequest; use pageserver_api::models::PagestreamGetVectoredPagesResponse; use pageserver_api::models::TenantState; @@ -690,6 +695,15 @@ impl PageServerHandler { span, ) } + PagestreamFeMessage::GetControlFileValues(req) => { + let span = tracing::info_span!("handle_get_control_values", req_lsn = %req.lsn); + ( + self.handle_get_control_values(tenant_id, timeline_id, &req, &ctx) + .instrument(span.clone()) + .await, + span, + ) + } }; match response { @@ -1184,6 +1198,24 @@ impl PageServerHandler { page, })) } + #[instrument(skip_all, fields(shard_id))] + async fn handle_get_control_values( + &mut self, + tenant_id: TenantId, + timeline_id: TimelineId, + req: &PagestreamGetControlFileValuesRequest, + ctx: &RequestContext, + ) -> Result { + let timeline = self.get_timeline_shard_zero(tenant_id, timeline_id).await?; + let keyspace = KeySpace { + ranges: vec![CONTROLFILE_KEY..AUX_FILES_KEY.next()], + }; + let _ = timeline.get_vectored(keyspace, req.lsn, ctx).await; + + Ok(PagestreamBeMessage::GetControlFileValues( + PagestreamGetControlFileValuesResponse {}, + )) + } #[instrument(skip_all, fields(shard_id))] async fn handle_get_pages_at_lsn_request( diff --git a/trace/src/main.rs b/trace/src/main.rs index b9acbda4c4..3370552e16 100644 --- a/trace/src/main.rs +++ b/trace/src/main.rs @@ -75,6 +75,7 @@ fn analyze_trace(mut reader: R) { prev = Some(req); } PagestreamFeMessage::GetVectoredPages(_) => {} + PagestreamFeMessage::GetControlFileValues(_) => {} PagestreamFeMessage::DbSize(_) => {} }; }