Summary
Server-requested Arrow Flight graceful rotation currently replaces normal ACK waiting with the server grace-period deadline. A pending batch can therefore outlive server_lack_of_ack_timeout_ms while graceful close or transport drain is active.
Keep the oldest pending batch's absolute ACK deadline active throughout graceful rotation.
Prior draft #592 explored this behavior on an obsolete effort/* stack. It was closed so the implementation can be rebuilt as a fresh PR stacked on #654.
Scope
- Select among the next response, the oldest pending ACK deadline, and the graceful-close deadline while waiting for pre-rotation ACKs.
- Keep the ACK deadline armed during bounded request/response transport drain.
- Preserve response-first exact-tie handling while allowing only one ready response to defer an already-expired pending head.
- Re-check the same head under lock before returning
DeadlineExceeded.
- Document that graceful rotation does not pause or extend
server_lack_of_ack_timeout_ms.
Acceptance criteria
- An expired pending batch followed by a zero-progress graceful-close signal fails with
DeadlineExceeded.
- A batch whose ACK deadline expires during transport drain also fails with
DeadlineExceeded.
- An ACK already ready at the deadline can complete the relevant pending head.
- Multiple ready responses cannot repeatedly defer one expired head.
- Existing graceful-rotation and H2 half-close tests remain green.
Non-goals
Summary
Server-requested Arrow Flight graceful rotation currently replaces normal ACK waiting with the server grace-period deadline. A pending batch can therefore outlive
server_lack_of_ack_timeout_mswhile graceful close or transport drain is active.Keep the oldest pending batch's absolute ACK deadline active throughout graceful rotation.
Prior draft #592 explored this behavior on an obsolete
effort/*stack. It was closed so the implementation can be rebuilt as a fresh PR stacked on #654.Scope
DeadlineExceeded.server_lack_of_ack_timeout_ms.Acceptance criteria
DeadlineExceeded.DeadlineExceeded.Non-goals
close()during recovery; tracked by [Rust][Arrow] Coordinate explicit close with recovery #657.