Merge lp:~abentley/launchpad/better-find-missing-ready-error into lp:launchpad

Proposed by Aaron Bentley on 2012-08-02
Status: Merged
Approved by: Aaron Bentley on 2012-08-02
Approved revision: no longer in the source branch.
Merged at revision: 15735
Proposed branch: lp:~abentley/launchpad/better-find-missing-ready-error
Merge into: lp:launchpad
Diff against target: 96 lines (+41/-13)
2 files modified
lib/lp/services/job/celeryjob.py (+17/-6)
lib/lp/services/job/tests/test_celeryjob.py (+24/-7)
To merge this branch: bzr merge lp:~abentley/launchpad/better-find-missing-ready-error
Reviewer Review Type Date Requested Status
Abel Deuring (community) code 2012-08-02 Approve on 2012-08-02
Review via email: mp+117926@code.launchpad.net

Commit Message

More detailed failures in test_find_missing_ready

Description of the Change

= Summary =
Add more detail to test_find_missing_ready to help diagnose failures.

== Proposed fix ==
Instead of re-calling list_queues for extra info, use the exact same data as find_missing_ready used.

== Pre-implementation notes ==
Discussed with Deryck

== LOC Rationale ==
I have a LOC credit of 1888

== Implementation details ==
Convert find_missing_ready to FindMissingReady, so that we examine its instance variables.

== Tests ==
bin/test -t test_find_missing_ready

== Demo and Q/A ==
None

= Launchpad lint =

Checking for conflicts and issues in changed files.

Linting changed files:
  lib/lp/services/job/celeryjob.py
  lib/lp/services/job/tests/test_celeryjob.py

To post a comment you must log in.
Abel Deuring (adeuring) wrote :

looks good, just a minor nitpick: I think that

+ from lp.services.job.celeryjob import FindMissingReady

could be moved to the start f the method definition.

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/services/job/celeryjob.py'
2--- lib/lp/services/job/celeryjob.py 2012-07-26 14:31:45 +0000
3+++ lib/lp/services/job/celeryjob.py 2012-08-02 15:48:23 +0000
4@@ -71,14 +71,25 @@
5 ignore_result = True
6
7
8+class FindMissingReady:
9+
10+ def __init__(self, job_source):
11+ from lp.services.job.celeryjob import CeleryRunJob
12+ from lazr.jobrunner.celerytask import list_queued
13+ self.job_source = job_source
14+ self.queue_contents = list_queued(CeleryRunJob.app,
15+ [job_source.task_queue])
16+ self.queued_job_ids = set(task[1][0][0] for task in
17+ self.queue_contents)
18+
19+ def find_missing_ready(self):
20+ return [job for job in self.job_source.iterReady()
21+ if job.job_id not in self.queued_job_ids]
22+
23+
24 def find_missing_ready(job_source):
25 """Find ready jobs that are not queued."""
26- from lp.services.job.celeryjob import CeleryRunJob
27- from lazr.jobrunner.celerytask import list_queued
28- queued_job_ids = set(task[1][0][0] for task in list_queued(
29- CeleryRunJob.app, [job_source.task_queue]))
30- return [job for job in job_source.iterReady() if job.job_id not in
31- queued_job_ids]
32+ return FindMissingReady(job_source).find_missing_ready()
33
34
35 class RunMissingReady(Task):
36
37=== modified file 'lib/lp/services/job/tests/test_celeryjob.py'
38--- lib/lp/services/job/tests/test_celeryjob.py 2012-08-01 15:06:50 +0000
39+++ lib/lp/services/job/tests/test_celeryjob.py 2012-08-02 15:48:23 +0000
40@@ -4,7 +4,11 @@
41 from cStringIO import StringIO
42 import sys
43 from time import sleep
44+
45+from testtools.content import Content
46+from testtools.content_type import UTF8_TEXT
47 from lazr.jobrunner.bin.clear_queues import clear_queues
48+
49 from lp.code.model.branchjob import BranchScanJob
50 from lp.scripts.helpers import TransactionFreeOperation
51 from lp.services.features.testing import FeatureFixture
52@@ -53,24 +57,37 @@
53 self.fail('Queue size did not reach %d; still at %d' %
54 (expected_len, actual_len))
55
56+ def addTextDetail(self, name, text):
57+ content = Content(UTF8_TEXT, lambda: text)
58+ self.addDetail(name, content)
59+
60 def test_find_missing_ready(self):
61 """A job which is ready but not queued is "missing"."""
62+ from lp.services.job.celeryjob import FindMissingReady
63 job = self.createMissingJob()
64+ self.addTextDetail(
65+ 'job_info', 'job.id: %d, job.job_id: %d' % (job.id, job.job_id))
66 self.assertQueueSize(self.CeleryRunJob.app,
67 [BranchScanJob.task_queue], 0)
68 self.assertEqual([job], self.find_missing_ready(BranchScanJob))
69 job.runViaCelery()
70 self.assertQueueSize(self.CeleryRunJob.app,
71 [BranchScanJob.task_queue], 1)
72- #self.assertEqual([], self.find_missing_ready(BranchScanJob))
73 # XXX AaronBentley: 2012-08-01 bug=1031018: Extra diagnostic info to
74 # help diagnose this hard-to-reproduce failure.
75- if self.find_missing_ready(BranchScanJob) != []:
76- from lazr.jobrunner.celerytask import list_queued
77- contents = list_queued(
78- self.CeleryRunJob.app, [BranchScanJob.task_queue])
79- self.fail('queue: %r, job.id: %d, job.job_id: %d' %
80- (contents, job.id, job.job_id))
81+ find_missing_ready_obj = FindMissingReady(BranchScanJob)
82+ missing_ready = find_missing_ready_obj.find_missing_ready()
83+ try:
84+ self.assertEqual([], missing_ready)
85+ except:
86+ self.addTextDetail('queued_job_ids',
87+ '%r' % (find_missing_ready_obj.queued_job_ids))
88+ self.addTextDetail('queue_contents',
89+ repr(find_missing_ready_obj.queue_contents))
90+ self.addTextDetail(
91+ 'missing_ready_job_id', repr([missing.job_id for missing in
92+ missing_ready]))
93+ raise
94 drain_celery_queues()
95 self.assertQueueSize(self.CeleryRunJob.app,
96 [BranchScanJob.task_queue], 0)