From 87db4b441c31fb704772beddf46307bea444bbe9 Mon Sep 17 00:00:00 2001 From: John Spray Date: Mon, 30 Oct 2023 09:18:40 +0000 Subject: [PATCH] pageserver: cleaner shutdown in timeline delete (#5701) The flush task logs a backtrace if it tries to upload and remote timeline client is already in stopped state. Therefore we cannot shut them down concurrently: flush task must be shut down first. This wasn't more obvious because: - Timeline deletions IRL usually happen when not much is being written - In tests, there is a global allow-list for this log It's not obvious whether removing the global log allow list is safe, this PR was prompted by how the log spam got in my way when testing deletion changes. --- pageserver/src/tenant/timeline/delete.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pageserver/src/tenant/timeline/delete.rs b/pageserver/src/tenant/timeline/delete.rs index 8cead5ebf2..6d30664515 100644 --- a/pageserver/src/tenant/timeline/delete.rs +++ b/pageserver/src/tenant/timeline/delete.rs @@ -38,6 +38,14 @@ async fn stop_tasks(timeline: &Timeline) -> Result<(), DeleteTimelineError> { } debug!("wal receiver shutdown confirmed"); + // Shut down the layer flush task before the remote client, as one depends on the other + task_mgr::shutdown_tasks( + Some(TaskKind::LayerFlushTask), + Some(timeline.tenant_id), + Some(timeline.timeline_id), + ) + .await; + // Prevent new uploads from starting. if let Some(remote_client) = timeline.remote_client.as_ref() { let res = remote_client.stop();