Merge lp:~cjwatson/launchpad/optimise-getPublishedBinaries into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 18398
Proposed branch: lp:~cjwatson/launchpad/optimise-getPublishedBinaries
Merge into: lp:launchpad
Diff against target: 95 lines (+13/-12)
2 files modified
lib/lp/soyuz/doc/publishing.txt (+6/-6)
lib/lp/soyuz/model/publishing.py (+7/-6)
To merge this branch: bzr merge lp:~cjwatson/launchpad/optimise-getPublishedBinaries
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+325028@code.launchpad.net

Commit message

Stop SPPH.getPublishedBinaries materialising rows outside the current batch.

This fixes webservice timeouts for sources with large numbers of binaries.

To post a comment you must log in.
Revision history for this message
William Grant (wgrant) :
review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/soyuz/doc/publishing.txt'
2--- lib/lp/soyuz/doc/publishing.txt 2016-10-02 12:38:58 +0000
3+++ lib/lp/soyuz/doc/publishing.txt 2017-06-02 21:53:54 +0000
4@@ -512,13 +512,13 @@
5 as active, SUPERSEDED, DELETED and OBSOLETE are excluded. Differently,
6 getBuiltBinaries() follows binaries in any state.
7
8- >>> len(source.getPublishedBinaries())
9+ >>> source.getPublishedBinaries().count()
10 2
11
12 >>> len(source.getBuiltBinaries())
13 2
14
15-Note that getPublishedBinaries() returns a SelectResult and
16+Note that getPublishedBinaries() returns a DecoratedResultSet and
17 getBuiltBinaries() returns a list.
18
19 When we supersede one of the original binary publications, it gets
20@@ -528,7 +528,7 @@
21 >>> a_binary = source.getPublishedBinaries()[0]
22 >>> a_binary.supersede()
23
24- >>> len(source.getPublishedBinaries())
25+ >>> source.getPublishedBinaries().count()
26 1
27
28 >>> len(source.getBuiltBinaries())
29@@ -541,7 +541,7 @@
30 >>> deletable.requestDeletion(mark, "go")
31 >>> deleted = deletable
32
33- >>> len(source.getPublishedBinaries())
34+ >>> source.getPublishedBinaries().count()
35 0
36
37 >>> len(source.getBuiltBinaries())
38@@ -550,13 +550,13 @@
39 Finally we will mark both copied binary publication as obsolete and
40 verify that the getPublishedBinaries() result is also empty after that.
41
42- >>> len(copied_source.getPublishedBinaries())
43+ >>> copied_source.getPublishedBinaries().count()
44 2
45
46 >>> for bin in copied_source.getPublishedBinaries():
47 ... obsoleted = bin.requestObsolescence()
48
49- >>> len(copied_source.getPublishedBinaries())
50+ >>> copied_source.getPublishedBinaries().count()
51 0
52
53 >>> len(copied_source.getBuiltBinaries())
54
55=== modified file 'lib/lp/soyuz/model/publishing.py'
56--- lib/lp/soyuz/model/publishing.py 2017-04-12 11:31:44 +0000
57+++ lib/lp/soyuz/model/publishing.py 2017-06-02 21:53:54 +0000
58@@ -1,4 +1,4 @@
59-# Copyright 2009-2016 Canonical Ltd. This software is licensed under the
60+# Copyright 2009-2017 Canonical Ltd. This software is licensed under the
61 # GNU Affero General Public License version 3 (see the file LICENSE).
62
63 __metaclass__ = type
64@@ -14,7 +14,10 @@
65
66 from collections import defaultdict
67 from datetime import datetime
68-from operator import attrgetter
69+from operator import (
70+ attrgetter,
71+ itemgetter,
72+ )
73 import os
74 import sys
75
76@@ -51,6 +54,7 @@
77 from lp.services.database import bulk
78 from lp.services.database.constants import UTC_NOW
79 from lp.services.database.datetimecol import UtcDateTimeCol
80+from lp.services.database.decoratedresultset import DecoratedResultSet
81 from lp.services.database.enumcol import EnumCol
82 from lp.services.database.interfaces import (
83 IMasterStore,
84@@ -288,10 +292,7 @@
85 """See `ISourcePackagePublishingHistory`."""
86 publishing_set = getUtility(IPublishingSet)
87 result_set = publishing_set.getBinaryPublicationsForSources(self)
88-
89- return [binary_pub
90- for source, binary_pub, binary, binary_name, arch
91- in result_set]
92+ return DecoratedResultSet(result_set, result_decorator=itemgetter(1))
93
94 def getBuiltBinaries(self, want_files=False):
95 """See `ISourcePackagePublishingHistory`."""