feat(broker): migrations-based install, roles, RLS, and job dependency groups
Replace the ad-hoc tables/procedures install layout with versioned, ordered SQL migrations tracked in broker_schema_migrations. Add optional least-privilege role provisioning (--with-roles), multi-tenant row-level security, lease-based job claiming with stale-lease recovery, and job dependencies -- both by job id and by fan-in job group. Add Docker/Compose support for running the broker and its test suite.
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
-- Adds job groups: every job belongs to a job_group (defaults to its own
|
||||
-- job_name when not given explicitly, set by broker_add_job). A dependency
|
||||
-- can now target a whole group instead of a single job id -- the dependent
|
||||
-- job is claimable once every job tagged with that group has completed
|
||||
-- (complete_status = 2); already-completed group members simply drop out of
|
||||
-- the gating check, they don't need to have existed at any particular time.
|
||||
-- The existing id-based dependency (broker_job_dependency.depends_on_job_id)
|
||||
-- is kept as-is; each dependency row targets exactly one of an id or a group.
|
||||
|
||||
ALTER TABLE broker.broker_jobs ADD COLUMN IF NOT EXISTS job_group TEXT;
|
||||
UPDATE broker.broker_jobs SET job_group = job_name WHERE job_group IS NULL;
|
||||
ALTER TABLE broker.broker_jobs ALTER COLUMN job_group SET NOT NULL;
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_broker_jobs_group
|
||||
ON broker.broker_jobs (tenant_id, job_group, complete_status);
|
||||
|
||||
ALTER TABLE broker.broker_job_dependency DROP CONSTRAINT IF EXISTS broker_job_dependency_pkey;
|
||||
ALTER TABLE broker.broker_job_dependency ALTER COLUMN depends_on_job_id DROP NOT NULL;
|
||||
ALTER TABLE broker.broker_job_dependency ADD COLUMN IF NOT EXISTS depends_on_group TEXT;
|
||||
ALTER TABLE broker.broker_job_dependency ADD COLUMN IF NOT EXISTS id_broker_job_dependency BIGSERIAL;
|
||||
ALTER TABLE broker.broker_job_dependency ADD PRIMARY KEY (id_broker_job_dependency);
|
||||
|
||||
ALTER TABLE broker.broker_job_dependency DROP CONSTRAINT IF EXISTS broker_job_dependency_one_target;
|
||||
ALTER TABLE broker.broker_job_dependency ADD CONSTRAINT broker_job_dependency_one_target CHECK (
|
||||
(depends_on_job_id IS NOT NULL AND depends_on_group IS NULL) OR
|
||||
(depends_on_job_id IS NULL AND depends_on_group IS NOT NULL)
|
||||
);
|
||||
|
||||
-- Plain (non-partial) unique constraint, matching the old PK's guarantee --
|
||||
-- NULLs in depends_on_job_id (the group-dependency rows) are never
|
||||
-- considered equal by a standard unique constraint, so this only constrains
|
||||
-- id-based rows, and keeps "ON CONFLICT (job_id, depends_on_job_id)" (no
|
||||
-- predicate needed) working for existing callers.
|
||||
ALTER TABLE broker.broker_job_dependency DROP CONSTRAINT IF EXISTS broker_job_dependency_unique_id;
|
||||
ALTER TABLE broker.broker_job_dependency ADD CONSTRAINT broker_job_dependency_unique_id
|
||||
UNIQUE (job_id, depends_on_job_id);
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS idx_broker_job_dependency_unique_group
|
||||
ON broker.broker_job_dependency (job_id, depends_on_group) WHERE depends_on_group IS NOT NULL;
|
||||
|
||||
COMMENT ON COLUMN broker.broker_jobs.job_group IS 'Group tag for this job; defaults to job_name. Other jobs can depend on the whole group.';
|
||||
COMMENT ON COLUMN broker.broker_job_dependency.depends_on_group IS 'Alternative to depends_on_job_id: job_id is not claimable until every job with job_group = depends_on_group has completed';
|
||||
Reference in New Issue
Block a user