1be353bf9c
Address PR #62871 review: with the default retain_async=True, aretain_batch returns when the write is accepted, not when it's durable/recall-visible, so draining the local writer queue (task_done) is not a read-after-write signal. The next-turn prefetch could still recall before the just-completed turn was observable on the server. - Track the async operation_id/operation_ids returned by aretain_batch - _wait_for_retains_drained now applies two ordered, budget-bounded barriers: (1) local writer queue drains, then (2) tracked server-side async ops report completion via operations.get_operation_status (an explicit read-after-write condition). NotFound (completed+evicted) counts as done; transient errors keep waiting until the deadline - Completed ops are removed from the pending set so later prefetches don't re-poll them; the whole wait stays off the reply path - Add TestPrefetchServerRetainVisibility: op-id tracking (single/multiple), no-op tracking when retain_async=False, prefetch waiting for server completion before recall, timeout fallback on a wedged op, and NotFound / transient-error status handling