Merge lp:~sinzui/launchpad/cache-tweaks-0 into lp:launchpad

Proposed by Curtis Hovey on 2010-05-27
Status: Merged
Merged at revision: 10934
Proposed branch: lp:~sinzui/launchpad/cache-tweaks-0
Merge into: lp:launchpad
Diff against target: 356 lines (+152/-66)
11 files modified
lib/lp/answers/templates/faqcollection-portlet-faqs.pt (+1/-1)
lib/lp/blueprints/browser/tests/test_hasspecifications.py (+34/-0)
lib/lp/registry/browser/configure.zcml (+5/-0)
lib/lp/registry/browser/milestone.py (+3/-1)
lib/lp/registry/browser/person.py (+1/-1)
lib/lp/registry/browser/tests/milestone-views.txt (+23/-0)
lib/lp/registry/templates/distroseries-portlet-packaging.pt (+1/-1)
lib/lp/registry/templates/milestone-index.pt (+16/-59)
lib/lp/registry/templates/milestone-macros.pt (+65/-0)
lib/lp/registry/templates/productseries-milestone-table-row.pt (+2/-2)
lib/lp/soyuz/templates/distroseries-portlet-architectures.pt (+1/-1)
To merge this branch: bzr merge lp:~sinzui/launchpad/cache-tweaks-0
Reviewer Review Type Date Requested Status
Gary Poster (community) Approve on 2010-05-27
Michael Nelson (community) code 2010-05-27 Abstain on 2010-05-27
Jelmer Vernooij (community) code* 2010-05-27 Approve on 2010-05-27
Review via email: mp+26167@code.launchpad.net

Description of the Change

This is my branch to adjust the cache rules for pages.

    lp:~sinzui/launchpad/cache-tweaks-0
    Diff size: 357
    Launchpad bug: https://bugs.launchpad.net/bugs/586058
    Test command: ./bin/test -vv \
        -t milestone -t test_hasspecifications
    Pre-implementation: no one, I really am guessing, really
    Target release: 10.05

Adjust the cache rules for pages
---------------------------------

Edge timeout reports a report a reduction of 50%-80% in timeouts in the pages
that were added. Timeouts still happen for all cached pages though. In the
case of milestones, the caching is too long. Release managers need to see
milestone changes; consider using different cache rules for active milestones.

Rules
-----

Look at the timeouts on edge reported in in the oopses. Identify the slow
chunks.

QA
--

Verify distroseries, project and project group milestone pages
verify the launchpad team spec workload page loads.
verify maverick loads

Lint
----

Linting changed files:
  lib/lp/answers/templates/faqcollection-portlet-faqs.pt
  lib/lp/blueprints/browser/tests/test_hasspecifications.py
  lib/lp/registry/browser/configure.zcml
  lib/lp/registry/browser/milestone.py
  lib/lp/registry/browser/person.py
  lib/lp/registry/browser/tests/milestone-views.txt
  lib/lp/registry/templates/distroseries-portlet-packaging.pt
  lib/lp/registry/templates/milestone-index.pt
  lib/lp/registry/templates/milestone-macros.pt
  lib/lp/registry/templates/productseries-milestone-table-row.pt
  lib/lp/soyuz/templates/distroseries-portlet-architectures.pt

Test
----

    * lib/lp/blueprints/browser/tests/test_hasspecifications.py
      * Added a rudimentary test for the batch size change.
    * lib/lp/registry/browser/tests/milestone-views.txt
      * Added a simple test to verify that the milestone bugtask cache rules
        are based on the state of the milestone.

Implementation
--------------

    * lib/lp/answers/templates/faqcollection-portlet-faqs.pt
      * Increased expiration age because FAQs do not change every day. This
        may help project and project group pages.
    * lib/lp/registry/browser/configure.zcml
      * Registered +milestone-macros so that the milestone bugtask table
        can have different cache times.
    * lib/lp/registry/browser/milestone.py
      * Assembled a menu that is fast to use (no subscription link) when
        working with many milestones. Many pages iterate over milestones and
        provide links to work with them in the list. The oopses indicate the
        timeouts happen when setting up the bug subscription link that is not
        used!
    * lib/lp/registry/browser/person.py
      * Decreased the TestPersonSpecWorkloadView.member batch size from
        75 to 20. I *hope* this fixes the issue on edge. I really cannot
        see if the issue is members or the number of specs, but I know the
        team in the oops is ~launchpad. I think this oops is ironic since
        the launchpad team abandoned blueprints.
    * lib/lp/registry/templates/distroseries-portlet-packaging.pt
      * This is still a common cause of oopses. Until the queries can be made
        faster, the cache expiration age should be increased to 3 hours.
    * lib/lp/registry/templates/milestone-index.pt
      * Use a menu without the subscription link when working with inline
        links to avoid repetitive db look ups.
      * Extracted the bugtask table to a macro so that the cache time can
        be different for active milestones. We are getting timeouts on lucid
        milestone pages are are inactive--they cannot change. 1 hour
        expiration age is too long for release managers that are working with
        active milestones. This invasive refactoring permits active milestones
        to cache for 10 minutes and inactive one to cache for 3 hours. This
        helps distro, project and project group milestones.
    * lib/lp/registry/templates/milestone-macros.pt
      * Extracted the milestone bugtask table and wrapped it in a macro for
        reuse.
    * lib/lp/registry/templates/productseries-milestone-table-row.pt
      * Use a fast menu when creating milestone links. This helps the project
        and distro series pages as well as the +series page.
    * lib/lp/soyuz/templates/distroseries-portlet-architectures.pt
      * Architectures do not change after they are set, so cache the portlet
        longer. This may help the distroseries page.

To post a comment you must log in.
Jelmer Vernooij (jelmer) wrote :

Thanks!

My tal knowledge is still pretty basic so it would be great if somebody else with more tal knowledge could also have a look; I understand what's happening but I'm probably not aware of all of the caveats.

review: Approve (code*)
Michael Nelson (michael.nelson) wrote :

I can look at this tomorrow, but have to run right now... so assuming you're keen to land this now, can you please request a review from someone else? Thanks.

review: Abstain (code)
Gary Poster (gary) wrote :

Thank you, Curtis. This sounds like a big improvement, and looks very cleanly done.

Notes:

- The testing of the cache changes--looking for comments that duplicate your cache settings--is not ideal. Could you create a bug for foundations giving an example of the kinds of tests you were trying to write, requesting a better testing pattern? Vaguely and naively, I would think we ought to have some test cache available that lets you ask questions about what is cached and for how long. The Foundations deliverable for the bug perhaps should be a refactoring of one or more of your tests, to show that our changes address the problem.

- Similarly, the fact that you had to create a macro simply to conditionally change the wrapping cache settings is broken. I'm fine with this as a temporary solution, but I'd like Foundations to provide a nicer spelling, or at least be challenged to do so. That said, nothing comes to mind initially. :-/ But anyway, a bug is probably appropriate. We can always promote a technique (see next bullet point) rather than changing the syntax, if that's what we decide is the better solution.

- I'm pretty confident it would be possible to put the macro in the template itself, so that you didn't have to make a separate file for it. That's the way I would have tried to do it, since this macro is only used locally. You could have used define-macro within the first block, and then use-macro in the second block. I forget how to address the local macros: it might be template/macros/NAME_OF_LOCAL_MACRO. I suspect you just want to get this in before PQM closes this evening (and maybe you'd want to argue the style), so I'm OK with you not pursuing this. Anyway, here's my untested example:

        <tal:has_bugtasks condition="bugtasks">
          <tal:active content="cache:private, 10 minute"
            condition="view/milestone/active">
            <!-- milestone_bugtasks cache:private 10 minute -->
            <tal:milestone-bugtasks
              metal:define-macro="milestone_bugtasks">
            IMPLEMENTATION GOO GOES HERE
            </tal:milestone-bugtasks>
          </tal:active>
          <tal:inactive content="cache:private, 3 hour"
            condition="not: view/milestone/active">
            <!-- milestone_bugtasks cache:private 3 hour -->
            <tal:milestone-bugtasks
              metal:use-macro="template/macros/milestone_bugtasks" />
          </tal:inactive>
        </tal:has_bugtasks>

review: Approve
Curtis Hovey (sinzui) wrote :

On Thu, 2010-05-27 at 16:00 +0000, Gary Poster wrote:
> Review: Approve
> Thank you, Curtis. This sounds like a big improvement, and looks very cleanly done.
>
> Notes:
>
> - The testing of the cache changes--looking for comments that
> duplicate your cache settings--is not ideal.

I reported [Testing tal cache states could be easier]
https://bugs.edge.launchpad.net/launchpad-foundations/+bug/586466

> - Similarly, the fact that you had to create a macro simply to
> conditionally change the wrapping cache settings is broken.

I reported [tal cache: directive could support an age variable]
https://bugs.edge.launchpad.net/launchpad-foundations/+bug/586461

> - I'm pretty confident it would be possible to put the macro in the
> template itself, so that you didn't have to make a separate file for
> it. That's the way I would have tried to do it, since this macro is
> only used locally. You could have used define-macro within the first
> block, and then use-macro in the second block. I forget how to
> address the local macros: it might be
> template/macros/NAME_OF_LOCAL_MACRO. I suspect you just want to get
> this in before PQM closes this evening (and maybe you'd want to argue
> the style), so I'm OK with you not pursuing this. Anyway, here's my
> untested example:
>
>
> <tal:has_bugtasks condition="bugtasks">
> <tal:active content="cache:private, 10 minute"
> condition="view/milestone/active">
> <!-- milestone_bugtasks cache:private 10 minute -->
> <tal:milestone-bugtasks
> metal:define-macro="milestone_bugtasks">
> IMPLEMENTATION GOO GOES HERE
> </tal:milestone-bugtasks>
> </tal:active>
> <tal:inactive content="cache:private, 3 hour"
> condition="not: view/milestone/active">
> <!-- milestone_bugtasks cache:private 3 hour -->
> <tal:milestone-bugtasks
> metal:use-macro="template/macros/milestone_bugtasks" />
> </tal:inactive>
> </tal:has_bugtasks>

I tried something similar, but it was getting test errors in some
conditions. I'll keep the macro for now. If we can get the variable age
issue solved I could remove the macro.

--
__Curtis C. Hovey_________
http://launchpad.net/

Robert Collins (lifeless) wrote :

I suggest invalidating pages as backend content changes - this is what
yahoo do for their news site - and they have more volume than we do :)
I'm happy to chat about how anytime you like - or even arrange some
time with Mark Nottingham to detail what they do.

Curtis Hovey (sinzui) wrote :

We do not have an api to invalid all cached junks that involve an object. Having one would really simplify situations where users update bugs that are linked to a milestone. The automatic key generation needs rethinking.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/answers/templates/faqcollection-portlet-faqs.pt'
2--- lib/lp/answers/templates/faqcollection-portlet-faqs.pt 2010-05-19 14:20:49 +0000
3+++ lib/lp/answers/templates/faqcollection-portlet-faqs.pt 2010-05-27 20:02:31 +0000
4@@ -18,7 +18,7 @@
5 </form>
6
7 <ul tal:condition="faqs"
8- tal:content="cache:public, 1 hour">
9+ tal:content="cache:public, 3 hour">
10 <li tal:repeat="faq faqs">
11 <a class="sprite question"
12 tal:attributes="href faq/fmt:url"
13
14=== added file 'lib/lp/blueprints/browser/tests/test_hasspecifications.py'
15--- lib/lp/blueprints/browser/tests/test_hasspecifications.py 1970-01-01 00:00:00 +0000
16+++ lib/lp/blueprints/browser/tests/test_hasspecifications.py 2010-05-27 20:02:31 +0000
17@@ -0,0 +1,34 @@
18+# Copyright 2010 Canonical Ltd. This software is licensed under the
19+# GNU Affero General Public License version 3 (see the file LICENSE).
20+
21+__metaclass__ = type
22+
23+import unittest
24+
25+from lp.testing import login_person, TestCaseWithFactory
26+from lp.testing.views import create_initialized_view
27+from canonical.testing import DatabaseFunctionalLayer
28+
29+
30+class TestPersonSpecWorkloadView(TestCaseWithFactory):
31+
32+ layer = DatabaseFunctionalLayer
33+
34+ def setUp(self):
35+ super(TestPersonSpecWorkloadView, self).setUp()
36+ self.owner = self.factory.makePerson(name='blue')
37+ login_person(self.owner)
38+ self.team = self.factory.makeTeam(name='square', owner='blue')
39+ self.member = self.factory.makePerson(name='green')
40+ self.team.addMember(self.member, self.owner)
41+
42+ def test_view_attributes(self):
43+ view = create_initialized_view(
44+ self.team, name='+specworkload')
45+ label = 'Blueprint workload'
46+ self.assertEqual(label, view.label)
47+ self.assertEqual(20, view.members.batch.size)
48+
49+
50+def test_suite():
51+ return unittest.TestLoader().loadTestsFromName(__name__)
52
53=== modified file 'lib/lp/registry/browser/configure.zcml'
54--- lib/lp/registry/browser/configure.zcml 2010-05-18 22:36:20 +0000
55+++ lib/lp/registry/browser/configure.zcml 2010-05-27 20:02:31 +0000
56@@ -1258,6 +1258,11 @@
57 path_expression="string:+milestone/${name}"
58 rootsite="mainsite"
59 attribute_to_parent="target"/>
60+ <browser:page
61+ for="*"
62+ name="+milestone-macros"
63+ permission="zope.Public"
64+ template="../templates/milestone-macros.pt"/>
65 <browser:pages
66 for="lp.registry.interfaces.milestone.IMilestone"
67 class="lp.registry.browser.milestone.MilestoneView"
68
69=== modified file 'lib/lp/registry/browser/milestone.py'
70--- lib/lp/registry/browser/milestone.py 2010-05-14 19:06:48 +0000
71+++ lib/lp/registry/browser/milestone.py 2010-05-27 20:02:31 +0000
72@@ -130,9 +130,11 @@
73
74 class MilestoneOverviewMenu(ApplicationMenu, MilestoneLinkMixin):
75 """Overview menus for `IMilestone` objects."""
76+ # This menu must not contain 'subscribe' because the link state is too
77+ # costly to calculate when this menu is used with a list of milestones.
78 usedfor = IMilestone
79 facet = 'overview'
80- links = ('create_release', )
81+ links = ('edit', 'create_release')
82
83
84 class IMilestoneInline(Interface):
85
86=== modified file 'lib/lp/registry/browser/person.py'
87--- lib/lp/registry/browser/person.py 2010-05-27 07:02:09 +0000
88+++ lib/lp/registry/browser/person.py 2010-05-27 20:02:31 +0000
89@@ -1733,7 +1733,7 @@
90 assert self.context.isTeam, (
91 "PersonSpecWorkloadView.members can only be called on a team.")
92 members = self.context.allmembers
93- batch_nav = BatchNavigator(members, self.request)
94+ batch_nav = BatchNavigator(members, self.request, size=20)
95 return batch_nav
96
97
98
99=== modified file 'lib/lp/registry/browser/tests/milestone-views.txt'
100--- lib/lp/registry/browser/tests/milestone-views.txt 2010-05-17 13:07:31 +0000
101+++ lib/lp/registry/browser/tests/milestone-views.txt 2010-05-27 20:02:31 +0000
102@@ -301,6 +301,29 @@
103 >>> login_person(person)
104
105
106+Milestone caching
107+-----------------
108+
109+Active milestones cache bugtasks for 10 minutes.
110+
111+ >>> cached_milestone = factory.makeMilestone(
112+ ... 'cache-test', productseries=series)
113+ >>> cached_bugtask = factory.makeBugTask(target=cached_milestone.product)
114+ >>> cached_bugtask.milestone = cached_milestone
115+ >>> view = create_view(cached_milestone, '+index', principal=person)
116+ >>> content = view.render()
117+ >>> 'milestone_bugtasks cache:private 10 minute' in content
118+ True
119+
120+Inactive milestones cache bugtasks for 3 hours.
121+
122+ >>> cached_milestone.active = False
123+ >>> view = create_view(cached_milestone, '+index', principal=person)
124+ >>> content = view.render()
125+ >>> 'milestone_bugtasks cache:private 3 hour' in content
126+ True
127+
128+
129 ProjectGroup milestones
130 -----------------------
131
132
133=== modified file 'lib/lp/registry/templates/distroseries-portlet-packaging.pt'
134--- lib/lp/registry/templates/distroseries-portlet-packaging.pt 2010-05-17 17:29:08 +0000
135+++ lib/lp/registry/templates/distroseries-portlet-packaging.pt 2010-05-27 20:02:31 +0000
136@@ -4,7 +4,7 @@
137 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
138 id="series-packaging" class="portlet"
139 tal:define="overview_menu context/menu:overview"
140- tal:content="cache:public, 1 hour">
141+ tal:content="cache:public, 3 hour">
142 <h2>Upstream packaging</h2>
143
144 <p id="packaging-summary"
145
146=== modified file 'lib/lp/registry/templates/milestone-index.pt'
147--- lib/lp/registry/templates/milestone-index.pt 2010-05-17 17:29:08 +0000
148+++ lib/lp/registry/templates/milestone-index.pt 2010-05-27 20:02:31 +0000
149@@ -24,6 +24,7 @@
150 specs view/specifications;
151 bugtasks view/bugtasks;
152 release_menu view/release/menu:context|Nothing;
153+ milestone_menu view/milestone/menu:overview;
154 has_edit context/required:launchpad.Edit">
155
156 <div class="top-portlet">
157@@ -73,7 +74,7 @@
158 tal:attributes="title context/dateexpected/fmt:datetime"
159 tal:content="context/dateexpected/fmt:approximatedate" />
160 &nbsp;
161- <a tal:replace="structure view/milestone/menu:overview/create_release/fmt:icon-link" />
162+ <a tal:replace="structure milestone_menu/create_release/fmt:icon-link" />
163 </dd>
164 </dl>
165
166@@ -112,7 +113,7 @@
167 <tal:no condition="not: context/active">
168 No. Drivers cannot target bugs and blueprints to this milestone.
169 </tal:no>
170- &nbsp; <a tal:replace="structure view/milestone/menu:navigation/edit/fmt:icon" />
171+ &nbsp; <a tal:replace="structure milestone_menu/edit/fmt:icon" />
172 </dd>
173 </dl>
174
175@@ -264,63 +265,19 @@
176 </table>
177 </tal:has_specs>
178
179- <tal:has_bugtasks condition="bugtasks"
180- tal:content="cache:private, 1 hour">
181- <table class="listing sortable" id="milestone_bugtasks">
182- <thead>
183- <tr>
184- <th colspan="4">Bug report</th>
185- <th style="width: 14em"
186- tal:condition="view/is_project_milestone">
187- Project
188- </th>
189- <th style="width: 9em;">Importance</th>
190- <th style="width: 14em;">Assignee</th>
191- <th style="width: 10em;">Status</th>
192- </tr>
193- </thead>
194- <tbody>
195- <tr tal:repeat="bugtask bugtasks">
196- <td class="icon left">
197- <span class="sortkey" tal:content="bugtask/bug/id" />
198- <span tal:content="structure bugtask/image:icon" />
199- </td>
200- <td tal:content="string:#${bugtask/bug/id}" class="amount">12345</td>
201- <td>
202- <a tal:attributes="href bugtask/bug/fmt:url"
203- tal:content="bugtask/bug/title">
204- Bug Title Here
205- </a>
206- </td>
207- <td style="padding-right: 5px; text-align:right">
208- <img src="/@@/info" tal:replace="structure bugtask/image:badges" />
209- </td>
210- <td tal:condition="view/is_project_milestone">
211- <span class="sortkey" tal:content="bugtask/target/displayname" />
212- <a tal:attributes="href bugtask/milestone/fmt:url"
213- tal:content="bugtask/target/displayname" />
214- </td>
215- <td>
216- <span class="sortkey" tal:content="bugtask/importance/sortkey" />
217- <span tal:content="bugtask/importance/title"
218- tal:attributes="
219- class string:importance${bugtask/importance/name}">High</span>
220- </td>
221- <td>
222- <a tal:condition="bugtask/assignee"
223- tal:replace="structure bugtask/assignee/fmt:link" />&nbsp;
224- </td>
225- <td
226- tal:attributes="title bugtask/last_significant_change_date/fmt:displaydate">
227- <span class="sortkey" tal:content="bugtask/status/sortkey" />
228- <span
229- tal:content="bugtask/status/title"
230- tal:attributes="
231- class string:status${bugtask/status/name}">High</span>
232- </td>
233- </tr>
234- </tbody>
235- </table>
236+ <tal:has_bugtasks condition="bugtasks">
237+ <tal:active content="cache:private, 10 minute"
238+ condition="view/milestone/active">
239+ <!-- milestone_bugtasks cache:private 10 minute -->
240+ <tal:milestone-bugtasks
241+ metal:use-macro="context/@@+milestone-macros/milestone_bugtasks" />
242+ </tal:active>
243+ <tal:inactive content="cache:private, 3 hour"
244+ condition="not: view/milestone/active">
245+ <!-- milestone_bugtasks cache:private 3 hour -->
246+ <tal:milestone-bugtasks
247+ metal:use-macro="context/@@+milestone-macros/milestone_bugtasks" />
248+ </tal:inactive>
249 </tal:has_bugtasks>
250
251 <tal:neither_bugs_nor_specs condition="not: view/has_bugs_or_specs">
252
253=== added file 'lib/lp/registry/templates/milestone-macros.pt'
254--- lib/lp/registry/templates/milestone-macros.pt 1970-01-01 00:00:00 +0000
255+++ lib/lp/registry/templates/milestone-macros.pt 2010-05-27 20:02:31 +0000
256@@ -0,0 +1,65 @@
257+<tal:root
258+ xmlns:tal="http://xml.zope.org/namespaces/tal"
259+ xmlns:metal="http://xml.zope.org/namespaces/metal"
260+ omit-tag="">
261+
262+
263+
264+ <tal:milestone-bugtasks metal:define-macro="milestone_bugtasks">
265+ <table class="listing sortable" id="milestone_bugtasks">
266+ <thead>
267+ <tr>
268+ <th colspan="4">Bug report</th>
269+ <th style="width: 14em"
270+ tal:condition="view/is_project_milestone">
271+ Project
272+ </th>
273+ <th style="width: 9em;">Importance</th>
274+ <th style="width: 14em;">Assignee</th>
275+ <th style="width: 10em;">Status</th>
276+ </tr>
277+ </thead>
278+ <tbody>
279+ <tr tal:repeat="bugtask bugtasks">
280+ <td class="icon left">
281+ <span class="sortkey" tal:content="bugtask/bug/id" />
282+ <span tal:content="structure bugtask/image:icon" />
283+ </td>
284+ <td tal:content="string:#${bugtask/bug/id}" class="amount">12345</td>
285+ <td>
286+ <a tal:attributes="href bugtask/bug/fmt:url"
287+ tal:content="bugtask/bug/title">
288+ Bug Title Here
289+ </a>
290+ </td>
291+ <td style="padding-right: 5px; text-align:right">
292+ <img src="/@@/info" tal:replace="structure bugtask/image:badges" />
293+ </td>
294+ <td tal:condition="view/is_project_milestone">
295+ <span class="sortkey" tal:content="bugtask/target/displayname" />
296+ <a tal:attributes="href bugtask/milestone/fmt:url"
297+ tal:content="bugtask/target/displayname" />
298+ </td>
299+ <td>
300+ <span class="sortkey" tal:content="bugtask/importance/sortkey" />
301+ <span tal:content="bugtask/importance/title"
302+ tal:attributes="
303+ class string:importance${bugtask/importance/name}">High</span>
304+ </td>
305+ <td>
306+ <a tal:condition="bugtask/assignee"
307+ tal:replace="structure bugtask/assignee/fmt:link" />&nbsp;
308+ </td>
309+ <td
310+ tal:attributes="title bugtask/last_significant_change_date/fmt:displaydate">
311+ <span class="sortkey" tal:content="bugtask/status/sortkey" />
312+ <span
313+ tal:content="bugtask/status/title"
314+ tal:attributes="
315+ class string:status${bugtask/status/name}">High</span>
316+ </td>
317+ </tr>
318+ </tbody>
319+ </table>
320+ </tal:milestone-bugtasks>
321+</tal:root>
322
323=== modified file 'lib/lp/registry/templates/productseries-milestone-table-row.pt'
324--- lib/lp/registry/templates/productseries-milestone-table-row.pt 2010-05-17 20:09:03 +0000
325+++ lib/lp/registry/templates/productseries-milestone-table-row.pt 2010-05-27 20:02:31 +0000
326@@ -2,7 +2,7 @@
327 xmlns:tal="http://xml.zope.org/namespaces/tal"
328 xmlns:metal="http://xml.zope.org/namespaces/metal"
329 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
330- define="milestone_menu view/menu:navigation;
331+ define="milestone_menu view/milestone/menu:overview;
332 milestone view/milestone;
333 release view/release"
334 tal:content="cache:private, 1 hour">
335@@ -59,7 +59,7 @@
336 not yet released
337 </tal:cannot-edit>
338 <tal:can-edit
339- define="link view/milestone/menu:overview/create_release"
340+ define="link milestone_menu/create_release"
341 condition="link/enabled">
342 <a style="white-space: nowrap"
343 tal:attributes="href link/fmt:url;
344
345=== modified file 'lib/lp/soyuz/templates/distroseries-portlet-architectures.pt'
346--- lib/lp/soyuz/templates/distroseries-portlet-architectures.pt 2010-05-17 17:29:08 +0000
347+++ lib/lp/soyuz/templates/distroseries-portlet-architectures.pt 2010-05-27 20:02:31 +0000
348@@ -14,7 +14,7 @@
349
350 <tal:buildable condition="architectures">
351 <ul id="portlet-architectures-list"
352- tal:content="cache:public, 1 hour">
353+ tal:content="cache:public, 3 hour">
354 <tal:official repeat="architecture architectures">
355 <li tal:condition="architecture/official">
356 <a class="sprite architecture"