20260724_220_dataflow_create_saga.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. """Make governed DataFlow creation recoverable and idempotent."""
  2. from alembic import op
  3. revision = "20260724_220"
  4. down_revision = "20260723_210"
  5. branch_labels = None
  6. depends_on = None
  7. def upgrade() -> None:
  8. op.execute(
  9. """
  10. ALTER TABLE public.dataflow_draft_reservations
  11. ADD COLUMN state VARCHAR(20) NOT NULL DEFAULT 'reserved',
  12. ADD COLUMN lease_token UUID,
  13. ADD COLUMN lease_expires_at TIMESTAMPTZ,
  14. ADD COLUMN attempt_count INTEGER NOT NULL DEFAULT 0,
  15. ADD COLUMN dataflow_node_id BIGINT,
  16. ADD COLUMN result JSONB,
  17. ADD COLUMN result_digest CHAR(64),
  18. ADD COLUMN error_code VARCHAR(100),
  19. ADD COLUMN create_started_at TIMESTAMPTZ,
  20. ADD COLUMN completed_at TIMESTAMPTZ,
  21. ADD COLUMN failed_at TIMESTAMPTZ,
  22. ADD COLUMN updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP;
  23. UPDATE public.dataflow_draft_reservations
  24. SET state = 'failed',
  25. error_code = 'legacy_consumed_without_result',
  26. failed_at = COALESCE(consumed_at, CURRENT_TIMESTAMP)
  27. WHERE consumed_at IS NOT NULL;
  28. ALTER TABLE public.dataflow_draft_reservations
  29. ADD CONSTRAINT ck_dataflow_draft_saga_state
  30. CHECK (state IN ('reserved', 'creating', 'completed', 'failed')),
  31. ADD CONSTRAINT ck_dataflow_draft_saga_attempts
  32. CHECK (attempt_count >= 0),
  33. ADD CONSTRAINT ck_dataflow_draft_completed_result
  34. CHECK (
  35. state <> 'completed'
  36. OR (
  37. result IS NOT NULL
  38. AND result_digest IS NOT NULL
  39. AND dataflow_node_id IS NOT NULL
  40. AND completed_at IS NOT NULL
  41. )
  42. );
  43. CREATE INDEX idx_dataflow_draft_saga_claim
  44. ON public.dataflow_draft_reservations(
  45. state, lease_expires_at, expires_at
  46. );
  47. """
  48. )
  49. def downgrade() -> None:
  50. raise RuntimeError(
  51. "DataFlow create saga reservations are forward-only and cannot downgrade"
  52. )