diff --git a/pageserver/src/tenant/timeline/handle.rs b/pageserver/src/tenant/timeline/handle.rs index 743b3c0204..7ef237734f 100644 --- a/pageserver/src/tenant/timeline/handle.rs +++ b/pageserver/src/tenant/timeline/handle.rs @@ -171,11 +171,11 @@ pub(crate) struct ShardTimelineId { /// See module-level comment. pub(crate) struct Handle { - timeline: T::Timeline, + timeline: Arc, inner: tokio::sync::OwnedMutexGuard, } pub(crate) struct WeakHandle { - timeline: T::Timeline, + timeline: Arc, inner: Weak>, } enum HandleInner { @@ -363,7 +363,7 @@ impl Cache { HandleInner::KeepingTimelineGateOpen { gate_guard }, )); let handle_locked = handle_inner_arc.clone().try_lock_owned().unwrap(); - { + let timeline = { let mut lock_guard = timeline .per_timeline_state() .handles @@ -383,10 +383,12 @@ impl Cache { unreachable!() } hash_map::Entry::Vacant(v) => { + let timeline = Arc::new(timeline.clone()); v.insert(WeakHandle { - timeline: timeline.clone(), + timeline: Arc::clone(&timeline), inner: Arc::downgrade(&handle_inner_arc), }); + timeline } } } @@ -394,9 +396,9 @@ impl Cache { return Err(GetError::PerTimelineStateShutDown); } } - } + }; Ok(Handle { - timeline: timeline.clone(), + timeline, inner: handle_locked, }) } @@ -417,7 +419,7 @@ impl WeakHandle { let lock_guard = inner.clone().lock_owned().await; match &*lock_guard { HandleInner::KeepingTimelineGateOpen { .. } => Ok(Handle { - timeline: self.timeline.clone(), + timeline: Arc::clone(&self.timeline), inner: lock_guard, }), HandleInner::ShutDown => Err(HandleUpgradeError::ShutDown), @@ -439,7 +441,7 @@ impl Deref for Handle { impl Handle { pub(crate) fn downgrade(&self) -> WeakHandle { WeakHandle { - timeline: self.timeline.clone(), // FIXME: avoid this clone, it hits shared cache line + timeline: Arc::clone(&self.timeline), inner: Arc::downgrade(OwnedMutexGuard::mutex(&self.inner)), } }