From: Michael Tremer Date: Wed, 24 May 2023 17:22:47 +0000 (+0000) Subject: repos: Implement relaunching jobs in sibling repositories X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dc4339697f751182d1bf4a2cee51c2517e59a76a;p=pbs.git repos: Implement relaunching jobs in sibling repositories Signed-off-by: Michael Tremer --- diff --git a/src/buildservice/config.py b/src/buildservice/config.py index 1dc57431..794b4b88 100644 --- a/src/buildservice/config.py +++ b/src/buildservice/config.py @@ -70,7 +70,7 @@ class PakfireConfig(base.Object): self.repos.add(repo) # Add any sibling repositories - self.repos.update(repo.siblings) + self.repos.update(repo.parents) # Context diff --git a/src/buildservice/repository.py b/src/buildservice/repository.py index 1d60956c..13531aa2 100644 --- a/src/buildservice/repository.py +++ b/src/buildservice/repository.py @@ -27,17 +27,11 @@ KEY_LIFETIME = datetime.timedelta(days=365) KEY_ROLLOVER_TIME = datetime.timedelta(days=60) class Repositories(base.Object): - def _get_repository(self, query, *args): - res = self.db.get(query, *args) + def _get_repositories(self, query, *args, **kwargs): + return self.db.fetch_many(Repository, query, *args, **kwargs) - if res: - return Repository(self.backend, res.id, data=res) - - def _get_repositories(self, query, *args): - res = self.db.query(query, *args) - - for row in res: - yield Repository(self.backend, row.id, data=row) + def _get_repository(self, query, *args, **kwargs): + return self.db.fetch_one(Repository, query, *args, **kwargs) def __iter__(self): repositories = self._get_repositories("SELECT * FROM repositories \ @@ -167,6 +161,23 @@ class Repository(base.DataObject): def distro(self): return self.backend.distros.get_by_id(self.data.distro_id) + # Repo Types + + def is_user(self): + """ + Returns True if this is a user repository + """ + if self.owner: + return True + + return False + + def is_distro(self): + """ + Returns True if this is a distro repository + """ + return not self.is_user() + # Priority def get_priority(self): @@ -414,9 +425,47 @@ class Repository(base.DataObject): # Sibling repositories @property - def siblings(self): - # XXX TODO - return [] + def parents(self): + """ + Returns all parent repositories + """ + # User repositories have the distro repositories as parents + if self.is_user(): + return self.distro.repos + + # Distro repositories don't have any parents + elif self.is_distro(): + return [] + + @property + def children(self): + """ + Returns all repositories that depend on this + """ + # User repositories don't have any children + if self.is_user(): + return [] + + # Distro repositories are parents for all user repositories + elif self.is_distro(): + return self.backend.repos._get_repositories(""" + SELECT + * + FROM + repositories + WHERE + deleted_at IS NULL + AND + distro_id = %s + AND + owner_id IS NOT NULL + ORDER BY + created_at + """, self.distro, + + # Cache + distro=self.distro, + ) # Add/Remove Builds @@ -889,25 +938,31 @@ class Repository(base.DataObject): if self.has_changed.is_set(): await self.update() + log.info("Finished updating %s" % self) + # Relaunch any pending jobs await self.relaunch_pending_jobs() async def relaunch_pending_jobs(self): + """ + Relaunches all pending jobs + """ # Perform this on this repository - self._relaunch_pending_jobs() + await self._relaunch_pending_jobs() - # Perform this for all sibling repositories - # XXX - #for repo in self.siblings: - # repo._relaunch_pending_jobs() + # Perform this for all child repositories + for repo in self.children: + await repo._relaunch_pending_jobs() - def _relaunch_pending_jobs(self): + async def _relaunch_pending_jobs(self): """ This function needs to be called whenever the repository has to be - changed so that all pending jobs will have their dependencies recalculated. + changed so that all pending jobs will have their dependencies re-checked. """ - # Perform dependency checks on all pending jobs - self.backend.run_task(self.backend.jobs.launch, self.pending_jobs) + log.debug("%s: Relaunching pending jobs" % self) + + # Try to relaunch all pending jobs + await self.backend.jobs.launch(self.pending_jobs) # Write repository