docs(push): clarify acceptable enrollment overlap

Signed-off-by: Tom Brow <tomb@block.xyz>
This commit is contained in:
Tom Brow
2026-10-09 12:47:05 -07:00
parent 3164b25cde
commit 9d3d710dc1
3 changed files with 11 additions and 7 deletions

View File

@@ -158,9 +158,9 @@ async fn enqueue(pool: &PgPool, job: &Job) -> crate::Result<()> {
.bind(crate::push::push_gate_lock_key(job.community)) .bind(crate::push::push_gate_lock_key(job.community))
.execute(&mut *tx) .execute(&mut *tx)
.await?; .await?;
// Do not enqueue solely because a lease first appeared after the // Compare recorded receipt/update times without imposing commit ordering.
// message arrived. Updates racing this check may drop a wake, which is // Registration overlapping message arrival may send or suppress a wake.
// permitted by the best-effort contract; message storage is authoritative. // This bounded job never scans historical messages on lease activation.
sqlx::query( sqlx::query(
"INSERT INTO push_match_queue (community_id, event_id) \ "INSERT INTO push_match_queue (community_id, event_id) \
SELECT $1, $2 FROM events e \ SELECT $1, $2 FROM events e \

View File

@@ -998,8 +998,9 @@ async fn assert_async_isolation(db: &Db, community: CommunityId, keys: &Keys) {
.unwrap(); .unwrap();
assert_eq!(match_count(&isolated, community, &healthy).await, 1); assert_eq!(match_count(&isolated, community, &healthy).await, 1);
// If activation finishes while a post-commit job waits, it must not create // Exercise the timestamp filter with a lease timestamp explicitly newer
// a wake solely for a lease that appeared after the message was received. // than this message. This is not a production activation-order regression:
// registration overlapping message arrival may send or suppress a wake.
let later = create_community(db.pool()).await; let later = create_community(db.pool()).await;
let mut activation = db.pool().begin().await.unwrap(); let mut activation = db.pool().begin().await.unwrap();
sqlx::query("SELECT pg_advisory_xact_lock(hashtextextended($1, 0))") sqlx::query("SELECT pg_advisory_xact_lock(hashtextextended($1, 0))")

View File

@@ -294,8 +294,11 @@ reject or roll back a committed message, and there is no replay/backfill of
in-memory work. Monitor `buzz_push_enqueue_total` by result (`completed`, `full`, in-memory work. Monitor `buzz_push_enqueue_total` by result (`completed`, `full`,
`transaction_full`, `closed`, `error`, `timeout`, `shutdown`). `completed` includes `transaction_full`, `closed`, `error`, `timeout`, `shutdown`). `completed` includes
jobs with no eligible lease. Database enqueue is conditional on a live event and jobs with no eligible lease. Database enqueue is conditional on a live event and
an eligible lease last updated no later than event receipt. A concurrent lease an eligible lease whose recorded update timestamp is no later than event receipt.
update can suppress a notification under this best-effort contract. These timestamps do not establish transaction commit order. When registration
and message arrival overlap, either sending or suppressing the notification is
acceptable; there is no exact enrollment-order guarantee. Activation never scans
historical messages or deliberately backfills older notifications.
This isolation requires the overlap migration and updated writers. Old images This isolation requires the overlap migration and updated writers. Old images
and raw SQL writers can still run the legacy transactional trigger until replaced. and raw SQL writers can still run the legacy transactional trigger until replaced.