Merge ~bjornt/maas:2.6-bug-1835316-add-event-index into maas:2.6

Proposed by Björn Tillenius
Status: Merged
Approved by: Björn Tillenius
Approved revision: 58158cff581a1bc45eaf696f33053be7bbb15a5f
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~bjornt/maas:2.6-bug-1835316-add-event-index
Merge into: maas:2.6
Diff against target: 174 lines (+42/-12)
5 files modified
src/maasserver/migrations/maasserver/0194_machine_listing_event_index.py (+24/-0)
src/maasserver/models/event.py (+6/-0)
src/maasserver/models/tests/test_node.py (+9/-9)
src/maasserver/rpc/tests/test_boot.py (+1/-1)
src/metadataserver/tests/test_api.py (+2/-2)
Reviewer Review Type Date Requested Status
MAAS Lander Needs Fixing
Björn Tillenius Approve
Review via email: mp+372183@code.launchpad.net

Commit message

Backport b745a2765caa132eb76a542435d0b1116f420c82.

LP: #1835316 - Requesting machine listing results in 100% postgresql CPU
usage

Add index to the event table to speed up machine listing.
The index speeds up getting the latest event for each node that is
displayed on the machine listing.

To post a comment you must log in.
Revision history for this message
Björn Tillenius (bjornt) wrote :

Self-approve backport.

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b 2.6-bug-1835316-add-event-index lp:~bjornt/maas/+git/maas into -b 2.6 lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/6314/console
COMMIT: a1ca33a891f35c6e6d75d9f2e7f9e00fb6721c18

review: Needs Fixing
58158cf... by Björn Tillenius

Fix test failures.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/migrations/maasserver/0194_machine_listing_event_index.py b/src/maasserver/migrations/maasserver/0194_machine_listing_event_index.py
2new file mode 100644
3index 0000000..b82a8ea
4--- /dev/null
5+++ b/src/maasserver/migrations/maasserver/0194_machine_listing_event_index.py
6@@ -0,0 +1,24 @@
7+# -*- coding: utf-8 -*-
8+# Generated by Django 1.11.11 on 2019-08-28 15:07
9+from __future__ import unicode_literals
10+
11+from django.db import (
12+ migrations,
13+ models,
14+)
15+
16+
17+class Migration(migrations.Migration):
18+
19+ # This depends on the latest (at time of writing) patch in 2.6,
20+ # since this patch is to be backported there.
21+ dependencies = [
22+ ('maasserver', '0192_event_node_no_set_null'),
23+ ]
24+
25+ operations = [
26+ migrations.AddIndex(
27+ model_name='event',
28+ index=models.Index(fields=['node', '-created', '-id'], name='maasserver__node_id_e4a8dd_idx'),
29+ ),
30+ ]
31diff --git a/src/maasserver/models/event.py b/src/maasserver/models/event.py
32index c49628a..f64526e 100644
33--- a/src/maasserver/models/event.py
34+++ b/src/maasserver/models/event.py
35@@ -12,6 +12,7 @@ import logging
36 from django.db.models import (
37 CharField,
38 ForeignKey,
39+ Index,
40 IntegerField,
41 Manager,
42 PROTECT,
43@@ -145,6 +146,11 @@ class Event(CleanSave, TimestampedModel):
44 index_together = (
45 ("node", "id"),
46 )
47+ indexes = [
48+ # Needed to get the latest event for each node on the
49+ # machine listing page.
50+ Index(fields=['node', '-created', '-id']),
51+ ]
52
53 @property
54 def endpoint_name(self):
55diff --git a/src/maasserver/models/tests/test_node.py b/src/maasserver/models/tests/test_node.py
56index 593fd5d..a1739bd 100644
57--- a/src/maasserver/models/tests/test_node.py
58+++ b/src/maasserver/models/tests/test_node.py
59@@ -1974,7 +1974,7 @@ class TestNode(MAASServerTestCase):
60 self.patch(Node, "_set_status")
61 with post_commit_hooks:
62 node.abort_disk_erasing(owner)
63- events = Event.objects.filter(node=node)
64+ events = Event.objects.filter(node=node).order_by('id')
65 self.assertEqual(
66 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_ERASE_DISK)
67 self.assertEqual(
68@@ -2105,7 +2105,7 @@ class TestNode(MAASServerTestCase):
69 self.patch(Node, "_stop").return_value = None
70 with post_commit_hooks:
71 node.abort_deploying(admin)
72- events = Event.objects.filter(node=node)
73+ events = Event.objects.filter(node=node).order_by('id')
74 self.assertEqual(
75 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_DEPLOYMENT)
76 self.assertEqual(
77@@ -2162,7 +2162,7 @@ class TestNode(MAASServerTestCase):
78 self.patch(Node, "_stop").return_value = None
79 with post_commit_hooks:
80 node.abort_testing(admin)
81- events = Event.objects.filter(node=node)
82+ events = Event.objects.filter(node=node).order_by('id')
83 self.assertEqual(
84 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_TESTING)
85 self.assertEqual(
86@@ -2331,7 +2331,7 @@ class TestNode(MAASServerTestCase):
87 node.power_state = POWER_STATE.OFF
88 with post_commit_hooks:
89 node.release()
90- events = Event.objects.filter(node=node)
91+ events = Event.objects.filter(node=node).order_by('id')
92 self.expectThat(events[1].type.name, Equals(EVENT_TYPES.RELEASING))
93 self.expectThat(events[2].type.name, Equals(EVENT_TYPES.RELEASED))
94 self.expectThat(node._stop, MockNotCalled())
95@@ -2534,7 +2534,7 @@ class TestNode(MAASServerTestCase):
96 self.patch(node, '_set_status')
97 with post_commit_hooks:
98 node.release(owner)
99- events = Event.objects.filter(node=node)
100+ events = Event.objects.filter(node=node).order_by('id')
101 self.assertEqual(events[0].type.name, EVENT_TYPES.REQUEST_NODE_RELEASE)
102 self.assertEqual(events[1].type.name, EVENT_TYPES.RELEASING)
103
104@@ -3071,7 +3071,7 @@ class TestNode(MAASServerTestCase):
105 node.start_commissioning(admin)
106 post_commit_hooks.reset() # Ignore these for now.
107 node = reload_object(node)
108- events = Event.objects.filter(node=node)
109+ events = Event.objects.filter(node=node).order_by('id')
110 self.assertEqual(
111 events[0].type.name, EVENT_TYPES.REQUEST_NODE_START_COMMISSIONING)
112 self.assertEqual(events[1].type.name, EVENT_TYPES.COMMISSIONING)
113@@ -3147,7 +3147,7 @@ class TestNode(MAASServerTestCase):
114 self.patch(Node, "_stop").return_value = None
115 with post_commit_hooks:
116 node.abort_commissioning(admin)
117- events = Event.objects.filter(node=node)
118+ events = Event.objects.filter(node=node).order_by('id')
119 self.assertEqual(
120 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_COMMISSIONING)
121 self.assertEqual(
122@@ -3281,7 +3281,7 @@ class TestNode(MAASServerTestCase):
123 self.patch(node, '_power_cycle').return_value = None
124 admin = factory.make_admin()
125 node.start_testing(admin, testing_scripts=[script.name])
126- events = Event.objects.filter(node=node)
127+ events = Event.objects.filter(node=node).order_by('id')
128 post_commit_hooks.reset() # Ignore these for now.
129 node = reload_object(node)
130 self.assertEqual(
131@@ -4619,7 +4619,7 @@ class TestNode(MAASServerTestCase):
132 node.start_rescue_mode(admin)
133 post_commit_hooks.reset() # Ignore these for now.
134 node = reload_object(node)
135- events = Event.objects.filter(node=node)
136+ events = Event.objects.filter(node=node).order_by('id')
137 self.assertEqual(
138 events[0].type.name, EVENT_TYPES.REQUEST_NODE_START_RESCUE_MODE)
139 self.assertEqual(events[1].type.name, EVENT_TYPES.ENTERING_RESCUE_MODE)
140diff --git a/src/maasserver/rpc/tests/test_boot.py b/src/maasserver/rpc/tests/test_boot.py
141index a0bfd50..859b752 100644
142--- a/src/maasserver/rpc/tests/test_boot.py
143+++ b/src/maasserver/rpc/tests/test_boot.py
144@@ -769,7 +769,7 @@ class TestGetConfig(MAASServerTestCase):
145 for purpose, description in purposes:
146 node = self.make_node()
147 event_log_pxe_request(node, purpose)
148- events = Event.objects.filter(node=node)
149+ events = Event.objects.filter(node=node).order_by('id')
150 self.assertEqual(description, events[0].description)
151 self.assertEqual(events[1].type.description, EVENT_DETAILS[
152 EVENT_TYPES.PERFORMING_PXE_BOOT].description)
153diff --git a/src/metadataserver/tests/test_api.py b/src/metadataserver/tests/test_api.py
154index e9f4b25..5f43121 100644
155--- a/src/metadataserver/tests/test_api.py
156+++ b/src/metadataserver/tests/test_api.py
157@@ -2166,7 +2166,7 @@ class TestCommissioningAPI(MAASServerTestCase):
158 self.assertThat(
159 Node.set_default_storage_layout,
160 MockCalledOnceWith(node))
161- events = Event.objects.filter(node=node)
162+ events = Event.objects.filter(node=node).order_by('id')
163 self.assertThat(
164 events[0].description,
165 DocTestMatches("Failed to set default storage layout."))
166@@ -2188,7 +2188,7 @@ class TestCommissioningAPI(MAASServerTestCase):
167 self.assertThat(
168 Node.set_initial_networking_configuration,
169 MockCalledOnceWith(node))
170- events = Event.objects.filter(node=node)
171+ events = Event.objects.filter(node=node).order_by('id')
172 self.assertThat(
173 events[0].description,
174 DocTestMatches("Failed to set default networking configuration."))

Subscribers

People subscribed via source and target branches