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

Proposed by Björn Tillenius
Status: Merged
Approved by: Björn Tillenius
Approved revision: 86622db0d513f34527b61ffcd434a0bcbe83567b
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~bjornt/maas:bug-1835316-add-event-index
Merge into: maas:master
Diff against target: 174 lines (+56/-10)
5 files modified
src/maasserver/migrations/maasserver/0194_machine_listing_event_index.py (+24/-0)
src/maasserver/migrations/maasserver/0195_merge_20190902_1357.py (+16/-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)
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
MAAS Lander Needs Fixing
Alberto Donato (community) Approve
Review via email: mp+371979@code.launchpad.net

Commit message

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.

The added patch depends on 0187, which is the latest patch on 2.6, since this
patch is to be backported there.

To post a comment you must log in.
Revision history for this message
Alberto Donato (ack) wrote :

LGTM

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

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

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/6265/console
COMMIT: 637213a7fb9aac5cc07b13c0415bffdabf80bc71

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

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

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

review: Needs Fixing
Revision history for this message
Blake Rouse (blake-rouse) wrote :

I read your email, still a little confused on the merging of migrations. Want to understand that completely first. Overall the change of adding the index looks good.

review: Needs Information
Revision history for this message
Björn Tillenius (bjornt) :
Revision history for this message
Blake Rouse (blake-rouse) wrote :

That means the backport will not be a strait cherry-pick, is it possible to split this over 2 branches or will it not land in master?

Revision history for this message
Björn Tillenius (bjornt) wrote :

> That means the backport will not be a strait cherry-pick, is it possible to
> split this over 2 branches or will it not land in master?

No, it's not possible to split it over two commits. Without that merge patch,
Django will complain that there are more than one leaf patch.

On the other hand, backporting of DB patches have never been straight
cherry-picks, since they did re-ordering of db patches that didn't exist in
the backported version. So from that point of view, it's no worse than before.

Revision history for this message
Blake Rouse (blake-rouse) wrote :

Yeah I thought that was the case. Looks good!

review: Approve

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/migrations/maasserver/0195_merge_20190902_1357.py b/src/maasserver/migrations/maasserver/0195_merge_20190902_1357.py
0new file mode 10064425new file mode 100644
index 0000000..97af45a
--- /dev/null
+++ b/src/maasserver/migrations/maasserver/0195_merge_20190902_1357.py
@@ -0,0 +1,16 @@
1# -*- coding: utf-8 -*-
2# Generated by Django 1.11.11 on 2019-09-02 13:57
3from __future__ import unicode_literals
4
5from django.db import migrations
6
7
8class Migration(migrations.Migration):
9
10 dependencies = [
11 ('maasserver', '0193_merge_maasserver_0191_1092'),
12 ('maasserver', '0194_machine_listing_event_index'),
13 ]
14
15 operations = [
16 ]
diff --git a/src/maasserver/models/event.py b/src/maasserver/models/event.py
index 3d0b169..fe58ff8 100644
--- a/src/maasserver/models/event.py
+++ b/src/maasserver/models/event.py
@@ -13,6 +13,7 @@ from django.db.models import (
13 CharField,13 CharField,
14 DO_NOTHING,14 DO_NOTHING,
15 ForeignKey,15 ForeignKey,
16 Index,
16 IntegerField,17 IntegerField,
17 Manager,18 Manager,
18 PROTECT,19 PROTECT,
@@ -146,6 +147,11 @@ class Event(CleanSave, TimestampedModel):
146 index_together = (147 index_together = (
147 ("node", "id"),148 ("node", "id"),
148 )149 )
150 indexes = [
151 # Needed to get the latest event for each node on the
152 # machine listing page.
153 Index(fields=['node', '-created', '-id']),
154 ]
149155
150 @property156 @property
151 def endpoint_name(self):157 def endpoint_name(self):
diff --git a/src/maasserver/models/tests/test_node.py b/src/maasserver/models/tests/test_node.py
index 191b963..de1b513 100644
--- a/src/maasserver/models/tests/test_node.py
+++ b/src/maasserver/models/tests/test_node.py
@@ -1982,7 +1982,7 @@ class TestNode(MAASServerTestCase):
1982 self.patch(Node, "_set_status")1982 self.patch(Node, "_set_status")
1983 with post_commit_hooks:1983 with post_commit_hooks:
1984 node.abort_disk_erasing(owner)1984 node.abort_disk_erasing(owner)
1985 events = Event.objects.filter(node=node)1985 events = Event.objects.filter(node=node).order_by('id')
1986 self.assertEqual(1986 self.assertEqual(
1987 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_ERASE_DISK)1987 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_ERASE_DISK)
1988 self.assertEqual(1988 self.assertEqual(
@@ -2113,7 +2113,7 @@ class TestNode(MAASServerTestCase):
2113 self.patch(Node, "_stop").return_value = None2113 self.patch(Node, "_stop").return_value = None
2114 with post_commit_hooks:2114 with post_commit_hooks:
2115 node.abort_deploying(admin)2115 node.abort_deploying(admin)
2116 events = Event.objects.filter(node=node)2116 events = Event.objects.filter(node=node).order_by('id')
2117 self.assertEqual(2117 self.assertEqual(
2118 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_DEPLOYMENT)2118 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_DEPLOYMENT)
2119 self.assertEqual(2119 self.assertEqual(
@@ -2170,7 +2170,7 @@ class TestNode(MAASServerTestCase):
2170 self.patch(Node, "_stop").return_value = None2170 self.patch(Node, "_stop").return_value = None
2171 with post_commit_hooks:2171 with post_commit_hooks:
2172 node.abort_testing(admin)2172 node.abort_testing(admin)
2173 events = Event.objects.filter(node=node)2173 events = Event.objects.filter(node=node).order_by('id')
2174 self.assertEqual(2174 self.assertEqual(
2175 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_TESTING)2175 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_TESTING)
2176 self.assertEqual(2176 self.assertEqual(
@@ -2339,7 +2339,7 @@ class TestNode(MAASServerTestCase):
2339 node.power_state = POWER_STATE.OFF2339 node.power_state = POWER_STATE.OFF
2340 with post_commit_hooks:2340 with post_commit_hooks:
2341 node.release()2341 node.release()
2342 events = Event.objects.filter(node=node)2342 events = Event.objects.filter(node=node).order_by('id')
2343 self.expectThat(events[1].type.name, Equals(EVENT_TYPES.RELEASING))2343 self.expectThat(events[1].type.name, Equals(EVENT_TYPES.RELEASING))
2344 self.expectThat(events[2].type.name, Equals(EVENT_TYPES.RELEASED))2344 self.expectThat(events[2].type.name, Equals(EVENT_TYPES.RELEASED))
2345 self.expectThat(node._stop, MockNotCalled())2345 self.expectThat(node._stop, MockNotCalled())
@@ -2542,7 +2542,7 @@ class TestNode(MAASServerTestCase):
2542 self.patch(node, '_set_status')2542 self.patch(node, '_set_status')
2543 with post_commit_hooks:2543 with post_commit_hooks:
2544 node.release(owner)2544 node.release(owner)
2545 events = Event.objects.filter(node=node)2545 events = Event.objects.filter(node=node).order_by('id')
2546 self.assertEqual(events[0].type.name, EVENT_TYPES.REQUEST_NODE_RELEASE)2546 self.assertEqual(events[0].type.name, EVENT_TYPES.REQUEST_NODE_RELEASE)
2547 self.assertEqual(events[1].type.name, EVENT_TYPES.RELEASING)2547 self.assertEqual(events[1].type.name, EVENT_TYPES.RELEASING)
25482548
@@ -3079,7 +3079,7 @@ class TestNode(MAASServerTestCase):
3079 node.start_commissioning(admin)3079 node.start_commissioning(admin)
3080 post_commit_hooks.reset() # Ignore these for now.3080 post_commit_hooks.reset() # Ignore these for now.
3081 node = reload_object(node)3081 node = reload_object(node)
3082 events = Event.objects.filter(node=node)3082 events = Event.objects.filter(node=node).order_by('id')
3083 self.assertEqual(3083 self.assertEqual(
3084 events[0].type.name, EVENT_TYPES.REQUEST_NODE_START_COMMISSIONING)3084 events[0].type.name, EVENT_TYPES.REQUEST_NODE_START_COMMISSIONING)
3085 self.assertEqual(events[1].type.name, EVENT_TYPES.COMMISSIONING)3085 self.assertEqual(events[1].type.name, EVENT_TYPES.COMMISSIONING)
@@ -3155,7 +3155,7 @@ class TestNode(MAASServerTestCase):
3155 self.patch(Node, "_stop").return_value = None3155 self.patch(Node, "_stop").return_value = None
3156 with post_commit_hooks:3156 with post_commit_hooks:
3157 node.abort_commissioning(admin)3157 node.abort_commissioning(admin)
3158 events = Event.objects.filter(node=node)3158 events = Event.objects.filter(node=node).order_by('id')
3159 self.assertEqual(3159 self.assertEqual(
3160 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_COMMISSIONING)3160 events[0].type.name, EVENT_TYPES.REQUEST_NODE_ABORT_COMMISSIONING)
3161 self.assertEqual(3161 self.assertEqual(
@@ -3289,7 +3289,7 @@ class TestNode(MAASServerTestCase):
3289 self.patch(node, '_start').return_value = None3289 self.patch(node, '_start').return_value = None
3290 admin = factory.make_admin()3290 admin = factory.make_admin()
3291 node.start_testing(admin, testing_scripts=[script.name])3291 node.start_testing(admin, testing_scripts=[script.name])
3292 events = Event.objects.filter(node=node)3292 events = Event.objects.filter(node=node).order_by('id')
3293 post_commit_hooks.reset() # Ignore these for now.3293 post_commit_hooks.reset() # Ignore these for now.
3294 node = reload_object(node)3294 node = reload_object(node)
3295 self.assertEqual(3295 self.assertEqual(
@@ -4640,7 +4640,7 @@ class TestNode(MAASServerTestCase):
4640 node.start_rescue_mode(admin)4640 node.start_rescue_mode(admin)
4641 post_commit_hooks.reset() # Ignore these for now.4641 post_commit_hooks.reset() # Ignore these for now.
4642 node = reload_object(node)4642 node = reload_object(node)
4643 events = Event.objects.filter(node=node)4643 events = Event.objects.filter(node=node).order_by('id')
4644 self.assertEqual(4644 self.assertEqual(
4645 events[0].type.name, EVENT_TYPES.REQUEST_NODE_START_RESCUE_MODE)4645 events[0].type.name, EVENT_TYPES.REQUEST_NODE_START_RESCUE_MODE)
4646 self.assertEqual(events[1].type.name, EVENT_TYPES.ENTERING_RESCUE_MODE)4646 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)

Subscribers

People subscribed via source and target branches