fix: honor live scheduling revisions at dispatch
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user