Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
11d8290
test: add a persona soak harness with an invariant oracle
hardbyte Nov 5, 2026
311aa2f
test(persona-soak): harden the harness after smoke runs
hardbyte Nov 5, 2026
f29a890
test(persona-soak): add admin UI and Python personas, forensics for l…
hardbyte Nov 5, 2026
b165a7d
test(persona-soak): keep Python ledger import prompt, wait for Python…
hardbyte Nov 5, 2026
2c6e5b7
test(persona-soak): size the UI and Python personas down, ignore manu…
hardbyte Nov 5, 2026
95f700d
test(persona-soak): stop the load phase when the disk runs low
hardbyte Nov 5, 2026
55f1ee7
test(persona-soak): filter the instrumented server's log, detect cras…
hardbyte Nov 5, 2026
76d7274
test(persona-soak): bound the instrumented server's log with a filter…
hardbyte Nov 5, 2026
7cf7b04
test(persona-soak): drop the instrumented server's statement echoes too
hardbyte Nov 5, 2026
c04e10f
test(persona-soak): keep worker evidence when a producer registers la…
hardbyte Nov 5, 2026
d024b7b
test(persona-soak): no parallel query on the -O0 engine
hardbyte Nov 5, 2026
681019d
test(persona-soak): stop the admin server when the harness exits
hardbyte Nov 5, 2026
9f973e1
test(persona-soak): configurable admin server pool and operator read …
hardbyte Nov 5, 2026
2d95deb
test(persona-soak): optional CPU limit for the database containers
hardbyte Nov 5, 2026
32117ac
test(persona-soak): default the assert-enabled engine to the uninstru…
hardbyte Nov 5, 2026
3b3edb8
test(persona-soak): add a fan-out persona
hardbyte Nov 5, 2026
3ff540f
test(persona-soak): add a shard operator persona
hardbyte Nov 6, 2026
ffd9773
test(persona-soak): report lane-creation races and job detail for rep…
hardbyte Nov 6, 2026
4a5fb70
test(persona-soak): add a claim-and-abandon persona
hardbyte Nov 6, 2026
e7d795a
test(persona-soak): detect claims rescued from a live process
hardbyte Nov 6, 2026
20e065e
test(persona-soak): heartbeat interval and staleness knobs, heartbeat…
hardbyte Nov 6, 2026
5a87146
test(persona-soak): measure heartbeat passes over the live process's …
hardbyte Nov 6, 2026
576de91
test(persona-soak): detect a finished heartbeat pass against the prev…
hardbyte Nov 6, 2026
c81b588
test(persona-soak): measure a heartbeat pass only from a fresh reading
hardbyte Nov 6, 2026
c73e309
Require durable sampled proof in persona soak oracle
hardbyte Nov 6, 2026
91217ad
Observe Python migration pools only after readiness
hardbyte Nov 6, 2026
3933d13
Keep materialized claims in the soak ring oracle
hardbyte Nov 6, 2026
535993a
Keep Python workers draining across startup and process restarts
hardbyte Nov 6, 2026
6d425cd
Retain durable proof when lifecycle callbacks are missed
hardbyte Nov 6, 2026
5ea5fb2
test(persona-soak): fence live-owner probes across process kill
hardbyte Nov 6, 2026
4d1065d
test(persona-soak): capture bounded claim-ring lock evidence
hardbyte Nov 6, 2026
fe1632f
test(persona-soak): fence observed terminal states by attempt
hardbyte Nov 6, 2026
b5f314c
ci: cover supported Python and PostgreSQL versions on 0.6
hardbyte Nov 6, 2026
412419f
test: require acknowledged close for probe leak evidence
hardbyte Nov 6, 2026
0559d2e
Keep soak backlog closure membership correlated
hardbyte Nov 6, 2026
d477a1b
docs(python): state the tested runtime support policy
hardbyte Nov 6, 2026
66734e8
fix: close read connections when BEGIN is cancelled (#657)
hardbyte Nov 6, 2026
1b2437b
Keep compact receipt closure membership correlated
hardbyte Nov 6, 2026
42b7197
Prune unrelated receipt closure partitions
hardbyte Nov 6, 2026
d889806
perf: parameterize completed receipt kind lookups
hardbyte Nov 6, 2026
b3a850f
fix: include open receipt jobs in admin reads without prelocks
hardbyte Nov 6, 2026
7be41b5
perf: avoid repeated terminal probes for open receipts
hardbyte Nov 6, 2026
1f391b5
fix: retain bodies of aged rescued failures
hardbyte Nov 6, 2026
0e6b326
merge: compose receipt admin reads with reviewed read-query fixes
hardbyte Nov 6, 2026
72107d3
Merge pull request #654 from hardbyte/brian/test-supported-runtime-ma…
hardbyte Nov 6, 2026
3be1d64
Merge pull request #655 from hardbyte/brian/perf-receipt-membership-0.6
hardbyte Nov 6, 2026
838443d
Merge pull request #658 from hardbyte/brian/fix-receipt-admin-reads-n…
hardbyte Nov 6, 2026
85f9d8d
fix: resolve rescued terminal bodies from live ready lanes
hardbyte Nov 6, 2026
d8fd2d9
Recover retained terminal bodies across aged legacy keys
hardbyte Nov 6, 2026
abf1015
Preserve recovered lane priority through manual DLQ moves
hardbyte Nov 7, 2026
a87a577
Bound partition locks retained by admin reads
hardbyte Nov 7, 2026
75a29b9
Merge pull request #659: retain bodies of aged rescued failures
hardbyte Nov 7, 2026
95c392c
Merge pull request #660: bound partition locks retained by admin reads
hardbyte Nov 7, 2026
74e2283
Merge release fixes into persona soak coverage
hardbyte Nov 7, 2026
2b3fe88
Prepare 0.6.14-alpha.1 metadata and release notes
hardbyte Nov 7, 2026
58c1b7d
Merge pull request #644: exercise abandoned-claim recovery in persona…
hardbyte Nov 7, 2026
28a7af1
Merge pull request #661: prepare 0.6.14-alpha.1
hardbyte Nov 7, 2026
61db389
Fix claim aging race and retained body hydration
hardbyte Nov 7, 2026
f473016
Preserve claimed bodies across historical aging collisions
hardbyte Nov 7, 2026
79d4828
Recover retained active bodies and retire old aging copies
hardbyte Nov 7, 2026
2681497
Fix claim aging race and retained body hydration on 0.6 (#663)
hardbyte Nov 7, 2026
d30ee74
Use installed ready slots for retained body recovery
hardbyte Nov 7, 2026
5f29357
Fix installed-slot retained body recovery (#665)
hardbyte Nov 7, 2026
fce272e
Isolate retained recovery contention in rescue and completion batches
hardbyte Nov 7, 2026
59649b2
Keep completion contention fixtures from changing shared storage routing
hardbyte Nov 7, 2026
09e502b
Merge pull request #666: isolate retained recovery contention
hardbyte Nov 7, 2026
242d2ee
Retry queue-storage finalization on head contention
hardbyte Nov 7, 2026
6d39579
Keep accepted completions owned beyond the retry window
hardbyte Nov 7, 2026
8e1491b
Merge pull request #667: Retry worker finalization after transient lo…
hardbyte Nov 7, 2026
0825d37
fix(queue-storage): refresh SET-only lane repairs on 0.6
hardbyte Nov 7, 2026
356758e
Merge pull request #668 from hardbyte/brian/fix-set-only-lane-repair-0.6
hardbyte Nov 7, 2026
47e9e5b
fix(queue-storage): bound promotion's lock wait to its lane locks (0.6)
hardbyte Nov 7, 2026
d4d372e
fix(queue-storage): skip an ambiguous attempt in rescue instead of fa…
hardbyte Nov 7, 2026
298fc35
fix(queue-storage): wake claimers after promotion's lane commits (0.6)
hardbyte Nov 7, 2026
e634558
docs: external-runner and trigger-privilege cautions for 0.6.14 lane …
hardbyte Nov 7, 2026
f32376d
fix(cli): reject migrate --sql combined with --extract-to
hardbyte Nov 7, 2026
f8466f4
fix(worker): keep a committed transition when its event re-read fails…
hardbyte Nov 8, 2026
8bf3e59
test(soak): copy ci_timing with the harness when soaking another revi…
hardbyte Nov 8, 2026
da46657
perf(worker): build the completion event from the worker's copy (0.6)
hardbyte Nov 8, 2026
5915af1
docs: note the completion event no longer re-reads the job
hardbyte Nov 8, 2026
6a84e1c
Merge pull request #672: promotion notify, rescue ambiguity and compl…
hardbyte Nov 8, 2026
a8febdc
chore: prepare 0.6.14 release (#676)
hardbyte Nov 8, 2026
c247e46
Merge release fixes into finalization backpressure branch
JosiahBull Nov 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -204,14 +204,18 @@ jobs:
# canonical, so this leg re-runs it with the queue-storage engine active on a
# fresh database (a separate DB avoids cross-engine job_unique_claims carryover).
rust-test-queue-storage:
name: Rust tests (queue_storage)
name: Rust tests (queue_storage, pg${{ matrix.postgres }})
needs: [rust-build]
if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'full-ci')
runs-on: ubuntu-latest
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
postgres: ["17", "18"]
services:
postgres:
image: postgres:17-alpine
image: postgres:${{ matrix.postgres }}-alpine
env:
POSTGRES_PASSWORD: postgres
POSTGRES_DB: awa_test
Expand Down Expand Up @@ -314,10 +318,14 @@ jobs:

# ─── Python (awa-python) ────────────────────────────────
python-build-test:
name: Python build + test
name: Python build + test (${{ matrix.python }})
if: github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'full-ci')
runs-on: ubuntu-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
python: ["3.14", "3.15"]
services:
postgres:
image: postgres:17-alpine
Expand All @@ -342,7 +350,7 @@ jobs:
workspaces: "awa-python -> awa-python/target"
- uses: actions/setup-python@v6
with:
python-version: "3.12"
python-version: ${{ matrix.python }}
- name: Install uv
uses: astral-sh/setup-uv@v8.2.0
- name: Create venv and install deps
Expand Down
251 changes: 76 additions & 175 deletions CHANGELOG.md

Large diffs are not rendered by default.

18 changes: 9 additions & 9 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ members = [
exclude = ["awa-python", "spike"]

[workspace.package]
version = "0.6.13"
version = "0.6.14"
edition = "2021"
license = "MIT OR Apache-2.0"
description = "Postgres-native background job queue — transactional enqueue, heartbeat crash recovery, SKIP LOCKED dispatch"
Expand All @@ -25,11 +25,11 @@ categories = ["database", "asynchronous", "web-programming"]

[workspace.dependencies]
# Internal crates
awa-model = { path = "awa-model", version = "0.6.13" }
awa-macros = { path = "awa-macros", version = "0.6.13" }
awa-metrics = { path = "awa-metrics", version = "0.6.13" }
awa-worker = { path = "awa-worker", version = "0.6.13" }
awa = { path = "awa", version = "0.6.13" }
awa-model = { path = "awa-model", version = "0.6.14" }
awa-macros = { path = "awa-macros", version = "0.6.14" }
awa-metrics = { path = "awa-metrics", version = "0.6.14" }
awa-worker = { path = "awa-worker", version = "0.6.14" }
awa = { path = "awa", version = "0.6.14" }

# Database
sea-orm = { version = "=2.0.0-rc.38", default-features = false, features = ["sqlx-postgres", "runtime-tokio-rustls", "with-chrono", "with-json"] }
Expand Down
4 changes: 2 additions & 2 deletions awa-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ path = "src/main.rs"
[dependencies]
awa-model.workspace = true
awa-worker.workspace = true
awa-ui = { path = "../awa-ui", version = "0.6.13" }
awa-ui = { path = "../awa-ui", version = "0.6.14" }
axum.workspace = true
sqlx.workspace = true
tokio.workspace = true
Expand All @@ -28,5 +28,5 @@ hex.workspace = true
uuid.workspace = true

[dev-dependencies]
awa-testing = { path = "../awa-testing", version = "0.6.13" }
awa-testing = { path = "../awa-testing", version = "0.6.14" }
assert_cmd = "2"
2 changes: 1 addition & 1 deletion awa-cli/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "maturin"

[project]
name = "awa-cli"
version = "0.6.13"
version = "0.6.14"
description = "CLI for the Awa Postgres-native job queue (migrations, admin, serve)"
readme = "README.md"
requires-python = ">=3.10"
Expand Down
2 changes: 1 addition & 1 deletion awa-cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ enum Commands {
#[arg(long)]
extract_to: Option<String>,
/// Print migration SQL to stdout instead of applying
#[arg(long)]
#[arg(long, conflicts_with = "extract_to")]
sql: bool,
/// Only include migrations after this version (exclusive)
#[arg(long)]
Expand Down
40 changes: 29 additions & 11 deletions awa-model/migrations/v023_install_queue_storage_substrate.sql
Original file line number Diff line number Diff line change
Expand Up @@ -511,13 +511,12 @@ AS $problems$
AND NOT candidate.rolsuper
AND pg_has_role(candidate.oid, lane_sequence.relowner, 'USAGE')
AND (lane_sequence.relowner = lane_sequence.nspowner
OR (pg_has_role(candidate.oid, lane_sequence.nspowner, 'USAGE')
AND pg_has_role(
OR pg_has_role(
candidate.oid,
lane_sequence.nspowner,
CASE WHEN current_setting('server_version_num')::int >= 160000
THEN 'SET' ELSE 'MEMBER' END
)))
))
ORDER BY candidate.rolname
)
FROM lane_sequence
Expand Down Expand Up @@ -555,6 +554,9 @@ AS $repair$
DECLARE
v_problem RECORD;
v_remaining RECORD;
v_original_role TEXT := current_setting('role');
v_reassigned BOOLEAN := false;
v_role_changed BOOLEAN := false;
v_busy BOOLEAN := false;
v_set_mode TEXT := CASE WHEN current_setting('server_version_num')::int >= 160000
THEN 'SET' ELSE 'MEMBER' END;
Expand All @@ -576,6 +578,7 @@ BEGIN
AND pg_has_role(current_user, to_regrole(quote_ident(v_problem.expected_owner)), v_set_mode) THEN
BEGIN
EXECUTE v_problem.reassign_sql;
v_reassigned := true;
EXCEPTION WHEN insufficient_privilege THEN
NULL;
END;
Expand All @@ -585,14 +588,29 @@ BEGIN
FROM awa.lane_sequence_problems(p_schema, p_sequence) AS problem;
IF FOUND
AND cardinality(v_remaining.missing_grants) > 0
AND pg_has_role(current_user, to_regrole(quote_ident(v_remaining.owner)), 'USAGE') THEN
FOREACH v_statement IN ARRAY v_remaining.missing_grants LOOP
BEGIN
EXECUTE v_statement;
EXCEPTION WHEN insufficient_privilege THEN
NULL;
END;
END LOOP;
AND (pg_has_role(current_user, to_regrole(quote_ident(v_remaining.owner)), 'USAGE')
OR v_reassigned) THEN
BEGIN
IF v_reassigned
AND NOT pg_has_role(current_user, to_regrole(quote_ident(v_remaining.owner)), 'USAGE') THEN
PERFORM set_config('role', v_remaining.owner, true);
v_role_changed := true;
END IF;

FOREACH v_statement IN ARRAY v_remaining.missing_grants LOOP
BEGIN
EXECUTE v_statement;
EXCEPTION WHEN insufficient_privilege THEN
NULL;
END;
END LOOP;

IF v_role_changed THEN
PERFORM set_config('role', v_original_role, true);
END IF;
EXCEPTION WHEN insufficient_privilege THEN
NULL;
END;
END IF;
EXCEPTION WHEN lock_not_available THEN
v_busy := true;
Expand Down
Loading