Repository navigation
Conversation
Read current barrier history under the run lock after Activity outcome validation may have established an older repeatable-read snapshot. Cover independent-PDO interleavings, named storage, nested and large groups, duplicate delivery, and real queue workers.
Loosand
marked this pull request as ready for review
November 6, 2026 04:35
This was referenced Nov 7, 2026
Member
|
The reported lost wake-up is fixed in Workflow 2.20.5 through #1056 and its maintenance backport #1057. Qualification covers independent MySQL connections, default/named storage, two/six/twenty-five members, nested groups and duplicate completion; #1052 has the published-package results. Closing this follow-up because that fix has shipped. This PR was not merged. The release prevents new occurrences and does not automatically repair already-stranded runs. Thank you for reporting the interleaving. |
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.
Summary
Refs #1052. Parallel Activity completions can all commit successfully while leaving an embedded
all()parent waiting without a resume task on MySQL REPEATABLE READ.Activity outcome validation performs a consistent read before acquiring the shared run lock. A later lock holder can therefore retain a snapshot older than its sibling's committed completion. Enable the existing current locking history read in the Activity barrier, so the last member observes that completion and schedules the parent exactly once.
Add a deterministic regression through real job handlers and independent PDO transactions. It pauses the last outcome after its actual validation read, commits its sibling through a separate storage connection, then resumes the last outcome. The cases cover default/named storage, 2/6/25 members, nested
all(), incomplete-group non-wake and duplicate delivery. Separate real Redis queue-worker cases cover six- and twenty-five-member batches.Verification
The final committed tests are identical in the counterfactual and candidate runs:
4b2cdc5507120d9c213b0b02a85738bec96c574a33bc5d07269136b7810522a44ce73df10225f3c7These controls used MySQL 8.4.8 / REPEATABLE READ, PHP 8.4.25 and Laravel 13.40.0. The unmodified barrier blob is
84be4ac9ada051f415d2608d427685c917b1fc4a. The complete new test file also passes the normal upstream PR checks: 10 tests / 136 assertions, including two real Redis queue-worker cases. Each Activity has one attempt and each worker-driven run has exactly two workflow tasks (initial execution and final continuation).The complete existing non-PR workflow on the fork passed against the exact candidate SHA, including the final
buildgate:PR-only jobs and optional Sonar analysis are skipped by that workflow's event/secret conditions. The optional Codecov upload was rejected because the fork has no accepted upload token; the required coverage calculation and ratchet pass, and raw reports are retained as workflow artifacts. External Codecov/Sonar publication is not claimed.
Local
composer ecs, fullcomposer stan -- --memory-limit=1G,composer unitandcomposer coveragealso pass. Earlier container attempts had orphan-process reaping and shared MySQL connection-capacity failures; the isolated runner corrected these, without changing production behavior, assertions or test timeouts. Local full-feature precursor runs were stopped and are not counted as passes; the full-feature evidence above comes from the completed hosted matrix.Development and validation use Codex assistance. These results qualify the source candidate; they do not claim published-package or production acceptance.
Compatibility
No public API, schema, payload-format, dependency or isolation-setting changes. The current history read runs under the existing parent-run lock. Stale-attempt validation and the task/execution/run lock order are preserved. Child and timer closure paths are unchanged.
This prevents the completion-time lost wake-up. Automatic recovery of already-stranded runs is not claimed by this change. It is independent of the signal-gap-lock deadlock corrected in #1045.