Repository navigation
Keep EIO completion notifications active - #2
Draft
pauljccode wants to merge 1 commit into
Draft
pauljccode wants to merge 1 commit into
pauljccode wants to merge 1 commit into
Conversation
Keep the async watcher active while libeio drains its queue. A worker can finish between stopping and restarting the watcher, and ev_async_start clears that pending notification. Retain the required done-poll callback as a no-op; bundled libeio invokes it unconditionally.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
An I/O completion can be stranded when a worker notifies the event loop between
eio_done_pollstopping the async watcher andeio_async_cbrestarting it.ev_async_startclears the pending notification, leaving a completed request queued without an event-loop callback.Keep the watcher active while polling. Retain the required done-poll callback as a no-op because bundled libeio invokes it unconditionally.
Verification:
check-eio-notifications.pyandeio-notification-probe.cfrom the reproducer directory into the same directory. The runner requires Python 3, a C compiler, make and tar; it builds the bundled libeio 1.0.2 and libev 4.33.python3 check-eio-notifications.py /path/to/mettle baselineagainst master (4dd76ae), then repeat withcandidateagainst this branch. The probe extracts the actual callbacks and forces the worker to finish in the stop/start interval.The race reproducer passed on Linux, Intel macOS and Apple Silicon macOS. Mettle Verify passed all eight Ruby/platform jobs, each with 65 examples and zero failures.
Combined acceptance passed 51 Linux and 46 native Intel macOS examples with verified candidate payloads. That run also includes the process cleanup fix and the now-merged Framework CI fixes; it is integration evidence, not an isolated run of this PR. The deterministic probe above isolates this change.
Upstream: rapid7/mettle#299. The attached fork acceptance run used upstream defaults rather than the candidate and was cancelled. Its macOS dependency-setup failure is addressed by Framework #21965.