Skip to content

Commit f29d01a

Browse files
committed
add further sql optimizations
1 parent 9750cfb commit f29d01a

File tree

12 files changed

+45
-55
lines changed

12 files changed

+45
-55
lines changed

hosts/models.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,9 @@ def clean_reports(self):
135135
""" Remove all but the last 3 reports for a host
136136
"""
137137
from reports.models import Report
138-
reports = Report.objects.filter(host=self).order_by('-created')[3:]
139-
rlen = reports.count()
140-
for report in Report.objects.filter(host=self).order_by('-created')[3:]:
138+
reports = list(Report.objects.filter(host=self).order_by('-created')[3:])
139+
rlen = len(reports)
140+
for report in reports:
141141
report.delete()
142142
if rlen > 0:
143143
info_message(text=f'{self.hostname}: removed {rlen} old reports')
@@ -164,7 +164,7 @@ def process_update(self, package, highest_package):
164164
host_repos = Q(repo__host=self)
165165
else:
166166
host_repos = Q(repo__osrelease__osvariant__host=self, repo__arch=self.arch) | Q(repo__host=self)
167-
mirrors = highest_package.mirror_set.filter(host_repos)
167+
mirrors = highest_package.mirror_set.filter(host_repos).select_related('repo')
168168
security = False
169169
# if any of the containing repos are security, mark the update as a security update
170170
for mirror in mirrors:

hosts/views.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def _get_filtered_hosts(filter_params):
4242
from urllib.parse import parse_qs
4343
params = parse_qs(filter_params)
4444

45-
hosts = Host.objects.select_related()
45+
hosts = Host.objects.select_related('osvariant', 'arch', 'domain')
4646

4747
if 'domain_id' in params:
4848
hosts = hosts.filter(domain=params['domain_id'][0])
@@ -77,7 +77,7 @@ def _get_filtered_hosts(filter_params):
7777
@login_required
7878
def host_list(request):
7979
# Use cached count fields instead of expensive annotations
80-
hosts = Host.objects.select_related()
80+
hosts = Host.objects.select_related('osvariant', 'arch', 'domain')
8181

8282
if 'domain_id' in request.GET:
8383
hosts = hosts.filter(domain=request.GET['domain_id'])
@@ -156,7 +156,7 @@ def host_detail(request, hostname):
156156
hostrepos = HostRepo.objects.filter(host=host)
157157

158158
# Build packages list with update info
159-
updates_by_package = {u.oldpackage_id: u for u in host.updates.select_related()}
159+
updates_by_package = {u.oldpackage_id: u for u in host.updates.select_related('oldpackage', 'newpackage')}
160160
packages_with_updates = []
161161
for package in host.packages.select_related('name', 'arch').order_by('name__name'):
162162
package.update = updates_by_package.get(package.id)
@@ -294,7 +294,7 @@ class HostViewSet(viewsets.ModelViewSet):
294294
"""
295295
API endpoint that allows hosts to be viewed or edited.
296296
"""
297-
queryset = Host.objects.all()
297+
queryset = Host.objects.select_related('osvariant', 'arch', 'domain').all()
298298
serializer_class = HostSerializer
299299
filterset_class = HostFilter
300300

@@ -303,5 +303,5 @@ class HostRepoViewSet(viewsets.ModelViewSet):
303303
"""
304304
API endpoint that allows host repos to be viewed or edited.
305305
"""
306-
queryset = HostRepo.objects.all()
306+
queryset = HostRepo.objects.select_related('host', 'repo').all()
307307
serializer_class = HostRepoSerializer

modules/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,6 @@ class ModuleViewSet(viewsets.ModelViewSet):
6262
"""
6363
API endpoint that allows modules to be viewed or edited.
6464
"""
65-
queryset = Module.objects.all()
65+
queryset = Module.objects.select_related('arch', 'repo').all()
6666
serializer_class = ModuleSerializer
6767
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

operatingsystems/templates/operatingsystems/osvariant_detail.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<tr><th>Name</th><td> {{ osvariant.name }} </td></tr>
2525
<tr><th>Architecture</th><td> {{ osvariant.arch }} </td></tr>
2626
<tr><th>Codename</th><td> {{ osvariant.codename }} </td></tr>
27-
<tr><th>Hosts</th><td><a href="{% url 'hosts:host_list' %}?osvariant_id={{ osvariant.id }}">{{ osvariant.host_set.count }}</a></td></tr>
27+
<tr><th>Hosts</th><td><a href="{% url 'hosts:host_list' %}?osvariant_id={{ osvariant.id }}">{{ osvariant.hosts_count }}</a></td></tr>
2828
<tr><th>OS Release</th><td>{% if osvariant.osrelease != None %}<a href="{{ osvariant.osrelease.get_absolute_url }}"> {{ osvariant.osrelease }} </a>{% else %}No OS Release{% endif %}</td></tr>
2929
</table>
3030
{% if user.is_authenticated and perms.is_admin %}

operatingsystems/utils.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,17 @@ def get_or_create_osrelease(name, cpe_name=None, codename=None):
6565
try:
6666
osrelease, created = OSRelease.objects.get_or_create(name=name, cpe_name=cpe_name)
6767
except IntegrityError:
68-
osreleases = OSRelease.objects.filter(cpe_name=cpe_name)
69-
if osreleases.count() == 1:
70-
osrelease = osreleases.first()
68+
osreleases = list(OSRelease.objects.filter(cpe_name=cpe_name))
69+
if len(osreleases) == 1:
70+
osrelease = osreleases[0]
7171
osrelease.name = name
7272
if not osrelease and codename:
7373
try:
7474
osrelease, created = OSRelease.objects.get_or_create(name=name, codename=codename)
7575
except IntegrityError:
76-
osreleases = OSRelease.objects.filter(codename=codename)
77-
if osreleases.count() == 1:
78-
osrelease = osreleases.first()
76+
osreleases = list(OSRelease.objects.filter(codename=codename))
77+
if len(osreleases) == 1:
78+
osrelease = osreleases[0]
7979
osrelease.name = name
8080
osrelease.save()
8181
if not osrelease:

operatingsystems/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ class OSVariantViewSet(viewsets.ModelViewSet):
347347
"""
348348
API endpoint that allows operating system variants to be viewed or edited.
349349
"""
350-
queryset = OSVariant.objects.all()
350+
queryset = OSVariant.objects.select_related('osrelease', 'arch').all()
351351
serializer_class = OSVariantSerializer
352352
filterset_fields = ['name']
353353

packages/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ class PackageViewSet(viewsets.ModelViewSet):
185185
"""
186186
API endpoint that allows packages to be viewed or edited.
187187
"""
188-
queryset = Package.objects.all()
188+
queryset = Package.objects.select_related('name', 'arch').all()
189189
serializer_class = PackageSerializer
190190
filterset_fields = [
191191
'name',
@@ -201,6 +201,6 @@ class PackageUpdateViewSet(viewsets.ModelViewSet):
201201
"""
202202
API endpoint that allows packages updates to be viewed or edited.
203203
"""
204-
queryset = PackageUpdate.objects.all()
204+
queryset = PackageUpdate.objects.select_related('oldpackage', 'newpackage').all()
205205
serializer_class = PackageUpdateSerializer
206206
filterset_fields = ['oldpackage', 'newpackage', 'security']

repos/models.py

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,11 @@ def refresh(self, force=False):
8282
force can be set to force a reset of all the mirrors metadata
8383
"""
8484
if force:
85-
for mirror in self.mirror_set.all():
86-
mirror.packages_checksum = None
87-
mirror.modules_checksum = None
88-
mirror.errata_checksum = None
89-
mirror.save()
85+
self.mirror_set.all().update(
86+
packages_checksum=None,
87+
modules_checksum=None,
88+
errata_checksum=None
89+
)
9090

9191
if not self.auth_required:
9292
if self.repotype == Repository.DEB:
@@ -108,9 +108,7 @@ def refresh_errata(self, force=False):
108108
""" Refresh errata metadata for all of a repos mirrors
109109
"""
110110
if force:
111-
for mirror in self.mirror_set.all():
112-
mirror.errata_checksum = None
113-
mirror.save()
111+
self.mirror_set.all().update(errata_checksum=None)
114112
if self.repotype == Repository.RPM:
115113
refresh_repo_errata(self)
116114

@@ -120,21 +118,15 @@ def disable(self):
120118
each mirror so that it doesn't try to update its package metadata.
121119
"""
122120
self.enabled = False
123-
for mirror in self.mirror_set.all():
124-
mirror.enabled = False
125-
mirror.refresh = False
126-
mirror.save()
121+
self.mirror_set.all().update(enabled=False, refresh=False)
127122

128123
def enable(self):
129124
""" Enable a repo. This involves enabling each mirror, which allows it
130125
to be considered for package updates, and enabling refresh for each
131126
mirror so that it updates its package metadata.
132127
"""
133128
self.enabled = True
134-
for mirror in self.mirror_set.all():
135-
mirror.enabled = True
136-
mirror.refresh = True
137-
mirror.save()
129+
self.mirror_set.all().update(enabled=True, refresh=True)
138130

139131

140132
class Mirror(models.Model):

repos/utils.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ def add_mirrors_from_urls(repo, mirror_urls):
177177
mirror_url = mirror_url.replace('$basearch', repo.arch.name)
178178
mirror_url = mirror_url.rstrip('/')
179179
q = Q(mirrorlist=False, refresh=True, enabled=True)
180-
existing = repo.mirror_set.filter(q).count()
180+
existing_mirrors = repo.mirror_set.filter(q)[:max_mirrors]
181+
existing = len(existing_mirrors)
181182
if existing >= max_mirrors:
182183
text = f'{existing} Mirrors already exist (max={max_mirrors}), not adding more'
183184
warning_message(text=text)
@@ -273,11 +274,12 @@ def find_best_repo(package, hostrepos):
273274
repo. Returns the best repo.
274275
"""
275276
best_repo = None
276-
package_repos = hostrepos.filter(repo__mirror__packages=package).distinct()
277+
package_repos = hostrepos.filter(repo__mirror__packages=package).select_related('repo').distinct()
277278

279+
package_repos = list(package_repos)
278280
if package_repos:
279281
best_repo = package_repos[0]
280-
if package_repos.count() > 1:
282+
if len(package_repos) > 1:
281283
for hostrepo in package_repos:
282284
if hostrepo.repo.security:
283285
best_repo = hostrepo

repos/views.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
@login_required
4444
def repo_list(request):
4545

46-
repos = Repository.objects.select_related().order_by('name')
46+
repos = Repository.objects.select_related('arch').order_by('name')
4747

4848
if 'repotype' in request.GET:
4949
repos = repos.filter(repotype=request.GET['repotype'])
@@ -146,11 +146,11 @@ def move_mirrors(repo):
146146
hostrepo.delete()
147147
mirror.repo = repo
148148
mirror.save()
149-
if oldrepo.mirror_set.count() == 0:
149+
if not oldrepo.mirror_set.exists():
150150
oldrepo.delete()
151151

152152
# Use cached packages_count instead of expensive annotation
153-
mirrors = Mirror.objects.select_related().order_by('packages_checksum')
153+
mirrors = Mirror.objects.select_related('repo').order_by('packages_checksum')
154154

155155
checksum = None
156156
if 'checksum' in request.GET:
@@ -318,9 +318,7 @@ def repo_edit(request, repo_id):
318318
repo = edit_form.save()
319319
repo.save()
320320
mirrors = edit_form.cleaned_data['mirrors']
321-
for mirror in mirrors:
322-
mirror.repo = repo
323-
mirror.save()
321+
mirrors.update(repo=repo)
324322
if repo.enabled:
325323
repo.enable()
326324
else:
@@ -418,7 +416,7 @@ def _get_filtered_repos(filter_params):
418416
from urllib.parse import parse_qs
419417
params = parse_qs(filter_params)
420418

421-
repos = Repository.objects.select_related().order_by('name')
419+
repos = Repository.objects.select_related('arch').order_by('name')
422420

423421
if 'repotype' in params:
424422
repos = repos.filter(repotype=params['repotype'][0])
@@ -509,7 +507,7 @@ def _get_filtered_mirrors(filter_params):
509507
from urllib.parse import parse_qs
510508
params = parse_qs(filter_params)
511509

512-
mirrors = Mirror.objects.select_related().order_by('packages_checksum')
510+
mirrors = Mirror.objects.select_related('repo').order_by('packages_checksum')
513511

514512
if 'checksum' in params:
515513
mirrors = mirrors.filter(packages_checksum=params['checksum'][0])
@@ -591,21 +589,21 @@ class RepositoryViewSet(viewsets.ModelViewSet):
591589
"""
592590
API endpoint that allows repositories to be viewed or edited.
593591
"""
594-
queryset = Repository.objects.all()
592+
queryset = Repository.objects.select_related('arch').all()
595593
serializer_class = RepositorySerializer
596594

597595

598596
class MirrorViewSet(viewsets.ModelViewSet):
599597
"""
600598
API endpoint that allows mirrors to be viewed or edited.
601599
"""
602-
queryset = Mirror.objects.all()
600+
queryset = Mirror.objects.select_related('repo').all()
603601
serializer_class = MirrorSerializer
604602

605603

606604
class MirrorPackageViewSet(viewsets.ModelViewSet):
607605
"""
608606
API endpoint that allows mirror packages to be viewed or edited.
609607
"""
610-
queryset = MirrorPackage.objects.all()
608+
queryset = MirrorPackage.objects.select_related('mirror', 'package').all()
611609
serializer_class = MirrorPackageSerializer

0 commit comments

Comments
 (0)