2.14.0 — Backup Reliability Audit
·
10 commits
to main
since this release
2.14.0 — Backup Reliability Audit
Six independent audit fixes, bundled into one release. Focused entirely on backup/restore reliability — no new settings, no migration, no operational surface change. Safe drop-in upgrade from 2.13.x.
What's fixed
- PR1 — Large tables without a numeric primary key are no longer skipped. The chunked-mysqldump path used to drop the data of any big table lacking a single-column numeric PRIMARY KEY (only CREATE TABLE survived), shipping WooCommerce-extension and audit/log tables empty. Export now walks PRIMARY KEY → single-column UNIQUE NOT NULL → auto_increment, falls back to a single set_time_limit(0) mysqldump for cursorless tables, and wraps the PHP-path offset loop in a consistent-snapshot transaction.
- PR2 — State-machine race cluster. Atomic schedule() via add_site_option() CAS; is_running() now covers pending/cancelling; cancel() tombstone prevents fail() from resurrecting a cancelled backup; every step is idempotent on Action Scheduler re-fires (no duplicate multi-GB uploads after a worker SIGKILL).
- PR3 — Scheduler correctness. Registered the weekly cron recurrence (without it, "Weekly" produced zero backups); calculate_next_run() now honors schedule_day; timekeeping moved to wp_timezone() + DateTimeImmutable, fixing twice-a-year DST drift.
- PR4 — DigitalOcean Spaces multipart-upload lifecycle. Per-upload abortMultipartUpload on final-retry failure, an idempotent AbortIncompleteMultipartUpload (Days: 1) bucket lifecycle rule on activation, and a daily sweep of multiparts older than 24h — stops orphan parts billing indefinitely.
- PR5 — Retention correctness + state-shape hardening. Retention sorts by the monotonic backup-{Y-m-d-His} key (not Spaces' non-monotonic LastModified) and won't delete anything younger than 1h; validate_db_export_shape() fails cleanly on stale state; process_next_action() catches \Throwable so a TypeError can't wedge the Action Scheduler claim site-wide.
- PR6 — State-bloat + history retention polish. STATE_OPTION written autoload=no on single-site; history rows older than 90 days pruned (filter: mighty_backup_history_retention_days); stale completed state older than 72h swept by the retention cron.
Upgrade notes
- Drop-in from 2.13.x — no settings migration.
- A backup in flight across the upgrade fails fast with a clear "stale state — cancel and restart" message (PR5); just re-run it.
- Operators on Weekly schedules should confirm their next-run time after upgrading (PR3 makes Weekly actually fire).
Full Changelog: 2.13.2...2.14.0