0.000059  2026-08-01 20:28:29-07:00 America/Los_Angeles

    - Windows SQLite bootstrap now disconnects its private DBI handle
      explicitly, and driver cleanup quarantines a database tree when normal
      deletion retries cannot clear it, preventing disposable directories from
      remaining at their canonical paths. Quarantines are retried by later
      cleanups and at process shutdown.
    - Pool clone timestamps now serialize with a locale-independent decimal
      point; legacy decimal-comma timestamps are accepted, while empty or
      damaged timestamps are reclaimed without warnings rather than pinning a
      broken cache entry indefinitely.

0.000058  2026-08-01 19:18:06-07:00 America/Los_Angeles

    - MariaDB bootstrap now requires an executable installer from the selected
      installation. Missing mariadb-install-db/mysql_install_db makes bootstrap
      nonviable, and direct bootstrap calls fail before creating a partial data
      directory instead of warning and continuing with incomplete system tables.
      Diagnostics identify the selected installation and explain that helpers
      from other installations are intentionally ignored; the matching policy
      and MariaDB 13.1 system-catalog requirement are now documented in the
      MariaDB driver.

0.000057  2026-08-01 16:52:20-07:00 America/Los_Angeles

    - MariaDB bootstrap now uses the installation-matched vendor helper, when
      available, to create the complete system catalog; MariaDB 13.1 trigger
      DDL and information_schema.triggers no longer fail for lack of
      mysql.event. Server-only installations retain the legacy bare bootstrap
      fallback, and older releases no longer receive a helper option that was
      introduced in MariaDB 10.1.
    - Disposable fast_destroy databases now retain their fast teardown policy
      when the watcher detects owner death, while cleanup => 0 databases keep
      graceful shutdown and preserve their reusable data directories, including
      when eliminate() terminates the watcher explicitly.
    - Graceful DESTROY now waits explicitly for the watcher before deleting the
      data directory, preventing END-phase cleanup from stranding MySQL during
      shutdown and producing SIGKILL escalation warnings.
    - The default graceful-stop allowance is now 30 seconds, reducing false
      SIGKILL escalation on loaded parallel test hosts; escalation remains
      tunable through QDB_STOP_GRACE. The unusually high-churn Pool tests
      request 60 seconds without changing the consumer default.
    - PostgreSQL startup now requires a successful connection instead of only
      a Unix socket, closing PostgreSQL 9.3's false-ready window before SysV
      IPC allocation. Early launch logs are retained so proven ENOSPC failures
      can skip cleanly while other startup failures remain actionable.
    - Windows SQLite cleanup now recognizes equivalent DBI/File::Temp paths
      across slash direction and case, disconnects every retained matching
      handle before deleting pool caches, and quarantines a stubborn stale tree
      rather than rebuilding on top of it and failing with "table already
      exists".

0.000056  2026-07-21 11:35:25-07:00 America/Los_Angeles

    - Added a no_disconnect_handles driver attribute (inheritable by clones) that skips the teardown-time DBI handle disconnect, for callers that hold their own live handles to the db being stopped (e.g. MySQL, which shuts down fine with clients connected).

0.000055  2026-07-14 12:20:42-07:00 America/Los_Angeles

    - Data-dir cleanup is now robust on Windows: remove_tree could leave a SQLite data dir non-empty on MSWin32 (the OS releases file handles asynchronously, so an immediate rmdir gets ENOTEMPTY), which left the stale db behind and made the rebuilt instance die with "table quick_testx already exists". A new remove_tree_robust helper retries on MSWin32 (single pass, no added latency, on Unix), and is used by Driver cleanup and the Pool build/expiry paths. This was the only remaining CPAN Testers failure on 0.000054 (Strawberry Perl, SQLite-only).
    - Driver cleanup() now disconnects this process's DBI handles before deleting the data dir; the watcher teardown paths already did, but the watcher-less path (SQLite, whose stop() is a no-op) reached cleanup() with handles still open, which on Windows locked the very file it was trying to remove.

0.000054  2026-07-13 10:53:23-07:00 America/Los_Angeles

0.000053  2026-07-10 11:07:52-07:00 America/Los_Angeles

    - Temp dir names now include the pid: File::Temp derives names from rand(), so forked or identically-seeded processes (e.g. under Test2::Plugin::SRand's date seed) drew identical DB-QUICK-* name sequences and could converge on one directory, corrupting a live database.
    - MySQL-family servers are now started with loose-mysqlx=OFF; the X Plugin defaults ON with a global default socket (/tmp/mysqlx.sock) and TCP port (33060), so concurrent instances contended on shared resources despite per-instance datadirs.
    - Fixed stop()/eliminate() signals being silently lost when they raced watcher startup: SIGTERM/SIGINT were SIG_IGN'd (discarded) across the watcher's exec instead of blocked (held pending) like SIGUSR1 already was, so a stop landing in that window left the watcher running until the caller gave up and killed it, orphaning a live server whose data dir stayed locked; the Pool build-then-stop pattern hit this constantly.
    - Watcher::wait no longer kills a watcher that is legitimately blocked reaping an unkillable (e.g. disk-sleep) server, which orphaned a live server and let stop() return while the data dir was still locked; it now waits longer (QDB_STOP_LEASH), and verifies server death with a read-only probe before returning.
    - Raised the default QDB_STOP_GRACE from 4 to 10 seconds and dropped the Pool tests' small-grace override: a normal MySQL 8 or loaded-host PostgreSQL clean shutdown routinely exceeds 4-5s, making escalation warnings and needless SIGKILLs (plus InnoDB crash recovery on the next clone start) the common case; the wedge that once justified a small grace was the lost-signal bug above.
    - PostgreSQL instances now run with autovacuum=off by default: on PostgreSQL <= 14 the autovacuum launcher could stall shutdown for 10s (PGSTAT_MAX_WAIT_TIME) waiting on the stats collector, routinely blowing the stop grace and drawing SIGQUIT escalations; short-lived test databases gain nothing from autovacuum, and the setting can be overridden.
    - DESTROY/eliminate teardown now disconnects this process's DBI handles first (like stop() already did); a connected handle made PostgreSQL's smart shutdown wait out the whole stop grace.
    - Clones now start with fresh logs; clone_dir copied the source's error.log and cmd-log-* files, so a clone's logs appeared to contain the parent's history.
    - t/watcher_fast_kill.t child-readiness now uses pipe synchronization instead of polling for a marker file under a 5s deadline a loaded smoker could blow.
    - t/watcher_fast_kill.t: widened the SIGQUIT-to-SIGKILL escalation gap (grace 1 -> 4) in the fast-sig subtest; on slow smokers the child was not scheduled in time to run its QUIT handler before SIGKILL landed, spuriously failing the marker assertion.
    - Data-dir deletion no longer aborts the process when the watcher and the owning process race to delete the same directory; File::Path's "cannot chdir ... aborting" die bypasses its error handler, and turned otherwise-passing FreeBSD smoker runs into FAILs during cleanup.
    - The Drivers/QuickDB/Pool tests now run once per database installation, forking a subprocess per install; with AUTHOR_TESTING set the test helpers live-scan ~/dbs/*/bin for developer installs in addition to the system install (nothing in lib/ consults ~/dbs).
    - Removed the stale hardcoded ~/dbs PATH prepends from the tests; added AGENTS.md with the developer testing protocol.
    - t/Drivers tests now quote the -target class name; the barewords failed to compile under Test2::Harness (yath), which enables strict before line 1.
    - PostgreSQL driver now reports not viable when bootstrap or autostart is requested as root (EUID 0), since initdb and postgres refuse to run as root, turning a start timeout into a clean skip (GH #12).
    - t/broken_mariadb_versions.t now skips on MSWin32, where its #!/bin/sh stub servers cannot execute and made the MDEV-38811 refusal check spuriously fail.

0.000052  2026-07-08 21:46:58-07:00 America/Los_Angeles

    - MariaDB driver now reports not viable for server releases that hang unkillably on information_schema table_constraints/referential_constraints scans under --skip-grant-tables (upstream MDEV-38811, introduced by MDEV-38209): 10.11.16, 11.4.10, 11.8.6, 12.2.2 (final 12.2 release, never fixed), and 12.3.1. The affected query thread blocks on a never-initialized ACL mutex: immune to KILL, prevents graceful shutdown, and the stuck client cannot be interrupted by Perl-level %SIG/alarm. Override with QDB_MARIADB_IGNORE_BROKEN=1; documented in a new "KNOWN BROKEN SERVER VERSIONS" POD section.
    - Added t/broken_mariadb_versions.t.

0.000051  2026-06-13 22:02:33-07:00 America/Los_Angeles

0.000050  2026-06-10 14:14:43-07:00 America/Los_Angeles

    - Watcher teardown blocks on the reap after sending SIGKILL instead of racing a deadline that was too short at low QDB_STOP_GRACE.
    - t/Pool wraps every server-spawning db()/fetch_db() in the resource-skip helper so a semaphore-exhausted host skips instead of failing.

0.000049  2026-06-09 17:14:55-07:00 America/Los_Angeles

    - Added Driver::destroy_quietly(): fast-destroy teardown for disposable clones (cleanup => 1) that kills, reaps, and removes the data dir immediately instead of a graceful shutdown that can block 2*QDB_STOP_GRACE+2 seconds.
    - Added an opt-in fast_destroy attribute: DESTROY uses destroy_quietly() when cleanup => 1, falls through to the graceful path when cleanup => 0, and is inherited by clones via clone_data().
    - Added per-driver fast_stop_sig() for fast/forced teardown: default SIGKILL, PostgreSQL overrides to SIGQUIT so the postmaster releases its SysV semaphores instead of leaking them; watcher escalates to SIGKILL if it does not stop promptly.
    - Added a watcher fast-eliminate request (SIGUSR1) that kills with fast_stop_sig, reaps, and deletes the data dir; blocked (not ignored) across the startup exec so a request racing startup stays pending instead of being dropped.
    - The graceful teardown path (stop()/eliminate()) now escalates a stuck shutdown through fast_stop_sig before SIGKILL, so it releases SysV semaphores instead of leaking them.
    - get_db() and the pool tests skip_all instead of failing when a host is out of System V semaphores/shared memory; added skipall_on_resource_error(), also covering the DBIx::QuickDB->import path (t/QuickDB) and mid-run pool clone builds (t/Pool).
    - On a start timeout, start() now reports the server's launch log and whether its process is still alive, instead of only the often-empty error log.
    - Added t/fast_destroy.t, t/watcher_fast_kill.t, and t/resource_skip.t.

0.000048  2026-06-06 10:53:27-07:00 America/Los_Angeles

    - Fixed a pid-reuse race that could shut down the wrong database server. After a server was stopped, its watcher exited and the OS could recycle the watcher's pid; a later teardown signal (e.g. eliminate() from the watcher object's DESTROY, which Driver::stop triggers as its lexical goes out of scope) would then land on whatever now held that pid -- often a sibling cloned database's postmaster, smart-shutting-down a live server out from under its owner. The watcher now refuses to signal its pid once a stop/eliminate has been initiated, and forgets the pid once the watcher has exited. This was the intermittent FreeBSD/PostgreSQL-9.3 t/Pool/postgresql.t failure where a freshly cloned db was already shut down by the time the test connected to it
    - Removed two redundant pid-signalling paths that carried the same pid-reuse hazard: the post-wait() server-pid poll in Driver::stop() (the watcher already reaps the server before it exits, so stop() now just trusts wait()) and the direct server-pid TERM/KILL fallback in Driver::DESTROY()
    - Added t/clone_sequence.t, an explicit PostgreSQL regression asserting a clone of a stopped source continues its SERIAL sequence with the exact next id (no SEQ_LOG_VALS +32 jump); the broad Pool test only checks id ordering

0.000047  2026-06-05 22:35:47-07:00 America/Los_Angeles

0.000046  2026-06-03 14:58:27-07:00 America/Los_Angeles

    - Made the server start timeout tunable via the QDB_START_TIMEOUT environment variable, keeping the previous 10s default. Slow hosts (e.g. CPAN smoke boxes) could need longer to bring a server up -- especially a clone doing crash recovery -- and were timing out with "Timed out waiting for server to start"
    - Restored the watcher's graceful-shutdown window to its original 4s default (0.000045 had raised it to 15s); it remains tunable via QDB_STOP_GRACE. Normal consumers keep the original timeouts; only callers that opt in via the environment get longer ones
    - Coordinated the shutdown timeouts so they cannot fight each other: the watcher escalates to SIGKILL at QDB_STOP_GRACE and gives up at twice that, and the driver-side waits (for the watcher to exit, and for the server pid to die) now outlast that give-up. Previously they were hardcoded to 10s, so raising QDB_STOP_GRACE above ~8s let the watcher be SIGKILLed mid-shutdown, leaving a half-stopped, orphaned server
    - The Pool tests now request generous start/stop timeouts (via QDB_START_TIMEOUT and QDB_STOP_GRACE) so their build/clone/start/stop cycles do not spuriously fail on slow smoke hosts; this affects only the tests, not the library defaults

0.000045  2026-06-02 11:34:03-07:00 America/Los_Angeles

    - Switched PostgreSQL shutdown back to SIGTERM (smart shutdown) for a proper, clean shutdown when possible. The earlier hang risk is now covered: stop() disconnects our own lingering handles first, forces a CHECKPOINT, and the watcher's SIGKILL grace period is generous and tunable
    - Driver stop() now forces a CHECKPOINT (PostgreSQL) before shutting the server down. If the shutdown is slow enough to be SIGKILLed, the data dir is already consistent, so cloning it no longer triggers crash recovery that jumps SERIAL sequences forward by SEQ_LOG_VALS (32) -- the FreeBSD smoke failure where a cloned row got id 34 instead of 2
    - Increased the watcher's graceful-shutdown window before escalating to SIGKILL (4s -> 15s) and made it configurable via the QDB_STOP_GRACE environment variable, so slow hosts can finish a clean shutdown
    - Made the Pool tests tolerant of non-deterministic SERIAL ids (verify row values and that ids are strictly increasing, rather than exact id values)
    - Fixed t/stop_socket_cleanup.t failing on platforms without DBI/IO::Socket::UNIX (e.g. Windows, smoke hosts lacking DBI): it now skips cleanly instead of dying

0.000044  2026-06-01 14:23:16-07:00 America/Los_Angeles

    - Driver stop() now confirms the server is gone by its pid instead of waiting for the unix socket file to disappear, and removes a stale socket left behind by a SIGKILLed server. Fixes FreeBSD smoke failures where a slow shutdown was SIGKILLed and stop() then timed out waiting for the leaked socket

0.000043  2026-05-29 13:09:21-07:00 America/Los_Angeles

    - Stop PostgreSQL with SIGINT (fast shutdown) instead of SIGTERM (smart shutdown) to avoid hangs/SIGKILL and leaked sockets on slow hosts

0.000042  2026-05-25 17:30:00-07:00 America/Los_Angeles

    - Add DuckDB driver (optional DBD::DuckDB + duckdb CLI; tests skip if absent)

    - Add [PruneCruft] to dist.ini so build artifacts (blib/,
      pm_to_blib, MYMETA.*) no longer leak into release tarballs.

    - Fix provider_info running mariadb-install-db with no args, which created a
      143MB 'data' dir in CWD (GH #11)
    - Exclude 'data/' from dist tarball via GatherDir as a safeguard
    - Fix DB-QUICK-CLONE temp dirs and server processes leaking after tests (GH #10)
      - Set SIGTERM/SIGINT to SIG_IGN before watcher exec to prevent race
        condition where watcher is killed before signal handlers are installed
      - Add fallback in Driver::DESTROY to kill server directly and clean up
        dir if watcher fails to do so

0.000041  2026-04-07 17:13:03-07:00 America/Los_Angeles

    - Fix clone_dir cp fallback copying source dir into dest instead of contents
    - Add unit tests for all clone_dir implementations
    - Fix Windows warnings and test failures:
      - SQLite version_string no longer warns when sqlite3 binary is missing
      - Pool no longer warns about undefined $ENV{USER} on Windows
      - Pool clear_old_cache closes file handle before remove_tree (Windows file locking)
      - Test files no longer warn about undefined $ENV{HOME} on Windows
      - Pool instance_dir test uses canonical paths for cross-platform comparison
    - Fix PostgreSQL initdb failure when system locale is non-UTF8

0.000040  2026-04-05 14:03:55-07:00 America/Los_Angeles

    - Make MySQL less noisy
    - Remove other noise
    - Fix Mariadb binary detection
    - Fix a few minor bugs (AI assisted)

0.000039  2026-01-23 12:04:49-08:00 America/Los_Angeles

    - Add $db->resync method

0.000038  2025-03-29 00:35:02-07:00 America/Los_Angeles

    - Remove rogue Carp::Always from test
    - MAke it easier to runt he tests on my machine

0.000037  2025-03-26 23:10:00-07:00 America/Los_Angeles

    - Fix typo that caused the MySQL driver to break

0.000036  2025-03-26 22:56:11-07:00 America/Los_Angeles

    - Support MySQL community server (MySQLCom)
    - Default to DBD::MariaDB for all mysql variants

0.000035  2024-07-10 08:25:37-07:00 America/Los_Angeles

    - Documentation Updates

0.000034  2024-06-12 17:11:24-07:00 America/Los_Angeles

    - MAke watcher use exec

0.000033  2024-05-13 11:13:04-07:00 America/Los_Angeles

    - Remove Carp::Always from MariaDB test

0.000032  2024-05-07 09:12:13-07:00 America/Los_Angeles

    - Docs fixes

0.000031  2024-05-06 15:53:42-07:00 America/Los_Angeles

    - Fix silencing of watchers

0.000030  2024-05-06 14:58:26-07:00 America/Los_Angeles

    - Cleanup the db-watcher code
    - Split MySQL into Percona and MariaDB

0.000029  2024-04-28 09:58:52+01:00 Europe/Lisbon

    - Add QDB_TMPDIR env var

0.000028  2024-04-25 13:00:04+01:00 Europe/Lisbon

    - Fix mariadb warning

0.000027  2024-04-25 12:24:25+01:00 Europe/Lisbon

    - Fix doc issue

0.000026  2024-04-16 15:04:26-07:00 America/Los_Angeles

    - Use MariaDB binaries when available
    - Silence mariadb complaints about using mysql binaries

0.000025  2024-04-16 14:34:21-07:00 America/Los_Angeles

    - Fix test error when DBD::mysql is not installed

0.000024  2024-02-07 17:19:03-08:00 America/Los_Angeles

    - Add QDB_MYSQL_SSL_FIPS env var

0.000023  2022-08-23 14:02:40-07:00 America/Los_Angeles

    - Allow an instance dir for pools

0.000022  2022-07-08 15:44:44-07:00 America/Los_Angeles

    - Better support for percona 5.7
    - Do not modify config reference that is passed in, make a copy

0.000021  2021-01-19 14:55:27-08:00 America/Los_Angeles

    - For pools, make sure cache db is stopped before marking it as ready
    - Move ready file outside the directory so it is not copied with the dir (ooops)
    - Add ability to show pool diag without showing all sql-server output

0.000020  2020-12-01 15:35:36-08:00 America/Los_Angeles

    - Watcher should use POSIX::_exit() since it is exec-like
    - Minimum mysqld version 5.6.0

0.000019  2020-11-30 15:40:36-08:00 America/Los_Angeles

    - Add watcher process to make sure cleanup happens

0.000018  2020-11-20 08:46:39-08:00 America/Los_Angeles

    - Fix bug where driver could be forgotten in pool during reclaim

0.000017  2020-11-16 08:26:03-08:00 America/Los_Angeles

    - Support for older percona mysqld's that need mysql_install_db run

0.000016  2020-11-13 11:28:35-08:00 America/Los_Angeles

    - Support older version of percona
    - Minor test fixes

0.000015  2020-08-14 20:45:04-07:00 America/Los_Angeles

    - Make it possible to clear old cache
    - Do not leave garbage in /tmp from tests

0.000014  2020-07-30 22:36:47-07:00 America/Los_Angeles

    - Fix some Postgres 'starting up' issues
    - Support for percona in MySQL
    - Support for either DBD::MariaDB or DBD::mysql

0.000013  2020-07-28 21:17:30-07:00 America/Los_Angeles

    - Add module to deps

0.000012  2020-07-28 15:33:51-07:00 America/Los_Angeles

    - Add ability to clone without cp or rsync
    - Fix minimum perl version

0.000011  2020-07-27 23:07:33-07:00 America/Los_Angeles

    - Add ability to clone databases
    - Add Database pools
    - Make databases better at stopping (close connections)
    - Fix some test timeout issues under yath due to ^
    - Update copyright date

0.000010  2019-06-08 13:03:48-07:00 America/Los_Angeles

    - More work for issue #1

0.000009  2019-05-29 21:49:45-07:00 America/Los_Angeles

    - Work for issue #1

0.000008  2019-04-28 08:41:10-07:00 America/Los_Angeles

    - Make PostgresQL use UTF8

0.000007  2018-01-29 14:23:53-08:00 America/Los_Angeles

    - Make SQLite work without the sqlite3 binary

0.000006  2018-01-29 12:59:54-08:00 America/Los_Angeles

    - Fix for postgres with alternate hardcoded port numbers

0.000005  2018-01-29 09:00:44-08:00 America/Los_Angeles

    - ENV var safety

0.000004  2018-01-28 20:29:12-08:00 America/Los_Angeles

    - More complete docs
    - More complete testing
    - Significant MySQL speed improvements
    - Better diagnostics from all drivers

0.000003  2018-01-28 12:50:32-08:00 America/Los_Angeles

    - Add sqlite driver

0.000002  2018-01-28 09:08:30-08:00 America/Los_Angeles

    - Minor bug fixes
    - Add diagnostics for tests

0.000001  2018-01-28 00:09:47-08:00 America/Los_Angeles

    - Initial Release
