Repository navigation
Make the outbox, scheduling locks and CI database-agnostic - #14
Merged
Merged
Conversation
added 30 commits
October 12, 2026 18:10
…d refuses what it cannot parse
…fixing the RabbitMQ URL form and the lumen consume command
…ainst the brokers, mirrored locally by docker-compose.integration.yml
…rt from the driver and server version
…pter packages and register them everywhere
…upgrade migration; eda-postgres keeps the old names as deprecated subclasses
…DPAST and portable optimistic-lease claims, chosen by server capability
…ny connection; PostgresEventPublisher adds only the in-transaction pg_notify
…very so any number of consumers is safe; PostgresEventConsumer adds LISTEN/NOTIFY
…ys is safe; settings read firefly.eda.database.* with the postgres keys as aliases
…ls back to its postgres alias
…outbox — writer, pre-commit hook, leased consumer and an outbox health indicator
… pg_notify and LISTEN, reading the shared outbox settings
…ox row exactly once on PostgreSQL, MySQL, MariaDB, SQL Server and SQLite
…refly.eda.dead-letter.store, and firefly:eda:dead-letters:replay
…ind firefly.messaging.dead-letter.store, and firefly:messaging:dead-letters:replay
…t, so a long or non-UTF-8 key no longer fails the insert
…aw bytes and millisecond instants on every server
…DistributedLock behind firefly.scheduling.lock.provider=database
… MariaDB behind firefly.scheduling.lock.provider=mysql
…k over a real Redis for the brokers lane
…store it, proven with the other drivers' timeouts on real servers
…cking proven on every real server
…rt matrix, the integration lanes, and the W1 changelog
…ay oldest first, keyed by monotonic UUIDv7 ids
…ot only Postgres, with same-transaction atomicity
… SQL Server certificates by default, and create sqlite test files privately
…as the memory store does
added 4 commits
October 12, 2026 22:31
…e runner image already ships one
…repared SET is undone when sp_prepexec returns
…ver, where a plain read waits on it
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
LaraFly's same-transaction outbox, scheduling locks and CI no longer depend on PostgreSQL alone.
What changes
firefly/eda-database(firefly.eda.provider=database): the outbox on any Laravel connection. Rows are claimed by a lease committed before delivery, through anOutboxClaimStrategychosen from the server version:SKIP LOCKEDon PostgreSQL, MySQL 8.0.1+ and MariaDB 10.6+,READPASTon SQL Server, and a portable optimistic lease elsewhere (SQLite, unknown drivers). It can be overridden withfirefly.eda.database.claim-strategy.firefly/eda-postgresis now the database outbox pluspg_notify/LISTEN. The old classes andfirefly.eda.postgres.*keys still work as deprecated subclasses and aliases. The outbox table gainsclaimed_by/claimed_until(upgrade migration included)....dead-letter.store=database), with replay commands.firefly/scheduling-database:lock.provider=database(a portable lease table) andlock.provider=mysql(GET_LOCK, MySQL and MariaDB).integrationjob matrix over PostgreSQL 16, MySQL 8.4, MariaDB 11 and SQL Server 2022;brokersjob for RabbitMQ, Kafka and Redis;composer test:integrationanddocker-compose.integration.ymlto run the same lanes locally.LOCK_TIMEOUTbranch), and pessimistic/optimistic locking.Fixed
FOR UPDATE SKIP LOCKEDlock ended with its statement, and on other drivers the claim was an unlocked read. Two racing processes are now integration-tested to deliver every row exactly once on each server.samples/lumenintegration test that called a non-existentfirefly:eda:consumecommand.IntegrationDsnnever echoes a DSN (and its password) in errors, validates SQL Server certificates by default, creates SQLite test files in a private 0700 directory, and does not let a URL query override host or credentials.Verification
composer check(Pint, PHPStan max, Pest, Deptrac): exit 0, 5877 tests passed.pest --group integrationagainst real PostgreSQL 16, MySQL 8.4, MariaDB 11, RabbitMQ, Kafka and Redis: 124 passed, 0 failed. The 16 skips are SQL Server tests, which run only in the new CI lane because there is no arm64 image locally.