Merge lp:~mpontillo/maas/discovery-websocket-disable-batching--bug-1627362 into lp:~maas-committers/maas/trunk

Proposed by Mike Pontillo
Status: Rejected
Rejected by: MAAS Lander
Proposed branch: lp:~mpontillo/maas/discovery-websocket-disable-batching--bug-1627362
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 45 lines (+23/-1)
1 file modified
src/maasserver/websockets/handlers/discovery.py (+23/-1)
To merge this branch: bzr merge lp:~mpontillo/maas/discovery-websocket-disable-batching--bug-1627362
Reviewer Review Type Date Requested Status
MAAS Maintainers Pending
Review via email: mp+307637@code.launchpad.net

Commit message

Workaround to prevent a crash in the websocket batch handling.

 * Symptom: the Web UI for discoveries fails to load if we have
   more discoveries than the batch limit.
 * This branch is a simple workaround: override the list() method
   in the Discovery handler so that it doesn't try to do batching.

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

Transitioned to Git.

lp:maas has now moved from Bzr to Git.
Please propose your branches with Launchpad using Git.

git clone https://git.launchpad.net/maas

Unmerged revisions

5434. By Mike Pontillo

Format imports. Fix docstring.

5433. By Mike Pontillo

Add workarond for discovery Web UI crash.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/websockets/handlers/discovery.py'
2--- src/maasserver/websockets/handlers/discovery.py 2016-09-06 20:31:47 +0000
3+++ src/maasserver/websockets/handlers/discovery.py 2016-10-04 21:44:03 +0000
4@@ -7,6 +7,8 @@
5 "DiscoveryHandler",
6 ]
7
8+from operator import attrgetter
9+
10 from maasserver.models import Discovery
11 from maasserver.websockets.base import dehydrate_datetime
12 from maasserver.websockets.handlers.viewmodel import ViewModelHandler
13@@ -26,7 +28,6 @@
14 # items can come in as the new first-items in the query. But that's why
15 # we're also going to poll. But using row_number() seems to be a good
16 # compromise for now.
17- batch_key = 'first_seen'
18 pk = 'discovery_id'
19 allowed_methods = [
20 'list',
21@@ -43,3 +44,24 @@
22
23 def dehydrate_first_seen(self, datetime):
24 return dehydrate_datetime(datetime)
25+
26+ def list(self, params):
27+ """List objects.
28+
29+ This is a variant of the base websocket in that it does NOT support
30+ batch queries. You'll get back all of the objects at once.
31+
32+ Workaround for an issue where batch queries can crash this handler,
33+ since a timestamp is used for the query.
34+
35+ See bug #1627362.
36+ """
37+ queryset = self.get_queryset()
38+ queryset = queryset.order_by('-last_seen')
39+ objs = list(queryset)
40+ getpk = attrgetter(self._meta.pk)
41+ self.cache["loaded_pks"].update(getpk(obj) for obj in objs)
42+ return [
43+ self.full_dehydrate(obj, for_list=True)
44+ for obj in objs
45+ ]