Merge lp:~wallyworld/launchpad/branchscan-deleted-branch-602323 into lp:launchpad

Proposed by Ian Booth
Status: Superseded
Proposed branch: lp:~wallyworld/launchpad/branchscan-deleted-branch-602323
Merge into: lp:launchpad
Diff against target: 72 lines (+32/-5)
2 files modified
lib/lp/code/model/branchjob.py (+12/-5)
lib/lp/code/model/tests/test_branchjob.py (+20/-0)
To merge this branch: bzr merge lp:~wallyworld/launchpad/branchscan-deleted-branch-602323
Reviewer Review Type Date Requested Status
Steve Kowalik (community) code Approve
Review via email: mp+133175@code.launchpad.net

Commit message

Ensure branch scan job does not oops if a scanned branch is deleted.

Description of the change

== Implementation ==

Ensure branch scan job does not oops if a scanned branch is deleted. Simply catch the lost object exception and log a warning.

== Tests ==

Write a new TestBranchScanJob test.

== Lint ==

Checking for conflicts and issues in changed files.

Linting changed files:
  lib/lp/code/model/branchjob.py
  lib/lp/code/model/tests/test_branchjob.py

To post a comment you must log in.
Revision history for this message
Steve Kowalik (stevenk) :
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/code/model/branchjob.py'
2--- lib/lp/code/model/branchjob.py 2012-09-28 06:25:44 +0000
3+++ lib/lp/code/model/branchjob.py 2012-11-07 03:40:26 +0000
4@@ -44,6 +44,7 @@
5 SQLObjectNotFound,
6 StringCol,
7 )
8+from storm.exceptions import LostObjectError
9 from storm.expr import (
10 And,
11 SQL,
12@@ -239,6 +240,8 @@
13
14 def __init__(self, branch_job):
15 self.context = branch_job
16+ if branch_job.branch:
17+ self.branch_unique_name = branch_job.branch.unique_name
18
19 def __repr__(self):
20 branch = self.branch
21@@ -324,11 +327,15 @@
22 """See `IBranchScanJob`."""
23 from lp.services.scripts import log
24 with server(get_ro_server(), no_replace=True):
25- lock = try_advisory_lock(
26- LockType.BRANCH_SCAN, self.branch.id, Store.of(self.branch))
27- with lock:
28- bzrsync = BzrSync(self.branch, log)
29- bzrsync.syncBranchAndClose()
30+ try:
31+ with try_advisory_lock(
32+ LockType.BRANCH_SCAN, self.branch.id,
33+ Store.of(self.branch)):
34+ bzrsync = BzrSync(self.branch, log)
35+ bzrsync.syncBranchAndClose()
36+ except LostObjectError:
37+ log.warning('Skipping branch %s because it has been deleted.'
38+ % self.branch_unique_name)
39
40 @classmethod
41 @contextlib.contextmanager
42
43=== modified file 'lib/lp/code/model/tests/test_branchjob.py'
44--- lib/lp/code/model/tests/test_branchjob.py 2012-09-18 18:36:09 +0000
45+++ lib/lp/code/model/tests/test_branchjob.py 2012-11-07 03:40:26 +0000
46@@ -174,6 +174,26 @@
47
48 self.assertEqual(db_branch.revision_count, 5)
49
50+ def test_branch_deleted(self):
51+ """Ensure a job for a deleted branch completes with logged message."""
52+ self.useBzrBranches(direct_database=True)
53+
54+ db_branch, bzr_tree = self.create_branch_and_tree()
55+ # XXX: AaronBentley 2010-08-06 bug=614404: a bzr username is
56+ # required to generate the revision-id.
57+ with override_environ(BZR_EMAIL='me@example.com'):
58+ bzr_tree.commit('First commit', rev_id='rev1')
59+ LaunchpadZopelessLayer.commit()
60+
61+ expected_message = (
62+ 'Skipping branch %s because it has been deleted.'
63+ % db_branch.unique_name)
64+ job = BranchScanJob.create(db_branch)
65+ db_branch.destroySelf()
66+ with self.expectedLog(expected_message):
67+ with dbuser(config.branchscanner.dbuser):
68+ job.run()
69+
70 def test_run_with_private_linked_bug(self):
71 """Ensure the job scans a branch with a private bug in the revprops."""
72 self.useBzrBranches(direct_database=True)