Revision history for JobQueue
0.1.3 2026-10-24T19:48:18+01:00
- [2026-10-24] Fix a data race in JobQueue::Coordinator: tick,
find-jobs and active-count handed back a lazy sequence from inside
the lock, so the walk over the job table ran after the lock was
released while submit inserted into it and tick pruned from it,
which could end a run with a MoarVM "stale hashtable pointer" crash.
The walks, the queue-registry walks (tick, cancel, find-job,
cancel-most-recent-in-scope, total-active) and the per-job
bookkeeping and dependency-handoff copies now complete inside the
critical section, so callers always get a snapshot. The held-too-long
warning is now tested and set under the lock as well.
0.1.2 2026-10-05T10:53:36+01:00
- Retain a bounded FIFO cache of terminal dependency outcomes in
JobQueue::Coordinator. Late hard/soft dependents submitted after
a predecessor Job object is pruned now resolve the predecessor's
done, failure, cancelled or superseded outcome instead of treating
it as unknown; evicted hard/soft dependencies keep the existing
unknown-dependency behavior.
- Record each Job's last dependency-readiness decision as compact
scalar metadata exposed through dependency-state and included in
queue snapshots, so observers can explain blocked, doomed and
released jobs without re-running scheduler logic or retaining
dependency result bodies.
- Add Queue.physical-job-ids for an atomic pending+running id
snapshot that includes cancelled or superseded runners until
their physical drain completes.
0.1.1 2026-08-21T21:30:35+01:00
- Make dedup lookup plus pending insertion one atomic queue transition.
Concurrent producers of one live key now all receive the same job;
the key is reusable once that job becomes terminal.
0.1.0 2026-08-10T19:52:26+01:00
- Initial release
- JobQueue::Job role: atomic terminal transitions (finish /
request-cancel / begin-running), cancel + completion Promises,
dedup keys, lanes, priorities, hard/soft dependency edges, and
the keep-once atomic Promise settler
- JobQueue::Queue: per-resource serial/parallel queue with
re-evaluated parallelism policy, max-concurrent cap, lane
serialisation, priority dispatch, live-job dedup, deferred
cancel terminals and an optional store event sink
- JobQueue::Coordinator: named-queue registry plus a cross-queue
dependency DAG with hold/release, dep-result injection and
transitive supersede cascades over hard edges
- JobQueue::FailedRegistry: capped, insertion-ordered registry of
failed/cancelled jobs with atomic claim-for-retry
- Injectable log + tracer (null objects by default) and an
EventSink documentation role
- JobQueue::Job's role and keep-once sub are package-scoped as
well as exported, so a host application can wrap the role in
its own facade module (need + fully-qualified name) and
re-export both without a name clash