fix: honor live scheduling revisions at dispatch

This commit is contained in:
lda
2026-09-09 19:53:12 +07:00 Verified
parent b7c5f4e0eb
commit ecb5a76b12
11 changed files with 134 additions and 27 deletions
+29 -6
View File
@@ -141,6 +141,18 @@ class Scheduler:
else FileScheduleHistoryRecorder(schedule_store)
)
self._poll_cursor = 0
self._source_definitions: dict[str, Any] = {}
def set_source_definitions(self, definitions: dict[str, Any]) -> None:
"""Record the trigger definitions used to build managed sources.
The service refreshes this map at tick start. A schedule edit can
commit between that refresh and a schedule's fresh read; the poller
then rebuilds only that schedule's source before resolving an instant.
Direct Scheduler tests without this service-owned map keep their
injected source collaborators unchanged.
"""
self._source_definitions = dict(definitions)
def _require_ownership(self) -> None:
"""Reject schedule mutation/dispatch without proven live ownership.
@@ -741,12 +753,23 @@ class Scheduler:
consumed = self.schedule_store.get_consumed(sched.id) or EPOCH
self.schedule_store.save_consumed(sched.id, max(consumed, now))
return "paused"
try:
src = self.sources[sched.id]
except KeyError as exc:
raise InvalidScheduleDefinitionError(
f"no occurrence source for schedule {sched.id!r}"
) from exc
source_definition = self._source_definitions.get(sched.id)
if source_definition is not None and source_definition != sched.trigger:
try:
src = source_for_trigger(sched.trigger)
except Exception as exc:
raise InvalidScheduleDefinitionError(
f"invalid trigger for schedule {sched.id!r}: {exc}"
) from exc
self.sources[sched.id] = src
self._source_definitions[sched.id] = sched.trigger
else:
try:
src = self.sources[sched.id]
except KeyError as exc:
raise InvalidScheduleDefinitionError(
f"no occurrence source for schedule {sched.id!r}"
) from exc
consumed = self.schedule_store.get_consumed(sched.id) or EPOCH
if consumed > now:
return "clock-rollback-held"