Skip to content

sapi/fpm: Preserve poll event indexes after worker replacement - #452

Closed
iliaal wants to merge 1 commit into
PHP-8.4from
fix/aph-fpm-poll-slot-index-84
Closed

iliaal wants to merge 1 commit into
PHP-8.4from
fix/aph-fpm-poll-slot-index-84

Conversation

@iliaal

@iliaal iliaal commented Nov 2, 2026

Copy link
Copy Markdown
Owner

When worker replacement leaves the next poll slot occupied, FPM registers a descriptor in a different free slot but keeps the occupied index. The poll backend now records the slot it used, so readiness dispatch continues capturing worker output. Direct insertion and both removal paths already use the matching slot.

Found during code review and reproduced with PHP 8.4 FPM on Linux. The regression requires Linux's pipe-EOF ordering to exercise slot search. The separate queue traversal defect is handled in php#25154.

When the next poll slot was occupied, fpm_event_poll_add() registered the
fd in the first free slot found by the search but stored the occupied index
in the event. fpm_event_poll_wait() then compared the event fd against the
wrong pollfd entry and skipped the event, so with catch_workers_output the
master did not read a replacement worker's output while it ran. Store the
slot actually used and advance the hint from it.
@iliaal
iliaal force-pushed the fix/aph-fpm-poll-slot-index-84 branch from c96d407 to a5b5008 Compare November 7, 2026 16:57
@iliaal iliaal closed this Nov 7, 2026
@iliaal iliaal reopened this Nov 7, 2026
@iliaal

iliaal commented Nov 7, 2026

Copy link
Copy Markdown
Owner Author

Promoted upstream as php#25289.

@iliaal iliaal closed this Nov 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant