44 lines
2.2 KiB
Python
44 lines
2.2 KiB
Python
# #region Alembic.ScenarioCancelDrainDeadline [C:3] [TYPE Module] [SEMANTICS alembic,scenario,execution,cancel,drain]
|
|
# @ingroup Alembic
|
|
# @BRIEF Add nullable persisted cancellation timing so a worker/scheduler can finish a bounded drain after restart.
|
|
# @RELATION DEPENDS_ON -> [Models.ScenarioExecution.Run]
|
|
# @INVARIANT Existing runs retain null timing fields; only a cancel request pins a deadline.
|
|
# @REJECTED Deriving a deadline from mutable target snapshot or an in-memory process timer was rejected.
|
|
"""add durable ScenarioRun cancellation drain timing (044)"""
|
|
|
|
from collections.abc import Sequence
|
|
|
|
import sqlalchemy as sa
|
|
|
|
from alembic import op
|
|
|
|
revision: str = "e3f4a5b6c7d8"
|
|
down_revision: str | Sequence[str] | None = "d2e3f4a5b6c7"
|
|
branch_labels: str | Sequence[str] | None = None
|
|
depends_on: str | Sequence[str] | None = None
|
|
|
|
|
|
# #region Alembic.ScenarioCancelDrainDeadline.Upgrade [C:4] [TYPE Function] [SEMANTICS alembic,scenario,execution,cancel,additive]
|
|
# @BRIEF Add nullable request/deadline timestamps and a deadline lookup index.
|
|
# @POST Historical ScenarioRuns preserve null timing until explicitly cancelled.
|
|
# @SIDE_EFFECT Schema mutation: two nullable lifecycle timestamps and one index.
|
|
def upgrade() -> None:
|
|
op.add_column("scenario_runs", sa.Column("cancel_requested_at", sa.DateTime(), nullable=True))
|
|
op.add_column("scenario_runs", sa.Column("cancel_drain_deadline_at", sa.DateTime(), nullable=True))
|
|
op.create_index(
|
|
"ix_scenario_runs_cancel_drain_deadline_at",
|
|
"scenario_runs",
|
|
["cancel_drain_deadline_at"],
|
|
)
|
|
# #endregion Alembic.ScenarioCancelDrainDeadline.Upgrade
|
|
|
|
|
|
# #region Alembic.ScenarioCancelDrainDeadline.Downgrade [C:3] [TYPE Function] [SEMANTICS alembic,scenario,execution,cancel,rollback]
|
|
# @BRIEF Remove only additive timing metadata; no run/step/evidence history is altered.
|
|
def downgrade() -> None:
|
|
op.drop_index("ix_scenario_runs_cancel_drain_deadline_at", table_name="scenario_runs")
|
|
op.drop_column("scenario_runs", "cancel_drain_deadline_at")
|
|
op.drop_column("scenario_runs", "cancel_requested_at")
|
|
# #endregion Alembic.ScenarioCancelDrainDeadline.Downgrade
|
|
# #endregion Alembic.ScenarioCancelDrainDeadline
|