diff --git a/SAS/TMSS/backend/services/scheduling/lib/dynamic_scheduling.py b/SAS/TMSS/backend/services/scheduling/lib/dynamic_scheduling.py index e6c21b26faa6be78ef8078acdfe039d7c132a095..c46aa94ae6707331796c3f2cd551bb183ecf5a11 100644 --- a/SAS/TMSS/backend/services/scheduling/lib/dynamic_scheduling.py +++ b/SAS/TMSS/backend/services/scheduling/lib/dynamic_scheduling.py @@ -247,9 +247,6 @@ class Scheduler: assert (scheduled_unit.status.value == models.SchedulingUnitStatus.Choices.SCHEDULED.value) logger.info("Scheduled fixed_time unit [%s/%s] id=%d at '%s'", i, len(schedulable_units), schedulable_unit.id, at_timestamp) scheduled_units.append(scheduled_unit) - - scheduled_B_units = self.schedule_B_priority_units_in_gaps_around_scheduling_unit(scheduled_unit) - scheduled_units.extend(scheduled_B_units) else: unschedulable_unit = determine_unschedulable_reason_and_mark_unschedulable_if_needed(schedulable_unit, at_timestamp, at_timestamp + schedulable_unit.specified_observation_duration, proposed_start_time=at_timestamp, @@ -291,8 +288,18 @@ class Scheduler: proposed_start_time=at_timestamp, gridder=self.search_gridder, raise_if_interruped=self._raise_if_triggered) assert(unschedulable_unit.status.value == models.SchedulingUnitStatus.Choices.UNSCHEDULABLE.value) - return [scheduled_unit for scheduled_unit in scheduled_units if scheduled_unit.status.value == models.SchedulingUnitStatus.Choices.SCHEDULED.value] + # what are the truly scheduled fixed time units? + scheduled_units = [scheduled_unit for scheduled_unit in scheduled_units if scheduled_unit.status.value == models.SchedulingUnitStatus.Choices.SCHEDULED.value] + + # now try to place B-prio units in between the scheduled fixed-time units + scheduled_units = sorted(scheduled_units, key=lambda su: su.scheduled_start_time) + for scheduled_unit in list(scheduled_units): + scheduled_B_units = self.schedule_B_priority_units_in_gaps_around_scheduling_unit(scheduled_unit) + scheduled_units.extend(scheduled_B_units) + + # return all scheduled (fixedtime and B-prio) units + return scheduled_units def do_dynamic_schedule(self) -> [models.SchedulingUnitBlueprint]: '''do a full update of the schedule: schedule next scheduling unit (and if possible, squeeze in B-prio units between now and the upcoming scheduled unit).