Repository navigation
Rust #325: qualify native on MySQL InnoDB Cluster behind Router - #928
Conversation
Native ran on a three-member single-primary MySQL 8.4 InnoDB Cluster through Router's read-write port: schema creation, the timer and activity lifecycle, and primary crash, clean shutdown and hang. History stayed exact with no leftover leases. Native answered 503 while no primary was reachable and recovered without a restart, 1 to 5 s after Router switched. Two defects found: - The activity poll answer lacked PHP's top-level server_time (published since 2.11.0). Python SDK 2.12.2 measures a claimed lease against it and refused every activity native delivered, on any database. - MySQL errors a primary switch can raise (1053, 1290, 1927, 2055, 3100, 4031; 3101 as lock pressure) are now classified transient. The harness is in scripts/perf/mysql-innodb-cluster; results and operator settings are in the November 1 checkpoint. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…p sink The patched-pip inventory reviews every pip request in the repository. The README now points at the patched-pip bootstrap instead of showing an unreviewed install command. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sonar's gate failed on the harness: a fixture MySQL password on command lines, CLI paths opened by verify.py, a plain-http literal and an async client context it could not resolve. up.sh now generates a random password into the state directory and every script passes it through the environment (MYSQL_PWD, -e, mysqlsh --passwords-from-stdin). The auth token is random per run, verify.py reads one marked stream on stdin, and load.py closes its client explicitly. Smoke-tested end to end again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Server Perf run 41355053946: the PHP polling-cache bounded-growth smoke recorded one |
|
Shared Server fixtures run 41355053791: |
|
Security exact-head review of b99a684: accepted. The activity-poll top-level server_time restores the existing wire contract for leased, empty, and task-queue-changed answers without changing workflow polls. The added MySQL classifications affect diagnostics and retryable deregistration receipts only and do not broaden authority; backend failures remain 503. The harness uses per-run synthetic credentials, a 0600 state file, pinned images, bounded resources, and no host paths or real secrets. The current codec-deadline-health failure is unrelated to this source: all codec/deadline checks passed, then the Ubuntu 26 Docker client emitted lower-case "error: no such object", hitting the known cleanup-parser defect already fixed in #927. Remaining hosted checks still own ordinary qualification. No Security hold at this exact head. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Merged |
|
|
Security review of current exact head
The current head is an independently reproduced clean merge of reviewed source |



Qualifies native on a highly available MySQL topology: a three-member single-primary MySQL 8.4 InnoDB Cluster behind MySQL Router 8.4, with native on Router's classic read-write port. Results and operator settings are in
docs/rust-server-port-checkpoints/2026-11-01-mysql-innodb-cluster-router.md; the harness is inscripts/perf/mysql-innodb-cluster/.Results (one disposable host; Python SDK 2.12.2; workflows of a 1 s timer then two activities):
History is exact in every run: one completion per run, exact event counts, no duplicate
(run, sequence)rows, no leftover leases. While no primary is reachable, native answers503 storage_unavailable, readiness answers 503, and it recovers without a restart, 1 to 5 s after Router switches. Group Replication election and Router's metadata refresh account for the rest.Defects found and fixed
server_time(any database). Published PHP has answered the activity poll with a top-levelserver_timesince 2.11.0. Python SDK 2.12.2 measures a claimed activity's lease against it and refused every activity native delivered (ActivityLeaseAuthorityLost/invalid_activity_claim). Native now adds it to every activity poll answer. Test:activity_poll_answers_carry_the_server_clock.backend_unavailable, and 3101 isbackend_lock_pressure. Every database error already answered 503; the class drives the bounded diagnostic and the retryable deregistration receipt. Test:mysql_cluster_failover_errors_are_transient.Checks run locally: Rust lib 384 passed; execution suite on SQLite 667 passed, 1 ignored; node unit suite 6541/6543, with the timing test excluded and the known local-only
PhpImageContextTestfailure. CI covers MySQL, MariaDB and PostgreSQL.Not covered: multi-primary, Router read/write split, several Routers, long-running load, network partitions across hosts, TLS to Router, the Rust and PHP SDKs.
🤖 Generated with Claude Code