Repository navigation
Conversation
…s, like Server 2.11.1 Worker polls and history pages add workflow_sequence to a consumed signal's SignalReceived from its record, as WorkflowTaskPoller does; the run history route still shows the event as recorded. Task snapshots keep compatibility, the dispatch and claim stamps and errors when they are set, as WorkflowHistoryEvent::taskSnapshot does.
An update whose durable contract declares a validator now waits for a validator-capable worker to approve it, as published PHP does: admission refusals in PHP's order, validation tasks keyed by run, update and request id, the dedicated and multiplexed worker polls, fenced approve and reject routes, lease expiry and re-claim, and 504 timeouts with their reasons. An accepted update's receipt no longer carries accepted: true, as PHP's result mapper drops it. The update-validation fixture records 49 steps against published PHP; native matches all of them.
The six admission, durable-limit and external-payload policy maps are read like PHP's EnvAuditor::jsonObject: unset, or raw text that decodes to a JSON object. Malformed JSON, null, lists and scalars now stop startup instead of silently becoming an empty policy. A set DW_ name wins over its legacy name even when invalid, and the refusal names the variable without its value. The external payload quota reads its overrides with the same decoder.
COM_STMT_CLOSE has no reply. The published sqlx-mysql flushed it on its own write after a cache eviction or an uncached execute, and flushed it again before draining results. The next command then waited behind Nagle's algorithm for the server's delayed acknowledgement, about 40 ms. Across the 30-48 statements of a transition that held the global lock for 0.3-1 s under load, and a due timer behind it fired more than the 1 s bound late (#714). The vendored driver now queues each close with sequence 0 and leaves a buffer of replyless closes unflushed until the next command, so both go out in one write. A proxy-recorded qualification test fails with the published driver and passes with the change on MySQL 8.0 and MariaDB.
Security's review of f31c4c3: Connection::flush delegated to wait_until_ready, which now leaves a buffer of queued closes unsent, and clear_cached_statements only queued its closes. Both report success with the bytes still buffered. Explicit flushes and cache clears now send every buffered byte before returning (MySqlStream::flush_queued); only the path before the next command keeps closes to share that command's write. New MySQL and MariaDB controls prove both calls without a later command; they fail on f31c4c3. The close test now describes what it observes: TCP read chunks at a proxy, not write calls.
Workflow 2.10.2's applySignal takes a workflow sequence only from the signal's own wait, so a declared signal applied while a condition wait is open keeps no sequence; only an undeclared signal takes the condition wait's. Native recorded the condition wait's sequence for both, which became visible once worker polls showed the record: the published-SDK signal and query cohorts require worker history to equal the run's history prefix (all nine SDK pairings on every database). A new test covers the declared case and fails without the change.
…rust-325-train-oct24
… rust-325-train-oct24 # Conflicts: # .github/workflows/server-parity.yml
…nto rust-325-train-oct24
…orkflows A newer push to the same pull request now cancels the run in progress for Shared Server fixtures (13 jobs, about 415 job-minutes) and PHPUnit Feature, as Sonar already does. The organization's 20 shared runners no longer spend hours on replaced heads. Runs on main and manual dispatches always finish.
The probe waits through the 10-second validation timeout, a 6-second lease expiry, a 2-second completion wait and several short polls before PHP does any work. On the published PHP SQLite runtime it exceeded the recorder's generic 45-second probe limit while making its last calls (train #723, job 120776618912: spawnSync php ETIMEDOUT). Expected results are unchanged.
|
Head |
…nto rust-325-train-oct24
|
Head |
…perseded PHPUnit runs cancel The update-validation probe's waiting child requests now retry PHP's documented backend_lock_pressure refusal (nothing committed) with the same rule as every other probe request. seconds stays the answered attempt's own wait; retries are reported on stderr. PHPUnit feature suite and Feature source qualification used a job-level always(), which GitHub never cancels, so #724's superseded-run cancellation left the old run holding the concurrency group. !cancelled() still runs both jobs when a needed job failed, so the required checks stay fail-closed.
|
New head 1. Update-validation fixture, PHP reference on SQLite (the
The checker reports the first differing step in key order, so a failed run shows only that first step. This head adds one bounded change: the probe's waiting child requests now retry PHP's typed 2. PHPUnit superseded-run cancellation (fixes #724's intent). The Security R2 handoff for #723 waits for terminal checks on this head. |
|
Security current-head check at 180d4e3: R2 acceptance remains withheld. The required PHPUnit workflow is red for a source-level policy incompatibility, not an external runner failure. Run 40067888485 shows the central action-policy validator rejecting phpunit-feature.yml because the required check condition no longer contains always(). The protected current validator explicitly requires always() in that gate condition so the required check reports a failed preflight. The feature job did run and fail closed after the preflight failure, but the static central contract still correctly blocks the changed source. A narrow candidate is a condition which retains always() while explicitly refusing cancellation, such as always() && !cancelled(), followed by the actual superseded-run cancellation counterfactual and unchanged failed-preflight reporting. Coordinate that contract with the central policy owner rather than weakening or bypassing the validator. The cleanup error for the absent scripts/ci/cleanup-database-tls.sh after checkout was skipped is secondary failure-path noise, not the root gate. Separately, run 40063949579 / job 120786013151 remains a failed superseded original. Its single update-validation difference is recorded in private D500 with the public job link; the current full Shared Server matrix is still in progress. No exact-head Security merge authorization yet. |
…or its PHP leg The SQLite job's main corpus now excludes update-validation.json. A separate script records that fixture for php, embedded and rust and compares the three. Its published PHP record runs with PHP's maintenance loop stopped: under that loop's SQLite writer contention, PHP 2.11.1 loses its own validation-timeout and lease-reclaim writes to "database is locked" and its validation poll answers without the typed lock-pressure refusal (10 of 15 local runs failed with the loop running, 5 of 5 and 3 of 3 passed with it stopped). Expected results are unchanged. MySQL and PostgreSQL keep the fixture in their main corpus with their loops running. The runner gains --exclude-fixture, which must name a selected fixture and cannot be combined with --fixture. The maintenance window helper is #722's, moved to a shared path. Tests cover the selection rules, the workflow wiring and every restore path of the helper. PHPUnit Feature returns to main's job conditions and drops its concurrency group. The central action policy requires always() on the PHPUnit feature suite gate, and GitHub never cancels an always() job, so cancel-in-progress would only queue a newer run behind it. Shared Server fixtures keeps #724's cancellation.
|
New head 1. PHPUnit Feature returns to main's job conditions and has no concurrency group. GitHub never cancels an 2. Decision on the update-validation fixture: record its PHP leg on SQLite with PHP's maintenance loop stopped. Accepting it as a flake would leave a required check that fails about two runs in three.
Tests.
The PHP 2.11.1 poll defect (no typed lock refusal on |
…ase probes The published PHP SQLite reference shares its file with a one-second maintenance loop. #723's run 40069368271 recorded the Prometheus fixture's activity claim as 503 (then 422 for the completions that had no task). An activity poll under lock pressure answers the documented 503 backend_lock_pressure refusal, which hands out no task and tells the worker to retry. The system-metrics and operator-dashboard probes already retry exactly that refusal through lock-pressure-middleware.php. The Prometheus and activity lease renewal probes build their own Guzzle clients for raw worker polls and did not. They now push the same middleware. Expected results are unchanged: the claim must still end at 200, and every other status or body still reaches the contract. ServerParityRunnerTest now requires the middleware in every corpus probe that polls over its own HTTP client; it fails against the previous Prometheus probe.
|
Classification of the What failed. Step 10, "Execute and compare Rust, published PHP and embedded fixtures". One fixture differed: Which runtime. The published PHP 2.11.1 target on SQLite, not native:
Cause. In published 2.11.1, an activity poll that meets lock pressure answers the documented Correction (commit
Residual, not changed here. Four other corpus probes build their own clients without the middleware: |
Sonar reported 11 style findings in the two new scripts. Conditions use [[ ]], the state reader ends with an explicit return, and positional parameters are read into named locals. Behavior is unchanged: a missing COMMAND still fails under set -u, and each assertion still fails the caller under set -e. PhpMaintenanceWindowTest passes 5/5, and one local end-to-end record stopped and restored the real maintenance container.
Train #723's MySQL 8.0 pressure profile failed 'one real SDK budget expires while pressure stays held' on the published PHP target, and the log could not say whether shutdown took under 8 s or over 10 s. The assertion now prints the measured time and backend. The window itself is unchanged.
|
New head
Terminal evidence at
Sonar decision. A fresh full run is now running on |
|
|
Security pre-terminal R2 source review at exact head
At this head,
There is a related atomicity gap: native reads Required correction: bind a non-empty poll request ID to the normalized effective task-kind set and replay the same still-valid response for both workflow and validation deliveries; refuse changed sets with the documented fields/reason. Keep kind selection, at-most-one claim, and cursor turn in one durable transition. Add focused native and shared PHP/native fixture counterfactuals for reordered retry, changed-set conflict, validation-task replay, workflow-task replay, expired cached delivery, and concurrent multiplexed claims across the supported databases. Do not resolve this only by retaining the manifest claim without behavior; if parity is deliberately deferred, remove the unsupported advertised contract and document the compatibility decision explicitly. The already reviewed MySQL close lifecycle, JSON-object fail-closed parsing, and worker-history presentation remain source-acceptable. The exact-head terminal matrix is still useful evidence for the unaffected surfaces, but it cannot authorize this R2 merge until the poll contract is corrected and the changed range is requalified. |
|
Superseded by #729. Security's pre-terminal review (comment 6381682935) blocked this head on #712's multiplexed update-validation poll contract. #729 carries the four constituents Security found source-acceptable (#717, #719, #710, #724) plus the probe retry and the pressure diagnostic. #712 stays open and gets the poll-request-id correction as its own train, together with this branch's update-validation harness commits. This PR's running matrix is cancelled to free runners for #729. |
The probe waits through the 10-second validation timeout, a 6-second lease expiry, a 2-second completion wait and several short polls before PHP does any work. On the published PHP SQLite runtime it exceeded the recorder's generic 45-second probe limit while making its last calls (train #723, job 120776618912: spawnSync php ETIMEDOUT). Expected results are unchanged.



One train for four reviewed Rust Server #325 PRs on current main
960aa3051(after #707), so CI runs once instead of four times while runners are saturated:4d28b1e8call sixcodec-deadline-healthcells passed, including the three MySQL-family cells (MariaDB 10.11, MySQL 8.0, MySQL 8.4) that Native timer exceeds the 1s lateness bound under MariaDB qualification load #714 failed on other heads.8b0a8795d.fe8269b25.Merge order:
main→ #717 → #712 → #719 → #710. Only.github/workflows/server-parity.ymlconflicted: #712 and main (#707) each added a contract test to the samenode --testlist. The resolution keeps both, so the list holds the union:ServerParityOperatorDashboardTypesContractTest.mjs,ServerParityClusterInfoContractTest.mjsandServerParityUpdateValidationContractTest.mjs.Local on this head:
cargo check --all-targets, and SQLitecargo test --all-targetspasses (lib 257, execution 456, plus the other targets).When this train merges, the four constituent PRs close as merged through it, and #718 is rebased onto main. #708, #713, #718, #720, #722 and #673 stay separate under their own review gates.