mirror of
https://github.com/rustfs/rustfs.git
synced 2026-07-26 16:28:15 +00:00
e008cc5dae
fix(targets): harden Postgres/MySQL SQL backends (pools, error class, idempotency) Postgres (postgres.rs): - Add deadpool wait/create/recycle timeouts + tokio-postgres connect_timeout, and wrap every pool.get() in a Tokio hard-limit timeout so an unreachable broker/DB can no longer block send_body/probe_table/is_active forever; checkout timeouts map to TargetError::Timeout to trigger store replay. - namespace format now DELETEs the row on s3:ObjectRemoved:* events instead of UPSERTing, keeping the table consistent with the object lifecycle. - map_pg_error: SQLSTATE class 40 (serialization_failure 40001, deadlock_detected 40P01, transaction rollback) is now transient (Timeout, retryable) instead of a permanent Request. Extracted map_pg_sqlstate for unit-testable classification. MySQL (mysql.rs): - Wrap pool.get_conn() in a Tokio checkout timeout across insert/init/liveness paths so an unreachable server cannot block the delivery thread. - Add an event_id idempotency key: tables created by the target now carry an event_id VARCHAR(255) PRIMARY KEY, inserts use ON DUPLICATE KEY UPDATE, and replays reuse the stable store key so a lost-ack replay no longer appends a duplicate audit row. Legacy two-column tables are detected and fall back to the non-idempotent insert with a warning (backward compatible). - redact_mysql_dsn splits on the last '@' so a password containing '@' no longer leaks its tail into Debug output. - Disconnect the stale pool before dropping it on inline TLS reload instead of leaking its connections. - Cache TLS file mtimes and only recompute the inline fingerprint when a cert file changes, avoiding a 3-file read+hash on every checkout. Adds unit tests for SQLSTATE classification, namespace delete SQL, removal-event detection, DSN redaction with '@' in the password, and the MySQL insert/DDL builders. Relates to rustfs/backlog#976 Relates to rustfs/backlog#973 Relates to rustfs/backlog#983 Co-authored-by: heihutu <heihutu@gmail.com>