From 48dd352b5d6cb7550de989190f9248f9a68fde56 Mon Sep 17 00:00:00 2001 From: cpoppema Date: Wed, 15 Apr 2026 16:52:12 +0200 Subject: [PATCH] perf: reduce query counts for errata and osvariants. revisit mirror query --- errata/views.py | 7 ++++++- hosts/managers.py | 7 +++++++ hosts/models.py | 3 +++ hosts/templates/hosts/host_table.html | 2 +- hosts/views.py | 8 +++++--- packages/views.py | 2 +- security/views.py | 5 ++++- util/views.py | 12 ++++++------ 8 files changed, 33 insertions(+), 13 deletions(-) diff --git a/errata/views.py b/errata/views.py index 42d12f712..8664dc90e 100644 --- a/errata/views.py +++ b/errata/views.py @@ -29,7 +29,12 @@ @login_required def erratum_list(request): - errata = Erratum.objects.select_related() + errata = Erratum.objects.select_related() \ + .prefetch_related('affected_packages', + 'fixed_packages', + 'osreleases', + 'cves', + 'references') if 'e_type' in request.GET: errata = errata.filter(e_type=request.GET['e_type']).distinct() diff --git a/hosts/managers.py b/hosts/managers.py index 82d702135..8cd9dd9ce 100644 --- a/hosts/managers.py +++ b/hosts/managers.py @@ -47,6 +47,13 @@ def with_counts(self, *properties): ), 0, ), + 'get_num_errata': Coalesce( + Count( + 'errata', + distinct=True, + ), + 0, + ), } return self.get_queryset() \ diff --git a/hosts/models.py b/hosts/models.py index e207348ba..6221862e6 100644 --- a/hosts/models.py +++ b/hosts/models.py @@ -110,6 +110,9 @@ def get_num_packages(self): def get_num_repos(self): return self.repos.count() + def get_num_errata(self): + return self.errata.count() + def check_rdns(self): if self.check_dns: update_rdns(self) diff --git a/hosts/templates/hosts/host_table.html b/hosts/templates/hosts/host_table.html index bebb7723c..2b41f866c 100644 --- a/hosts/templates/hosts/host_table.html +++ b/hosts/templates/hosts/host_table.html @@ -17,7 +17,7 @@ {{ host }} {% with count=host.get_num_security_updates %}{% if count != 0 %}{{ count }}{% else %} {% endif %}{% endwith %} {% with count=host.get_num_bugfix_updates %}{% if count != 0 %}{{ count }}{% else %} {% endif %}{% endwith %} - {% with count=host.errata.count %}{% if count != 0 %}{{ count }}{% else %} {% endif %}{% endwith %} + {% with count=host.get_num_errata %}{% if count != 0 %}{{ count }}{% else %} {% endif %}{% endwith %} {{ host.kernel }} {{ host.osvariant }} {{ host.lastreport }}{% report_alert host.lastreport %} diff --git a/hosts/views.py b/hosts/views.py index faad410b6..7631ee25c 100644 --- a/hosts/views.py +++ b/hosts/views.py @@ -38,8 +38,9 @@ @login_required def host_list(request): hosts = Host.objects.with_counts('get_num_security_updates', - 'get_num_bugfix_updates') \ - .select_related() + 'get_num_bugfix_updates', + 'get_num_errata') \ + .select_related('osvariant__arch') if 'domain_id' in request.GET: hosts = hosts.filter(domain=request.GET['domain_id']) @@ -97,7 +98,8 @@ def host_list(request): filter_list.append(Filter(request, 'Domain', 'domain_id', Domain.objects.all())) filter_list.append(Filter(request, 'OS Release', 'osrelease_id', OSRelease.objects.filter(osvariant__host__in=hosts))) - filter_list.append(Filter(request, 'OS Variant', 'osvariant_id', OSVariant.objects.filter(host__in=hosts))) + filter_list.append(Filter(request, 'OS Variant', 'osvariant_id', + OSVariant.objects.filter(host__in=hosts).select_related('arch'))) filter_list.append(Filter(request, 'Architecture', 'arch_id', MachineArchitecture.objects.filter(host__in=hosts))) filter_list.append(Filter(request, 'Reboot Required', 'reboot_required', {'true': 'Yes', 'false': 'No'})) filter_bar = FilterBar(request, filter_list) diff --git a/packages/views.py b/packages/views.py index cd53fa6e0..70b5e645c 100644 --- a/packages/views.py +++ b/packages/views.py @@ -117,7 +117,7 @@ def package_list(request): @login_required def package_name_list(request): - packages = PackageName.objects.select_related() + packages = PackageName.objects.select_related().prefetch_related('package_set') if 'arch_id' in request.GET: packages = packages.filter(package__arch=request.GET['arch_id']).distinct() diff --git a/security/views.py b/security/views.py index 58a686b55..2f42fab0a 100644 --- a/security/views.py +++ b/security/views.py @@ -70,7 +70,10 @@ def cwe_detail(request, cwe_id): @login_required def cve_list(request): - cves = CVE.objects.select_related() + cves = CVE.objects.select_related() \ + .prefetch_related('cvss_scores', + 'cwes', + 'erratum_set') if 'erratum_id' in request.GET: cves = cves.filter(erratum=request.GET['erratum_id']) diff --git a/util/views.py b/util/views.py index fb27c33bf..a512f3350 100644 --- a/util/views.py +++ b/util/views.py @@ -21,8 +21,7 @@ from django.contrib.auth.decorators import login_required from django.contrib.sites.models import Site -from django.db.models import Count, Exists, F, OuterRef -from django.db.models.functions import Coalesce +from django.db.models import Exists, F, OuterRef from hosts.models import Host from operatingsystems.models import OSVariant, OSRelease @@ -41,8 +40,9 @@ def dashboard(request): site = {'name': '', 'domainname': ''} hosts = Host.objects.with_counts('get_num_security_updates', - 'get_num_bugfix_updates') \ - .select_related() + 'get_num_bugfix_updates', + 'get_num_errata') \ + .select_related('osvariant__arch') osvariants = OSVariant.objects.all().prefetch_related('host_set') osreleases = OSRelease.objects.all() repos = Repository.objects.all().prefetch_related('mirror_set') @@ -104,10 +104,10 @@ def dashboard(request): possible_mirrors = {} mirrors = Mirror.objects.all() \ - .annotate(packages_count=Coalesce(Count('packages', distinct=True), 0)) \ + .filter(id__in=Package.objects.order_by().distinct().values_list('mirror', flat=True)) \ .select_related() for mirror in mirrors: - if mirror.packages_checksum != 'yast' and mirror.packages_count > 0: + if mirror.packages_checksum != 'yast': if mirror.packages_checksum not in checksums: checksums[mirror.packages_checksum] = [] checksums[mirror.packages_checksum].append(mirror)