DBIx-QuickDB
view release on metacpan or search on metacpan
0.000065 2026-08-11 10:03:34-07:00 America/Los_Angeles
- Release tarballs no longer carry the internal agent and developer
Markdown files, the AI_DOCS directory, or perltidyrc. README.md still
ships.
- Test machinery only, no runtime change: t/watcher_fast_kill.t and
t/server_exit_status.t no longer fail on a heavily loaded host, whose
scheduling delays outran timing windows those tests did not need to
keep tight.
0.000064 2026-08-08 17:32:34-07:00 America/Los_Angeles
- Test machinery only, no runtime change: a host that runs out of System V
IPC partway through a Pool test now skips the rest as intended. The
signal could not survive the two boundaries it had to cross -- require
stringifies an exception thrown from the file it is loading, and subtest
turns one into a failure without rethrowing -- so the Pool wrappers never
recognized it and failed instead. FreeBSD smokers hit this on every
0.000063 run.
- Test machinery only, no runtime change: when an isolated per-install
child dies without leaving TAP, the parent now reports how it died, the
phase it had reached, and the last Test2 context it recorded. Before,
the harness could only say "Tests: 0 / No plan found in TAP output".
0.000063 2026-08-07 13:00:01-07:00 America/Los_Angeles
- Fixed t/watcher_inc_args.t on MSWin32, where Cwd::abs_path and
File::Temp spell the same path with different directory separators. The
test also restores @INC before assertions so older Perls can report a
failure without losing their diagnostic modules.
0.000062 2026-08-06 15:35:35-07:00 America/Los_Angeles
- Pool instance directory names now include the pid. Identically-seeded or
forked processes drew the same File::Temp names and could recycle a freed
one, letting two processes copy into one directory and corrupt a clone.
- Pool instance directory names are now sanitized and length-capped, via the
new Pool->instance_dir_user. An '@' or '\' in a login no longer reaches
the File::Temp template verbatim.
- UPGRADE NOTE: instance directory names grow by up to 8 characters, against
the 107-byte limit on unix socket paths. An instance_dir already close to
that limit may need shortening.
- clone_dir failures now report the decoded exit code, any terminating
signal, both paths and the tool's stderr, instead of a raw wait status
such as "rsync returned 5888".
- clone_dir now retries an rsync exit 23 (partial transfer) twice before
giving up, and warns when a retry recovers.
- The watcher now reaps its server. A server that died during startup became
a zombie, and kill(0) succeeds on a zombie, so start() called it alive and
waited out the whole QDB_START_TIMEOUT; it now fails in milliseconds with
the real exit status.
- The watcher now resets SIGCHLD to its default before spawning the server.
An application that ignores SIGCHLD had the kernel reap the server first,
leaving no exit status to record.
- Watcher teardown now removes a disposable data directory even when the
server cannot be stopped. Reusable directories (cleanup => 0, used for
Pool templates) are still never removed.
- Watcher teardown failures now report their reason instead of a bare
"Warning: something's wrong".
- The watcher no longer re-execs itself with a hardcoded relative "-Ilib",
which could load a different version of the watcher than the process that
spawned it. It forwards the parent's own resolution, fixed at load time.
0.000061 2026-08-02 19:49:26-07:00 America/Los_Angeles
- Per-install tests now use real child Perl processes on MSWin32 instead of
Test2's unsupported thread-based pseudo-fork. Single-install child TAP is
streamed directly so an XS crash retains its preceding diagnostics.
0.000060 2026-08-02 00:07:51-07:00 America/Los_Angeles
- Windows cleanup now backs off between quarantine rename attempts so a
transient sharing lock cannot defeat every retry in a tight loop. A
terminal removal failure reports the affected directory and OS error,
and the Windows regression tests preserve those diagnostics.
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
- 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)
- 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
( run in 2.603 seconds using v1.01-cache-2.11-cpan-14f38c9f855 )