From 9ee75ceee6e007d388e042e636950b9be0ca014a Mon Sep 17 00:00:00 2001 From: Christian Schwarz Date: Mon, 2 Jun 2025 11:26:14 +0200 Subject: [PATCH] merge fixups; storcon and safekeeper compile again --- safekeeper/src/http/routes.rs | 61 ++++--------------------- safekeeper/src/timelines_global_map.rs | 26 +++++------ safekeeper/src/wal_advertiser/advmap.rs | 11 ++--- 3 files changed, 24 insertions(+), 74 deletions(-) diff --git a/safekeeper/src/http/routes.rs b/safekeeper/src/http/routes.rs index 1e76a0a3cd..68f225829f 100644 --- a/safekeeper/src/http/routes.rs +++ b/safekeeper/src/http/routes.rs @@ -17,10 +17,9 @@ use hyper::{Body, Request, Response, StatusCode}; use pem::Pem; use postgres_ffi::WAL_SEGMENT_SIZE; use safekeeper_api::models::{ - AcceptorStateStatus, PullTimelineRequest, PutTenantPageserverLocationRequest, SafekeeperStatus, - SkTimelineInfo, TenantDeleteResult, TenantShardPageserverLocation, TermSwitchApiEntry, - TimelineCopyRequest, TimelineCreateRequest, TimelineDeleteResult, TimelineStatus, - TimelineTermBumpRequest, + AcceptorStateStatus, PullTimelineRequest, SafekeeperStatus, SkTimelineInfo, TenantDeleteResult, + TermSwitchApiEntry, TimelineCopyRequest, TimelineCreateRequest, TimelineDeleteResult, + TimelineStatus, TimelineTermBumpRequest, }; use safekeeper_api::{ServerInfo, membership, models}; use storage_broker::proto::{SafekeeperTimelineInfo, TenantTimelineId as ProtoTenantTimelineId}; @@ -37,7 +36,6 @@ use utils::shard::TenantShardId; use crate::debug_dump::TimelineDigestRequest; use crate::safekeeper::TermLsn; use crate::timelines_global_map::DeleteOrExclude; -use crate::wal_advertiser::advmap::UpdatePageserverAttachmentsArg; use crate::{ GlobalTimelines, SafeKeeperConf, copy_timeline, debug_dump, patch_control_file, pull_timeline, wal_advertiser, @@ -71,20 +69,17 @@ fn check_permission(request: &Request, tenant_id: Option) -> Res }) } -async fn post_tenant_pageserver_attachments(mut request: Request) -> Result<(), ApiError> { +async fn post_tenant_pageserver_attachments(mut request: Request) -> Result, ApiError> { let tenant_id = parse_request_param(&request, "tenant_id")?; check_permission(&request, Some(tenant_id))?; - let body: TenantShardPageserverAttachmentChange = json_request(&mut request).await?; + let body: models::TenantShardPageserverAttachmentChange = json_request(&mut request).await?; let global_timelines = get_global_timelines(&request); + let wal_advertiser = global_timelines.get_wal_advertiser(); + wal_advertiser + .update_pageserver_attachments(tenant_id, body) + .map_err(ApiError::InternalServerError)?; - match body { - TenantShardPageserverAttachmentChange::Attach(tenant_shard_pageserver_attachment) => { - todo!() - } - TenantShardPageserverAttachmentChange::Detach(tenant_shard_pageserver_attachment) => { - todo!() - } - } + json_response(StatusCode::OK, ()) } /// Deactivates all timelines for the tenant and removes its data directory. @@ -111,39 +106,6 @@ async fn tenant_delete_handler(mut request: Request) -> Result, -) -> Result, ApiError> { - let tenant_shard_id: TenantShardId = parse_request_param(&request, "tenant_shard_id")?; - check_permission(&request, Some(tenant_shard_id.tenant_id))?; - - let PutTenantPageserverLocationRequest { - pageserver_locations, - }: PutTenantPageserverLocationRequest = json_request(&mut request).await?; - - let global_timelines = get_global_timelines(&request); - let wal_advertiser = global_timelines.get_wal_advertiser(); - wal_advertiser - .update_pageserver_attachments( - tenant_shard_id, - pageserver_locations - .into_iter() - .map( - |TenantShardPageserverLocation { - generation, - pageserver_node_id, - }| UpdatePageserverAttachmentsArg { - generation, - pageserver_node_id, - }, - ) - .collect(), - ) - .map_err(ApiError::InternalServerError)?; - - json_response(StatusCode::OK, ()) -} - async fn timeline_create_handler(mut request: Request) -> Result, ApiError> { let request_data: TimelineCreateRequest = json_request(&mut request).await?; @@ -777,9 +739,6 @@ pub fn make_router( .delete("/v1/tenant/:tenant_id", |r| { request_span(r, tenant_delete_handler) }) - .put("/v1/tenant/:tenant_shard_id/pageserver_attachments", |r| { - request_span(r, tenant_put_pageserver_attachments) - }) // Will be used in the future instead of implicit timeline creation .post("/v1/tenant/timeline", |r| { request_span(r, timeline_create_handler) diff --git a/safekeeper/src/timelines_global_map.rs b/safekeeper/src/timelines_global_map.rs index 0898aaee9f..774cfad531 100644 --- a/safekeeper/src/timelines_global_map.rs +++ b/safekeeper/src/timelines_global_map.rs @@ -12,9 +12,7 @@ use anyhow::{Context, Result, bail}; use camino::Utf8PathBuf; use camino_tempfile::Utf8TempDir; use safekeeper_api::membership::Configuration; -use safekeeper_api::models::{ - SafekeeperUtilization, TenantShardPageserverLocation, TimelineDeleteResult, -}; +use safekeeper_api::models::{SafekeeperUtilization, TimelineDeleteResult}; use safekeeper_api::{ServerInfo, membership}; use tokio::fs; use tracing::*; @@ -59,18 +57,12 @@ struct GlobalTimelinesState { impl GlobalTimelinesState { /// Get dependencies for a timeline constructor. fn get_dependencies( - &self, - , ) -> ( - Arc, - Arc, - RateLimiter, Arc, - , Arc, ) { ( @@ -189,7 +181,12 @@ impl GlobalTimelines { { let ttid = TenantTimelineId::new(tenant_id, timeline_id); let wal_advertiser = wal_advertiser.load_timeline(ttid); - match Timeline::load_timeline(conf.clone(), ttid, wal_backup.clone(), wal_advertiser) { + match Timeline::load_timeline( + conf.clone(), + ttid, + wal_backup.clone(), + wal_advertiser, + ) { Ok(tli) => { let mut shared_state = tli.write_shared_state().await; self.state @@ -254,7 +251,7 @@ impl GlobalTimelines { start_lsn: Lsn, commit_lsn: Lsn, ) -> Result> { - let (conf, _, _, _) = { + let (conf, _, _, _, _) = { let state = self.state.lock().unwrap(); if let Ok(timeline) = state.get(&ttid) { // Timeline already exists, return it. @@ -332,12 +329,11 @@ impl GlobalTimelines { match GlobalTimelines::install_temp_timeline( ttid, tmp_path, - wal_advertiser, conf.clone(), + wal_advertiser, + conf.clone(), wal_backup.clone(), ) - - .await - + .await { Ok(timeline) => { let mut timeline_shared_state = timeline.write_shared_state().await; diff --git a/safekeeper/src/wal_advertiser/advmap.rs b/safekeeper/src/wal_advertiser/advmap.rs index 07048c78d0..f43de8e146 100644 --- a/safekeeper/src/wal_advertiser/advmap.rs +++ b/safekeeper/src/wal_advertiser/advmap.rs @@ -8,7 +8,7 @@ use std::{ use serde::Serialize; use utils::{ generation::Generation, - id::{NodeId, TenantTimelineId, TimelineId}, + id::{NodeId, TenantId, TenantTimelineId, TimelineId}, lsn::Lsn, shard::{ShardIndex, TenantShardId}, }; @@ -40,11 +40,6 @@ pub struct PageserverTimeline { pub struct SafekeeperTimeline {} -pub struct UpdatePageserverAttachmentsArg { - pub generation: Generation, - pub pageserver_node_id: NodeId, -} - impl World { pub fn housekeeping(&self) {} pub fn load_timeline(&self, ttid: TenantTimelineId) -> Arc { @@ -52,8 +47,8 @@ impl World { } pub fn update_pageserver_attachments( &self, - tenant_shard_id: TenantShardId, - arg: Vec, + tenant_id: TenantId, + arg: safekeeper_api::models::TenantShardPageserverAttachmentChange, ) -> anyhow::Result<()> { todo!() }