From b44070d0c78552c75dcd119e5599ad54a08c8468 Mon Sep 17 00:00:00 2001 From: Christian Schwarz Date: Tue, 14 Jan 2025 13:30:48 +0100 Subject: [PATCH] experiment: what if we make Handle !Send so it can't be held across await points Result: the whole point of having a Handle at hand is to be holding a GateGuard while performing a Timeline operation. Dont' do it. --- pageserver/src/tenant/timeline/handle.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pageserver/src/tenant/timeline/handle.rs b/pageserver/src/tenant/timeline/handle.rs index 7ef237734f..278bbdb863 100644 --- a/pageserver/src/tenant/timeline/handle.rs +++ b/pageserver/src/tenant/timeline/handle.rs @@ -173,6 +173,7 @@ pub(crate) struct ShardTimelineId { pub(crate) struct Handle { timeline: Arc, inner: tokio::sync::OwnedMutexGuard, + _dont_hold_across_await_points: std::marker::PhantomData<*const u8>, } pub(crate) struct WeakHandle { timeline: Arc, @@ -400,6 +401,7 @@ impl Cache { Ok(Handle { timeline, inner: handle_locked, + _dont_hold_across_await_points: Default::default(), }) } Err(e) => Err(GetError::TenantManager(e)), @@ -421,6 +423,7 @@ impl WeakHandle { HandleInner::KeepingTimelineGateOpen { .. } => Ok(Handle { timeline: Arc::clone(&self.timeline), inner: lock_guard, + _dont_hold_across_await_points: Default::default(), }), HandleInner::ShutDown => Err(HandleUpgradeError::ShutDown), } @@ -439,6 +442,9 @@ impl Deref for Handle { } impl Handle { + pub(crate) fn timeline(&self) -> &T::Timeline { + &self.timeline + } pub(crate) fn downgrade(&self) -> WeakHandle { WeakHandle { timeline: Arc::clone(&self.timeline),