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
diff --git a/src/maasserver/migrations/maasserver/0194_machine_listing_event_index.py b/src/maasserver/migrations/maasserver/0194_machine_listing_event_index.py
0new file mode 1006440new file mode 100644
index 0000000..b82a8ea
--- /dev/null
+++ b/src/maasserver/migrations/maasserver/0194_machine_listing_event_index.py
@@ -0,0 +1,24 @@
1# -*- coding: utf-8 -*-
2# Generated by Django 1.11.11 on 2019-08-28 15:07
3from __future__ import unicode_literals
4
5from django.db import (
6 migrations,
7 models,
8)
9
10
11class Migration(migrations.Migration):
12
13 # This depends on the latest (at time of writing) patch in 2.6,
14 # since this patch is to be backported there.
15 dependencies = [
16 ('maasserver', '0192_event_node_no_set_null'),
17 ]
18
19 operations = [
20 migrations.AddIndex(
21 model_name='event',
22 index=models.Index(fields=['node', '-created', '-id'], name='maasserver__node_id_e4a8dd_idx'),
23 ),
24 ]
diff --git a/src/maasserver/models/event.py b/src/maasserver/models/event.py
index c49628a..f64526e 100644
--- a/src/maasserver/models/event.py
+++ b/src/maasserver/models/event.py
@@ -12,6 +12,7 @@ import logging
12from django.db.models import (12from django.db.models import (
13 CharField,13 CharField,
14 ForeignKey,14 ForeignKey,
15 Index,
15 IntegerField,16 IntegerField,
16 Manager,17 Manager,
17 PROTECT,18 PROTECT,
@@ -145,6 +146,11 @@ class Event(CleanSave, TimestampedModel):
145 index_together = (146 index_together = (
146 ("node", "id"),147 ("node", "id"),
147 )148 )
149 indexes = [
150 # Needed to get the latest event for each node on the
151 # machine listing page.
152 Index(fields=['node', '-created', '-id']),
153 ]
148154
149 @property155 @property
150 def endpoint_name(self):156 def endpoint_name(self):
diff --git a/src/maasserver/models/tests/test_node.py b/src/maasserver/models/tests/test_node.py
index 593fd5d..a1739bd 100644
--- a/src/maasserver/models/tests/test_node.py
+++ b/src/maasserver/models/tests/test_node.py
@@ -1974,7 +1974,7 @@ class TestNode(MAASServerTestCase):
1974 self.patch(Node, "_set_status")1974 self.patch(Node, "_set_status")
1975 with post_commit_hooks:1975 with post_commit_hooks:
1976 node.abort_disk_erasing(owner)1976 node.abort_disk_erasing(owner)
1977 events = Event.objects.filter(node=node)1977 events = Event.objects.filter(node=node).order_by('id')
1978 self.assertEqual(1978 self.assertEqual(
1979 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_ERASE_DISK)1979 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_ERASE_DISK)
1980 self.assertEqual(1980 self.assertEqual(
@@ -2105,7 +2105,7 @@ class TestNode(MAASServerTestCase):
2105 self.patch(Node, "_stop").return_value = None2105 self.patch(Node, "_stop").return_value = None
2106 with post_commit_hooks:2106 with post_commit_hooks:
2107 node.abort_deploying(admin)2107 node.abort_deploying(admin)
2108 events = Event.objects.filter(node=node)2108 events = Event.objects.filter(node=node).order_by('id')
2109 self.assertEqual(2109 self.assertEqual(
2110 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_DEPLOYMENT)2110 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_DEPLOYMENT)
2111 self.assertEqual(2111 self.assertEqual(
@@ -2162,7 +2162,7 @@ class TestNode(MAASServerTestCase):
2162 self.patch(Node, "_stop").return_value = None2162 self.patch(Node, "_stop").return_value = None
2163 with post_commit_hooks:2163 with post_commit_hooks:
2164 node.abort_testing(admin)2164 node.abort_testing(admin)
2165 events = Event.objects.filter(node=node)2165 events = Event.objects.filter(node=node).order_by('id')
2166 self.assertEqual(2166 self.assertEqual(
2167 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_TESTING)2167 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_TESTING)
2168 self.assertEqual(2168 self.assertEqual(
@@ -2331,7 +2331,7 @@ class TestNode(MAASServerTestCase):
2331 node.power_state = POWER_STATE.OFF2331 node.power_state = POWER_STATE.OFF
2332 with post_commit_hooks:2332 with post_commit_hooks:
2333 node.release()2333 node.release()
2334 events = Event.objects.filter(node=node)2334 events = Event.objects.filter(node=node).order_by('id')
2335 self.expectThat(events[1].type.name, Equals(EVENT_TYPES.RELEASING))2335 self.expectThat(events[1].type.name, Equals(EVENT_TYPES.RELEASING))
2336 self.expectThat(events[2].type.name, Equals(EVENT_TYPES.RELEASED))2336 self.expectThat(events[2].type.name, Equals(EVENT_TYPES.RELEASED))
2337 self.expectThat(node._stop, MockNotCalled())2337 self.expectThat(node._stop, MockNotCalled())
@@ -2534,7 +2534,7 @@ class TestNode(MAASServerTestCase):
2534 self.patch(node, '_set_status')2534 self.patch(node, '_set_status')
2535 with post_commit_hooks:2535 with post_commit_hooks:
2536 node.release(owner)2536 node.release(owner)
2537 events = Event.objects.filter(node=node)2537 events = Event.objects.filter(node=node).order_by('id')
2538 self.assertEqual(events[0].type.name, EVENT_TYPES.REQUEST_NODE_RELEASE)2538 self.assertEqual(events[0].type.name, EVENT_TYPES.REQUEST_NODE_RELEASE)
2539 self.assertEqual(events[1].type.name, EVENT_TYPES.RELEASING)2539 self.assertEqual(events[1].type.name, EVENT_TYPES.RELEASING)
25402540
@@ -3071,7 +3071,7 @@ class TestNode(MAASServerTestCase):
3071 node.start_commissioning(admin)3071 node.start_commissioning(admin)
3072 post_commit_hooks.reset() # Ignore these for now.3072 post_commit_hooks.reset() # Ignore these for now.
3073 node = reload_object(node)3073 node = reload_object(node)
3074 events = Event.objects.filter(node=node)3074 events = Event.objects.filter(node=node).order_by('id')
3075 self.assertEqual(3075 self.assertEqual(
3076 events[0].type.name, EVENT_TYPES.REQUEST_NODE_START_COMMISSIONING)3076 events[0].type.name, EVENT_TYPES.REQUEST_NODE_START_COMMISSIONING)
3077 self.assertEqual(events[1].type.name, EVENT_TYPES.COMMISSIONING)3077 self.assertEqual(events[1].type.name, EVENT_TYPES.COMMISSIONING)
@@ -3147,7 +3147,7 @@ class TestNode(MAASServerTestCase):
3147 self.patch(Node, "_stop").return_value = None3147 self.patch(Node, "_stop").return_value = None
3148 with post_commit_hooks:3148 with post_commit_hooks:
3149 node.abort_commissioning(admin)3149 node.abort_commissioning(admin)
3150 events = Event.objects.filter(node=node)3150 events = Event.objects.filter(node=node).order_by('id')
3151 self.assertEqual(3151 self.assertEqual(
3152 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_COMMISSIONING)3152 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_COMMISSIONING)
3153 self.assertEqual(3153 self.assertEqual(
@@ -3281,7 +3281,7 @@ class TestNode(MAASServerTestCase):
3281 self.patch(node, '_power_cycle').return_value = None3281 self.patch(node, '_power_cycle').return_value = None
3282 admin = factory.make_admin()3282 admin = factory.make_admin()
3283 node.start_testing(admin, testing_scripts=[script.name])3283 node.start_testing(admin, testing_scripts=[script.name])
3284 events = Event.objects.filter(node=node)3284 events = Event.objects.filter(node=node).order_by('id')
3285 post_commit_hooks.reset() # Ignore these for now.3285 post_commit_hooks.reset() # Ignore these for now.
3286 node = reload_object(node)3286 node = reload_object(node)
3287 self.assertEqual(3287 self.assertEqual(
@@ -4619,7 +4619,7 @@ class TestNode(MAASServerTestCase):
4619 node.start_rescue_mode(admin)4619 node.start_rescue_mode(admin)
4620 post_commit_hooks.reset() # Ignore these for now.4620 post_commit_hooks.reset() # Ignore these for now.
4621 node = reload_object(node)4621 node = reload_object(node)
4622 events = Event.objects.filter(node=node)4622 events = Event.objects.filter(node=node).order_by('id')
4623 self.assertEqual(4623 self.assertEqual(
4624 events[0].type.name, EVENT_TYPES.REQUEST_NODE_START_RESCUE_MODE)4624 events[0].type.name, EVENT_TYPES.REQUEST_NODE_START_RESCUE_MODE)
4625 self.assertEqual(events[1].type.name, EVENT_TYPES.ENTERING_RESCUE_MODE)4625 self.assertEqual(events[1].type.name, EVENT_TYPES.ENTERING_RESCUE_MODE)
diff --git a/src/maasserver/rpc/tests/test_boot.py b/src/maasserver/rpc/tests/test_boot.py
index a0bfd50..859b752 100644
--- a/src/maasserver/rpc/tests/test_boot.py
+++ b/src/maasserver/rpc/tests/test_boot.py
@@ -769,7 +769,7 @@ class TestGetConfig(MAASServerTestCase):
769 for purpose, description in purposes:769 for purpose, description in purposes:
770 node = self.make_node()770 node = self.make_node()
771 event_log_pxe_request(node, purpose)771 event_log_pxe_request(node, purpose)
772 events = Event.objects.filter(node=node)772 events = Event.objects.filter(node=node).order_by('id')
773 self.assertEqual(description, events[0].description)773 self.assertEqual(description, events[0].description)
774 self.assertEqual(events[1].type.description, EVENT_DETAILS[774 self.assertEqual(events[1].type.description, EVENT_DETAILS[
775 EVENT_TYPES.PERFORMING_PXE_BOOT].description)775 EVENT_TYPES.PERFORMING_PXE_BOOT].description)
diff --git a/src/metadataserver/tests/test_api.py b/src/metadataserver/tests/test_api.py
index e9f4b25..5f43121 100644
--- a/src/metadataserver/tests/test_api.py
+++ b/src/metadataserver/tests/test_api.py
@@ -2166,7 +2166,7 @@ class TestCommissioningAPI(MAASServerTestCase):
2166 self.assertThat(2166 self.assertThat(
2167 Node.set_default_storage_layout,2167 Node.set_default_storage_layout,
2168 MockCalledOnceWith(node))2168 MockCalledOnceWith(node))
2169 events = Event.objects.filter(node=node)2169 events = Event.objects.filter(node=node).order_by('id')
2170 self.assertThat(2170 self.assertThat(
2171 events[0].description,2171 events[0].description,
2172 DocTestMatches("Failed to set default storage layout."))2172 DocTestMatches("Failed to set default storage layout."))
@@ -2188,7 +2188,7 @@ class TestCommissioningAPI(MAASServerTestCase):
2188 self.assertThat(2188 self.assertThat(
2189 Node.set_initial_networking_configuration,2189 Node.set_initial_networking_configuration,
2190 MockCalledOnceWith(node))2190 MockCalledOnceWith(node))
2191 events = Event.objects.filter(node=node)2191 events = Event.objects.filter(node=node).order_by('id')
2192 self.assertThat(2192 self.assertThat(
2193 events[0].description,2193 events[0].description,
2194 DocTestMatches("Failed to set default networking configuration."))2194 DocTestMatches("Failed to set default networking configuration."))

Subscribers

People subscribed via source and target branches