]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
centos: Optimize gpg key lookups
authorDaanDeMeyer <daan.j.demeyer@gmail.com>
Mon, 7 Jul 2025 12:42:41 +0000 (14:42 +0200)
committerDaanDeMeyer <daan.j.demeyer@gmail.com>
Fri, 22 Aug 2025 19:54:52 +0000 (21:54 +0200)
Currently we end up looking for the same gpg keys over and over again,
which is noticeably expensive as the lookup involves spawning a sandboxed.

Let's optimize by calculating the GPG keys and passing them around as
needed.

mkosi/distributions/alma.py
mkosi/distributions/centos.py
mkosi/distributions/rhel.py
mkosi/distributions/rhel_ubi.py
mkosi/distributions/rocky.py
mkosi/installer/zypper.py

index 2532b5c2518ef2034bed4f547dc40f6945670edb..4e668f29170e89a0ebe42deba5ab8c689a7675e7 100644 (file)
@@ -22,13 +22,18 @@ class Installer(centos.Installer):
         )
 
     @classmethod
-    def repository_variants(cls, context: Context, repo: str) -> list[RpmRepository]:
+    def repository_variants(
+        cls,
+        context: Context,
+        gpgurls: tuple[str, ...],
+        repo: str,
+    ) -> list[RpmRepository]:
         if context.config.mirror:
             url = f"baseurl={join_mirror(context.config.mirror, f'$releasever/{repo}/$basearch/os')}"
         else:
             url = f"mirrorlist=https://mirrors.almalinux.org/mirrorlist/$releasever/{repo.lower()}"
 
-        return [RpmRepository(repo, url, cls.gpgurls(context))]
+        return [RpmRepository(repo, url, gpgurls)]
 
     @classmethod
     def sig_repositories(cls, context: Context) -> list[RpmRepository]:
index 9144b12fa6ec8420919fbe8f44ddb8bfa6950b68..7c770c8f5193ab81ae26cfa26e393aa1fe00d102 100644 (file)
@@ -126,21 +126,26 @@ class Installer(DistributionInstaller):
         return tuple(key for key in (one, two, sig) if key is not None)
 
     @classmethod
-    def repository_variants(cls, context: Context, repo: str) -> Iterable[RpmRepository]:
+    def repository_variants(
+        cls,
+        context: Context,
+        gpgurls: tuple[str, ...],
+        repo: str,
+    ) -> Iterable[RpmRepository]:
         if context.config.local_mirror:
-            yield RpmRepository(repo, f"baseurl={context.config.local_mirror}", cls.gpgurls(context))
+            yield RpmRepository(repo, f"baseurl={context.config.local_mirror}", gpgurls)
 
         elif mirror := context.config.mirror:
             if repo == "extras":
                 yield RpmRepository(
                     repo.lower(),
                     f"baseurl={join_mirror(mirror, f'SIGs/$stream/{repo}/$basearch/extras-common')}",
-                    cls.gpgurls(context),
+                    gpgurls,
                 )
                 yield RpmRepository(
                     f"{repo.lower()}-source",
                     f"baseurl={join_mirror(mirror, f'SIGs/$stream/{repo}/source/extras-common')}",
-                    cls.gpgurls(context),
+                    gpgurls,
                     enabled=False,
                 )
 
@@ -148,18 +153,18 @@ class Installer(DistributionInstaller):
                 yield RpmRepository(
                     repo.lower(),
                     f"baseurl={join_mirror(mirror, f'$stream/{repo}/$basearch/os')}",
-                    cls.gpgurls(context),
+                    gpgurls,
                 )
                 yield RpmRepository(
                     f"{repo.lower()}-debuginfo",
                     f"baseurl={join_mirror(mirror, f'$stream/{repo}/$basearch/debug/tree')}",
-                    cls.gpgurls(context),
+                    gpgurls,
                     enabled=False,
                 )
                 yield RpmRepository(
                     f"{repo.lower()}-source",
                     f"baseurl={join_mirror(mirror, f'$stream/{repo}/source/tree')}",
-                    cls.gpgurls(context),
+                    gpgurls,
                     enabled=False,
                 )
         else:
@@ -169,43 +174,45 @@ class Installer(DistributionInstaller):
                 yield RpmRepository(
                     repo.lower(),
                     f"{url}?arch=$basearch&repo=centos-extras-sig-extras-common-$stream",
-                    cls.gpgurls(context),
+                    gpgurls,
                 )
                 yield RpmRepository(
                     f"{repo.lower()}-source",
                     f"{url}?arch=source&repo=centos-extras-sig-extras-common-source-$stream",
-                    cls.gpgurls(context),
+                    gpgurls,
                     enabled=False,
                 )
             else:
                 yield RpmRepository(
                     repo.lower(),
                     f"{url}?arch=$basearch&repo=centos-{repo.lower()}-$stream",
-                    cls.gpgurls(context),
+                    gpgurls,
                 )
                 yield RpmRepository(
                     f"{repo.lower()}-debuginfo",
                     f"{url}?arch=$basearch&repo=centos-{repo.lower()}-debug-$stream",
-                    cls.gpgurls(context),
+                    gpgurls,
                     enabled=False,
                 )
                 yield RpmRepository(
                     f"{repo.lower()}-source",
                     f"{url}?arch=source&repo=centos-{repo.lower()}-source-$stream",
-                    cls.gpgurls(context),
+                    gpgurls,
                     enabled=False,
                 )
 
     @classmethod
     def repositories(cls, context: Context) -> Iterable[RpmRepository]:
+        gpgurls = cls.gpgurls(context)
+
         if context.config.local_mirror:
-            yield from cls.repository_variants(context, "AppStream")
+            yield from cls.repository_variants(context, gpgurls, "AppStream")
             return
 
-        yield from cls.repository_variants(context, "BaseOS")
-        yield from cls.repository_variants(context, "AppStream")
-        yield from cls.repository_variants(context, "extras")
-        yield from cls.repository_variants(context, "CRB")
+        yield from cls.repository_variants(context, gpgurls, "BaseOS")
+        yield from cls.repository_variants(context, gpgurls, "AppStream")
+        yield from cls.repository_variants(context, gpgurls, "extras")
+        yield from cls.repository_variants(context, gpgurls, "CRB")
 
         yield from cls.epel_repositories(context)
         yield from cls.sig_repositories(context)
index 186fbba46f4639faa26d2e022a22ecc99fa66024..9e187db90eeb4fba15a64436723bbddbec793217 100644 (file)
@@ -71,14 +71,19 @@ class Installer(centos.Installer):
         return p
 
     @classmethod
-    def repository_variants(cls, context: Context, repo: str) -> Iterable[RpmRepository]:
+    def repository_variants(
+        cls,
+        context: Context,
+        gpgurls: tuple[str, ...],
+        repo: str,
+    ) -> Iterable[RpmRepository]:
         if context.config.local_mirror:
-            yield RpmRepository(repo, f"baseurl={context.config.local_mirror}", cls.gpgurls(context))
+            yield RpmRepository(repo, f"baseurl={context.config.local_mirror}", gpgurls)
         else:
             mirror = context.config.mirror or "https://cdn.redhat.com/content/dist/"
 
             common: dict[str, Any] = dict(
-                gpgurls=cls.gpgurls(context),
+                gpgurls=gpgurls,
                 sslcacert=cls.sslcacert(context),
                 sslclientcert=cls.sslclientcert(context),
                 sslclientkey=cls.sslclientkey(context),
@@ -107,7 +112,8 @@ class Installer(centos.Installer):
 
     @classmethod
     def repositories(cls, context: Context) -> Iterable[RpmRepository]:
-        yield from cls.repository_variants(context, "baseos")
-        yield from cls.repository_variants(context, "appstream")
-        yield from cls.repository_variants(context, "codeready-builder")
+        gpgurls = cls.gpgurls(context)
+        yield from cls.repository_variants(context, gpgurls, "baseos")
+        yield from cls.repository_variants(context, gpgurls, "appstream")
+        yield from cls.repository_variants(context, gpgurls, "codeready-builder")
         yield from cls.epel_repositories(context)
index afb9701a6abe5de48f5070cd4ad90fcb97a5d79c..66eacd21f314100cf36850e03ed317c3cbae109c 100644 (file)
@@ -23,9 +23,14 @@ class Installer(centos.Installer):
         )
 
     @classmethod
-    def repository_variants(cls, context: Context, repo: str) -> Iterable[RpmRepository]:
+    def repository_variants(
+        cls,
+        context: Context,
+        gpgurls: tuple[str, ...],
+        repo: str,
+    ) -> Iterable[RpmRepository]:
         if context.config.local_mirror:
-            yield RpmRepository(repo, f"baseurl={context.config.local_mirror}", cls.gpgurls(context))
+            yield RpmRepository(repo, f"baseurl={context.config.local_mirror}", gpgurls)
         else:
             mirror = context.config.mirror or "https://cdn-ubi.redhat.com/content/public/ubi/dist/"
 
@@ -33,24 +38,25 @@ class Installer(centos.Installer):
             yield RpmRepository(
                 f"ubi-{v}-{repo}-rpms",
                 f"baseurl={join_mirror(mirror, f'ubi{v}/{v}/$basearch/{repo}/os')}",
-                cls.gpgurls(context),
+                gpgurls,
             )
             yield RpmRepository(
                 f"ubi-{v}-{repo}-debug-rpms",
                 f"baseurl={join_mirror(mirror, f'ubi{v}/{v}/$basearch/{repo}/debug')}",
-                cls.gpgurls(context),
+                gpgurls,
                 enabled=False,
             )
             yield RpmRepository(
                 f"ubi-{v}-{repo}-source",
                 f"baseurl={join_mirror(mirror, f'ubi{v}/{v}/$basearch/{repo}/source')}",
-                cls.gpgurls(context),
+                gpgurls,
                 enabled=False,
             )
 
     @classmethod
     def repositories(cls, context: Context) -> Iterable[RpmRepository]:
-        yield from cls.repository_variants(context, "baseos")
-        yield from cls.repository_variants(context, "appstream")
-        yield from cls.repository_variants(context, "codeready-builder")
+        gpgurls = cls.gpgurls(context)
+        yield from cls.repository_variants(context, gpgurls, "baseos")
+        yield from cls.repository_variants(context, gpgurls, "appstream")
+        yield from cls.repository_variants(context, gpgurls, "codeready-builder")
         yield from cls.epel_repositories(context)
index 007644df496f7e57a843d57c61bb5d9b8f7b9593..bebefae69b9dfda261972582459798e3b649bd86 100644 (file)
@@ -22,13 +22,18 @@ class Installer(centos.Installer):
         )
 
     @classmethod
-    def repository_variants(cls, context: Context, repo: str) -> list[RpmRepository]:
+    def repository_variants(
+        cls,
+        context: Context,
+        gpgurls: tuple[str, ...],
+        repo: str,
+    ) -> list[RpmRepository]:
         if context.config.mirror:
             url = f"baseurl={join_mirror(context.config.mirror, f'$releasever/{repo}/$basearch/os')}"
         else:
             url = f"mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo={repo}-$releasever"
 
-        return [RpmRepository(repo, url, cls.gpgurls(context))]
+        return [RpmRepository(repo, url, gpgurls)]
 
     @classmethod
     def sig_repositories(cls, context: Context) -> list[RpmRepository]:
index d5df6e9c66d57d5b821e988f559b5c39063c0d8f..446898e38a084ab6e827191e43c37688b48295ed 100644 (file)
@@ -1,5 +1,4 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
-import hashlib
 import textwrap
 from collections.abc import Sequence
 from pathlib import Path