DBIx-QuickDB
view release on metacpan or search on metacpan
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 conn...
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 i...
- 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 Wi...
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, corr...
- 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 wind...
- 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), a...
- 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 In...
- 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 es...
- 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 assert...
- 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 ...
- 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/ co...
- 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, 1...
- 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...
- 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-...
- 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 ...
- 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 lon...
- 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 tha...
- 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 g...
- 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 ...
- 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 an...
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)
( run in 0.663 second using v1.01-cache-2.11-cpan-800906f7e73 )