diff --git a/SAS/TMSS/backend/services/scheduling/lib/constraints.py b/SAS/TMSS/backend/services/scheduling/lib/constraints.py index ade76fdf3b763aade818c1bb6f0b0c3571fe0880..e262904770496fc295dfd670743d10d6deec03c5 100644 --- a/SAS/TMSS/backend/services/scheduling/lib/constraints.py +++ b/SAS/TMSS/backend/services/scheduling/lib/constraints.py @@ -1818,6 +1818,11 @@ def get_earliest_possible_start_time_taking_used_stations_into_account(schedulin try: # check for any overlapping units... blocking_units = get_blocking_scheduled_or_observing_units(scheduling_unit, earliest_possible_start_time) + + if scheduling_unit.priority_queue.value == models.PriorityQueueType.Choices.A.value: + # A-prio units are never hindered/blocked by B-prio + blocking_units = blocking_units.exclude(priority_queue__value=models.PriorityQueueType.Choices.B.value) + if blocking_units.exists(): blocking_observing_units = blocking_units.filter(status__value=models.SchedulingUnitStatus.Choices.OBSERVING.value).all() blocking_scheduled_units = blocking_units.filter(status__value=models.SchedulingUnitStatus.Choices.SCHEDULED.value).all() @@ -1828,15 +1833,15 @@ def get_earliest_possible_start_time_taking_used_stations_into_account(schedulin scheduling_unit.id, ','.join(str(u.id) for u in blocking_scheduled_units)) blocking_scheduled_units_with_start_time = compute_start_times_for_units(list(blocking_scheduled_units), lower_bound, upper_bound, gridder, raise_if_interruped) - scored_units = compute_scores_for_units_with_start_time(blocking_scheduled_units_with_start_time+[SchedulingUnitAndStartTime(scheduling_unit, earliest_possible_start_time)], lower_bound, upper_bound, gridder, raise_if_interruped) + rescored_units = compute_scores_for_units_with_start_time(blocking_scheduled_units_with_start_time+[SchedulingUnitAndStartTime(scheduling_unit, earliest_possible_start_time)], lower_bound, upper_bound, gridder, raise_if_interruped) try: - scored_candidate = [su for su in scored_units if su.scheduling_unit.id==scheduling_unit.id][0] - scored_blocking_units = [su for su in scored_units if su.scheduling_unit.id!=scheduling_unit.id] + rescored_candidate = [su for su in rescored_units if su.scheduling_unit.id==scheduling_unit.id][0] + rescored_blocking_units = [su for su in rescored_units if su.scheduling_unit.id!=scheduling_unit.id] # if the candidate has a higher score, then it can override and unschedule the already scheduled units. # so, in that case, ignore the overlap with the blocking scheduled units. # else, the blocking units cannot/willnot be unscheduled, so advance the lower_bound until after the blocking units - better_scoring_blocking_units = [scored_blocking_unit for scored_blocking_unit in scored_blocking_units if scored_candidate.weighted_score < scored_blocking_unit.weighted_score] + better_scoring_blocking_units = [scored_blocking_unit for scored_blocking_unit in rescored_blocking_units if rescored_candidate.weighted_score < scored_blocking_unit.weighted_score] except: logger.debug("get_earliest_possible_start_time_taking_used_stations_into_account: could not re-score candidate unit id=%s and blocking units %s", scheduling_unit.id, ','.join(str(u.id) for u in blocking_scheduled_units)) @@ -1863,9 +1868,9 @@ def get_earliest_possible_start_time_taking_used_stations_into_account(schedulin scheduling_unit.id, advanced_earliest_possible_start_time, advanced_lower_bound, upper_bound) return advanced_earliest_possible_start_time - logger.debug("get_earliest_possible_start_time_taking_used_stations_into_account: SUB id=%s is blocked by units %s at earliest_possible_start_time='%s'", - scheduling_unit.id, ','.join(str(u.id) for u in blocking_units), earliest_possible_start_time) - return None + logger.info("get_earliest_possible_start_time_taking_used_stations_into_account: SUB id=%s is blocked by units %s at earliest_possible_start_time='%s'", + scheduling_unit.id, ','.join(str(u.id) for u in blocking_units), earliest_possible_start_time) + return None except Exception as e: logger.exception(e) @@ -2029,8 +2034,9 @@ def compute_start_times_for_units(scheduling_units: [models.SchedulingUnitBluepr if result is not None and result.start_time is not None: units_with_start_time.append(result) - logger.info("compute_start_times_for_units: unit [%d/%d] %.1f%% %s", - i+1, len(scheduling_units), 100.0 * (i+1) / len(scheduling_units), result) + logger.info("compute_start_times_for_units: %s%s", + "unit [%d/%d] %.1f%%" % (i+1, len(scheduling_units), 100.0 * (i+1) / len(scheduling_units)) if len(scheduling_units)>1 else "", + result) else: logger.info("compute_start_times_for_units: no start_time for unit [%d/%d] %.1f%% %s between ['%s', '%s']", i+1, len(scheduling_units), 100.0 * (i+1) / len(scheduling_units), result or su.id, lower_bound, upper_bound) diff --git a/SAS/TMSS/backend/services/scheduling/test/t_dynamic_scheduling.py b/SAS/TMSS/backend/services/scheduling/test/t_dynamic_scheduling.py index 0207cfd97354f49775ce2671a929e9f8feb875cf..8b4de39a593215916d267241418618f6fd69f643 100755 --- a/SAS/TMSS/backend/services/scheduling/test/t_dynamic_scheduling.py +++ b/SAS/TMSS/backend/services/scheduling/test/t_dynamic_scheduling.py @@ -1576,6 +1576,9 @@ class TestDynamicScheduling(BaseDynamicSchedulingTestCase): """ Test a simple observation with the 'at' constraint """ + # JS: set loglevel to DEBUG to find out why this test is blinking on gitlab cicd + logging.getLogger('lofar.sas.tmss.services.scheduling').level = logging.DEBUG + scheduling_unit_draft = self.create_simple_observation_scheduling_unit('scheduling_unit for at constraint') # Clear/set constraints @@ -1606,6 +1609,9 @@ class TestDynamicScheduling(BaseDynamicSchedulingTestCase): self.assertEqual(scheduled_scheduling_unit.status.value, 'scheduled') self.assertEqual(scheduled_scheduling_unit.scheduled_start_time, at) + # JS: reset loglevel + logging.getLogger('lofar.sas.tmss.services.scheduling').level = logging.INFO + def test_two_simple_observations_with_at_constraint_one_after_the_other(self): """