From 86295b374a4ed2d666ec34e8d812204207dbd041 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Mar 30 2023 13:51:01 +0000 Subject: [PATCH 1/2] kojira: prioritize awaited repos Related: https://pagure.io/koji/issue/3757 --- diff --git a/util/kojira b/util/kojira index 7c0d16d..f27691c 100755 --- a/util/kojira +++ b/util/kojira @@ -795,14 +795,24 @@ class RepoManager(object): if age < 0: self.logger.warning("Needed tag has future expire_ts: %r", entry) age = 0 - entry['score'] = age * adj + entry['score'] = age * adj * entry['score_adjust'] self.logger.debug("Needed tag %s got score %.2f", entry['taginfo']['name'], entry['score']) # so a day old unused repo gets about the regen same score as a # 2.4-hour-old, very popular repo def updateTagScores(self): - for entry in list(self.needed_tags.values()): + # call listTasks waitrepo + awaited = self.session.listTasks(opts={'method': ['waitrepo'], + 'state': [koji.TASK_STATES['FREE'], + koji.TASK_STATES['ASSIGNED'], + koji.TASK_STATES['OPEN']]}) + awaited = {koji.parse_task_params('waitrepo', task['request'])['tag'] for task in awaited} + for tag_id, entry in self.needed_tags.items(): + if tag_id in awaited: + # score multiplication factor, prioritize tags which are being awaited for + # not needed on every setTagScore call (initial point will not account it for) + entry['score_adjust'] = 1.5 self.setTagScore(entry) def _delete_needed_tag(self, tag_id): @@ -938,6 +948,7 @@ class RepoManager(object): 'taginfo': taginfo, 'expire_ts': ts, 'needed_since': time.time(), + 'score_adjust': 1.0, # modifier, updated in updateTagScores } self.setTagScore(entry) self.needed_tags[tag_id] = entry From c4bb91eb0046809879ee88b18c8b495fa3a27cee Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Apr 11 2023 14:41:34 +0000 Subject: [PATCH 2/2] error handling --- diff --git a/util/kojira b/util/kojira index f27691c..ce06d6c 100755 --- a/util/kojira +++ b/util/kojira @@ -795,7 +795,7 @@ class RepoManager(object): if age < 0: self.logger.warning("Needed tag has future expire_ts: %r", entry) age = 0 - entry['score'] = age * adj * entry['score_adjust'] + entry['score'] = age * adj * entry.get('score_adjust', 1) self.logger.debug("Needed tag %s got score %.2f", entry['taginfo']['name'], entry['score']) # so a day old unused repo gets about the regen same score as a @@ -807,12 +807,20 @@ class RepoManager(object): 'state': [koji.TASK_STATES['FREE'], koji.TASK_STATES['ASSIGNED'], koji.TASK_STATES['OPEN']]}) - awaited = {koji.parse_task_params('waitrepo', task['request'])['tag'] for task in awaited} + awaited = set() + for task in awaited: + try: + awaited.add(koji.parse_task_params('waitrepo', task['request'])['tag']) + except Exception: + # ignore malformed tasks + self.logger.debug(f"Malformed task: {task}") + pass + for tag_id, entry in self.needed_tags.items(): if tag_id in awaited: # score multiplication factor, prioritize tags which are being awaited for # not needed on every setTagScore call (initial point will not account it for) - entry['score_adjust'] = 1.5 + entry['score_adjust'] = 2 self.setTagScore(entry) def _delete_needed_tag(self, tag_id): @@ -948,7 +956,6 @@ class RepoManager(object): 'taginfo': taginfo, 'expire_ts': ts, 'needed_since': time.time(), - 'score_adjust': 1.0, # modifier, updated in updateTagScores } self.setTagScore(entry) self.needed_tags[tag_id] = entry