gabriel / musehub public
musehub_jobs_models.py python
67 lines 2.8 KB
Raw
sha256:d035733f21ccff27735fddebfbbe0ed24565a32a22db8de5885402262671ecd2 chore: bump version to 0.2.0rc15 for musehub#113 fix release Sonnet 4.6 patch 16 days ago
1 """ORM models for the background job queue.
2
3 Tables:
4 - musehub_background_jobs: Durable job queue — web process enqueues, worker process executes
5 """
6
7 from __future__ import annotations
8
9 from datetime import datetime, timezone
10
11 from sqlalchemy import DateTime, ForeignKey, Index, Integer, String, Text
12 from sqlalchemy.orm import Mapped, mapped_column
13 from sqlalchemy.dialects.postgresql import JSONB
14
15 from musehub.db.database import Base
16 from musehub.types.json_types import JSONObject, JSONValue # JSONValue needed for ForwardRef resolution in Mapped[]
17
18
19 def _utc_now() -> datetime:
20 return datetime.now(tz=timezone.utc)
21
22
23 class MusehubBackgroundJob(Base):
24 """A durable background job enqueued by the web process and processed by the worker.
25
26 The web process (uvicorn) never executes job logic directly — it only
27 inserts a row here. A separate worker process polls this table, claims
28 rows with ``FOR UPDATE SKIP LOCKED``, and runs the work outside the web
29 server's memory space so a crash in the worker cannot affect request handling.
30
31 Supported job_type values:
32 ``intel.code`` — rebuild code intelligence for a repo.
33 payload: {"head": "<commit_id>"}
34 ``intel.structural`` — compute cross-domain structural intelligence.
35 payload: {"head": "<commit_id>"}
36 ``gc`` — prune commits and snapshots unreachable from any branch.
37 payload: {}
38
39 Status lifecycle:
40 pending → running → done
41 → failed (attempt < max_attempts)
42 └→ pending (retried by worker after transient failure)
43 """
44
45 __tablename__ = "musehub_background_jobs"
46 __table_args__ = (
47 Index("ix_musehub_background_jobs_status_created", "status", "created_at"),
48 )
49
50 job_id: Mapped[str] = mapped_column(String(128), primary_key=True)
51 repo_id: Mapped[str] = mapped_column(
52 String(128),
53 ForeignKey("musehub_repos.repo_id", ondelete="CASCADE"),
54 nullable=False,
55 index=True,
56 )
57 job_type: Mapped[str] = mapped_column(String(64), nullable=False)
58 payload: Mapped[JSONObject] = mapped_column(JSONB, nullable=False, default=dict)
59 status: Mapped[str] = mapped_column(String(16), nullable=False, default="pending", server_default="pending", index=True)
60 created_at: Mapped[datetime] = mapped_column(
61 DateTime(timezone=True), nullable=False, default=_utc_now
62 )
63 claimed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
64 done_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
65 attempt: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
66 error: Mapped[str | None] = mapped_column(Text, nullable=True)
67 quarantine_reason: Mapped[str | None] = mapped_column(Text, nullable=True)
File History 11 commits
sha256:d035733f21ccff27735fddebfbbe0ed24565a32a22db8de5885402262671ecd2 chore: bump version to 0.2.0rc15 for musehub#113 fix release Sonnet 4.6 patch 16 days ago
sha256:0032d6cfa33bc3c8367436ad768e7dd0e339b4332153160247da8266cb5fa352 Merge branch 'task/version-tags-phase3-server' into dev Human 18 days ago
sha256:4669620efda9ff41c55bdefd1f7bfe1c239d468428744c84ead9957e5a003a53 merge: rescue snapshot-recovery hardening (c00aa21d) into d… Opus 4.8 minor 31 days ago
sha256:a59da49c4611b970fc4b6ae48678ce4943261c213a07ddbd73ce9201df869b4a fix: remove false-positive proposal_comments index drop fro… Sonnet 4.6 patch 35 days ago
sha256:0a240d6dbff234f07d98a28a4a9a68db702f3f9ff9260196f24219bdb1c0b6f3 feat: render markdown mists as HTML with heading anchor links Sonnet 4.6 patch 36 days ago
sha256:24a7d47486ebc4ebd1832830580e177ec6f877b48dced8c000e198cdec4ce9d6 Merge 'task/bump-version-rc12' into 'dev' — proposal: Bump … Human 37 days ago
sha256:b9ff931d147e0114a1f17060f415b89ed551c170a91ff226c70437aa5c85f9ee Merge 'task/bump-version-rc12' into 'dev' — proposal: Bump … Human 37 days ago
sha256:d1122d21e73471879b460037b22c0b50fded7c423444a176f248428f75dac39c Merge 'task/fix-issue-pagination-cursor' into 'dev' — propo… Human 37 days ago
sha256:01e18975e73d2b3cd5b6db7929c895bef9aa6e0d4391dc5b2adfc548b41318dd Merge 'feat/adding-debug-logs-to-staging' into 'dev' — prop… Human 37 days ago
sha256:6b1949fc2797ca4c1936a637a4cbfec828ef56cf52398a2e74ca3c4f494e728f fix: use wire_bytes not mpack_bytes_raw in compute_object_b… Sonnet 4.6 patch 49 days ago
sha256:b99f2455dc346966d040133f5203297e6e3ef5803a93728a2c30568d0a0f7583 rename: delta_add → delta_upsert across wire format, models… Sonnet 4.6 patch 51 days ago