Repair production automation truth and schedule cleanup
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Build and Publish Container Image / build-and-push (push) Successful in 18s

This commit is contained in:
tegwick 2026-08-20 11:20:23 +02:00
parent 8bcb416285
commit 944fd158de
19 changed files with 441 additions and 64 deletions

View file

@ -24,7 +24,12 @@ from temporalio.client import Client
from activity_core.models import ActivityDefinition, CronTriggerConfig, ScheduledTriggerConfig
from activity_core.orm import ActivityDefinition as ActivityDefinitionRow
from activity_core.schedule_manager import delete_schedule, list_schedules, upsert_schedule
from activity_core.schedule_manager import (
cancel_scheduled,
delete_schedule,
list_schedules,
upsert_schedule,
)
logger = logging.getLogger(__name__)
@ -107,7 +112,14 @@ async def sync_schedule_rows(
valid_schedule_activity_ids.add(_valid_schedule_activity_id(defn))
try:
await upsert_schedule(client, defn)
if isinstance(defn.trigger_config, ScheduledTriggerConfig) and not defn.enabled:
# A disabled one-shot has no future recurrence to preserve. A
# completed Temporal schedule can reject in-place updates with
# ScheduleAlreadyRunningError, leaving every later sync noisy.
# Delete it idempotently instead; re-enabling recreates it.
await cancel_scheduled(client, defn.id)
else:
await upsert_schedule(client, defn)
except Exception as exc: # noqa: BLE001 — continue reconcile for other rows
result.errors += 1
detail = f"{defn.id} ({defn.name}): {type(exc).__name__}: {exc}"
@ -120,7 +132,10 @@ async def sync_schedule_rows(
logger.info("upserted schedule for activity %s (%s)", defn.id, defn.name)
else:
result.paused += 1
logger.info("upserted paused schedule for disabled activity %s", defn.id)
if isinstance(defn.trigger_config, ScheduledTriggerConfig):
logger.info("removed schedule for disabled one-shot activity %s", defn.id)
else:
logger.info("upserted paused schedule for disabled activity %s", defn.id)
# Tombstone cleanup: remove Temporal Schedules with no matching DB row.
try: