Rev 3833: Fix TooManyConcurrentRequests from abort_write_group in fetch.py in file:///home/pqm/archives/thelove/bzr/%2Btrunk/
Canonical.com Patch Queue Manager
pqm at pqm.ubuntu.com
Wed Nov 12 06:21:48 GMT 2008
At file:///home/pqm/archives/thelove/bzr/%2Btrunk/
------------------------------------------------------------
revno: 3833
revision-id: pqm at pqm.ubuntu.com-20081112062144-ywv4r28hbhmhpp3c
parent: pqm at pqm.ubuntu.com-20081112054902-n6p0qrvl4cb26ij8
parent: andrew.bennetts at canonical.com-20081112052319-q1nu7d0zp6cqkyva
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Wed 2008-11-12 06:21:44 +0000
message:
Fix TooManyConcurrentRequests from abort_write_group in fetch.py
(Andrew Bennetts)
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
bzrlib/fetch.py fetch.py-20050818234941-26fea6105696365d
bzrlib/remote.py remote.py-20060720103555-yeeg2x51vn0rbtdp-1
bzrlib/repofmt/pack_repo.py pack_repo.py-20070813041115-gjv5ma7ktfqwsjgn-1
bzrlib/repository.py rev_storage.py-20051111201905-119e9401e46257e3
bzrlib/tests/per_repository/test_write_group.py test_write_group.py-20070716105516-89n34xtogq5frn0m-1
bzrlib/tests/test_pack_repository.py test_pack_repository-20080801043947-eaw0e6h2gu75kwmy-1
------------------------------------------------------------
revno: 3825.4.5
revision-id: andrew.bennetts at canonical.com-20081112052319-q1nu7d0zp6cqkyva
parent: andrew.bennetts at canonical.com-20081112040955-aznnbjkl6u9vu3vo
parent: pqm at pqm.ubuntu.com-20081112012514-6y8u99lf11pk0rdm
committer: Andrew Bennetts <andrew.bennetts at canonical.com>
branch nick: abort_write_group-error
timestamp: Wed 2008-11-12 15:23:19 +1000
message:
Merge bzr.dev.
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
bzrlib/branchbuilder.py branchbuilder.py-20070427022007-zlxpqz2lannhk6y8-1
bzrlib/builtins.py builtins.py-20050830033751-fc01482b9ca23183
bzrlib/commit.py commit.py-20050511101309-79ec1a0168e0e825
bzrlib/help_topics/en/hooks.txt hooks.txt-20070830033044-xxu2rced13f72dka-1
bzrlib/msgeditor.py msgeditor.py-20050901111708-ef6d8de98f5d8f2f
bzrlib/shelf_ui.py shelver.py-20081005210102-33worgzwrtdw0yrm-1
bzrlib/tests/__init__.py selftest.py-20050531073622-8d0e3c8845c97a64
bzrlib/tests/blackbox/test_commit.py test_commit.py-20060212094538-ae88fc861d969db0
bzrlib/tests/test_msgeditor.py test_msgeditor.py-20051202041359-920315ec6011ee51
bzrlib/tests/test_sftp_transport.py testsftp.py-20051027032739-247570325fec7e7e
bzrlib/trace.py trace.py-20050309040759-c8ed824bdcd4748a
bzrlib/transport/http/_urllib2_wrappers.py _urllib2_wrappers.py-20060913231729-ha9ugi48ktx481ao-1
bzrlib/transport/sftp.py sftp.py-20051019050329-ab48ce71b7e32dfe
------------------------------------------------------------
revno: 3825.4.4
revision-id: andrew.bennetts at canonical.com-20081112040955-aznnbjkl6u9vu3vo
parent: andrew.bennetts at canonical.com-20081112035651-8benjq1etha7trvu
committer: Andrew Bennetts <andrew.bennetts at canonical.com>
branch nick: abort_write_group-error
timestamp: Wed 2008-11-12 14:09:55 +1000
message:
Document bug fix and API change in NEWS.
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
------------------------------------------------------------
revno: 3825.4.3
revision-id: andrew.bennetts at canonical.com-20081112035651-8benjq1etha7trvu
parent: andrew.bennetts at canonical.com-20081112025312-q9yud1tn0e3h1clj
committer: Andrew Bennetts <andrew.bennetts at canonical.com>
branch nick: abort_write_group-error
timestamp: Wed 2008-11-12 13:56:51 +1000
message:
Conditionally replace LocalURLServer in the test rather than changing the default_transport behaviour of per_repository tests.
modified:
bzrlib/tests/per_repository/__init__.py __init__.py-20060131092037-9564957a7d4a841b
bzrlib/tests/per_repository/test_write_group.py test_write_group.py-20070716105516-89n34xtogq5frn0m-1
------------------------------------------------------------
revno: 3825.4.2
revision-id: andrew.bennetts at canonical.com-20081112025312-q9yud1tn0e3h1clj
parent: andrew.bennetts at canonical.com-20081112022903-jrpp1r2g6h12zlkf
committer: Andrew Bennetts <andrew.bennetts at canonical.com>
branch nick: abort_write_group-error
timestamp: Wed 2008-11-12 12:53:12 +1000
message:
Run the abort_write_group tests against a memory transport to avoid platform-specific limits on changing files that may be in use.
modified:
bzrlib/tests/per_repository/__init__.py __init__.py-20060131092037-9564957a7d4a841b
bzrlib/tests/per_repository/test_write_group.py test_write_group.py-20070716105516-89n34xtogq5frn0m-1
bzrlib/tests/test_pack_repository.py test_pack_repository-20080801043947-eaw0e6h2gu75kwmy-1
------------------------------------------------------------
revno: 3825.4.1
revision-id: andrew.bennetts at canonical.com-20081112022903-jrpp1r2g6h12zlkf
parent: pqm at pqm.ubuntu.com-20081107225426-gezbao014attrca8
committer: Andrew Bennetts <andrew.bennetts at canonical.com>
branch nick: abort_write_group-error
timestamp: Wed 2008-11-12 12:29:03 +1000
message:
Add suppress_errors to abort_write_group.
modified:
bzrlib/fetch.py fetch.py-20050818234941-26fea6105696365d
bzrlib/remote.py remote.py-20060720103555-yeeg2x51vn0rbtdp-1
bzrlib/repofmt/pack_repo.py pack_repo.py-20070813041115-gjv5ma7ktfqwsjgn-1
bzrlib/repository.py rev_storage.py-20051111201905-119e9401e46257e3
bzrlib/tests/per_repository/test_write_group.py test_write_group.py-20070716105516-89n34xtogq5frn0m-1
bzrlib/tests/test_pack_repository.py test_pack_repository-20080801043947-eaw0e6h2gu75kwmy-1
=== modified file 'NEWS'
--- a/NEWS 2008-11-11 04:52:05 +0000
+++ b/NEWS 2008-11-12 05:23:19 +0000
@@ -27,10 +27,20 @@
BUG FIXES:
+ * TooManyConcurrentRequests no longer occur when a fetch fails and
+ tries to abort a write group. This allows the root cause (e.g. a
+ network interruption) to be reported. (Andrew Bennetts, #297014)
+
DOCUMENTATION:
API CHANGES:
+ * ``Repository.abort_write_group`` now accepts an optional
+ ``suppress_errors`` flag. Repository implementations that override
+ ``abort_write_group`` will need to be updated to accept the new
+ argument. Subclasses that only override ``_abort_write_group``
+ don't need to change.
+
* Transport implementations must provide copy_tree_to_transport. A default
implementation is provided for Transport subclasses.
=== modified file 'bzrlib/fetch.py'
--- a/bzrlib/fetch.py 2008-08-29 02:05:22 +0000
+++ b/bzrlib/fetch.py 2008-11-12 02:29:03 +0000
@@ -109,7 +109,7 @@
try:
self.__fetch()
except:
- self.to_repository.abort_write_group()
+ self.to_repository.abort_write_group(suppress_errors=True)
raise
else:
self.to_repository.commit_write_group()
=== modified file 'bzrlib/remote.py'
--- a/bzrlib/remote.py 2008-10-31 01:57:16 +0000
+++ b/bzrlib/remote.py 2008-11-12 02:29:03 +0000
@@ -340,7 +340,7 @@
__repr__ = __str__
- def abort_write_group(self):
+ def abort_write_group(self, suppress_errors=False):
"""Complete a write group on the decorated repository.
Smart methods peform operations in a single step so this api
@@ -349,7 +349,8 @@
facility.
"""
self._ensure_real()
- return self._real_repository.abort_write_group()
+ return self._real_repository.abort_write_group(
+ suppress_errors=suppress_errors)
def commit_write_group(self):
"""Complete a write group on the decorated repository.
=== modified file 'bzrlib/repofmt/pack_repo.py'
--- a/bzrlib/repofmt/pack_repo.py 2008-11-03 04:12:11 +0000
+++ b/bzrlib/repofmt/pack_repo.py 2008-11-12 02:29:03 +0000
@@ -1732,9 +1732,11 @@
# FIXME: just drop the transient index.
# forget what names there are
if self._new_pack is not None:
- self._new_pack.abort()
- self._remove_pack_indices(self._new_pack)
- self._new_pack = None
+ try:
+ self._new_pack.abort()
+ finally:
+ self._remove_pack_indices(self._new_pack)
+ self._new_pack = None
self.repo._text_knit = None
def _commit_write_group(self):
=== modified file 'bzrlib/repository.py'
--- a/bzrlib/repository.py 2008-11-03 04:12:11 +0000
+++ b/bzrlib/repository.py 2008-11-12 02:29:03 +0000
@@ -55,7 +55,8 @@
one_two,
one_six,
)
-from bzrlib.trace import mutter, mutter_callsite, warning
+from bzrlib.trace import (
+ log_exception_quietly, note, mutter, mutter_callsite, warning)
# Old formats display a warning, but only once
@@ -513,7 +514,7 @@
r'.* revision="(?P<revision_id>[^"]+)"'
)
- def abort_write_group(self):
+ def abort_write_group(self, suppress_errors=False):
"""Commit the contents accrued within the current write group.
:seealso: start_write_group.
@@ -521,7 +522,15 @@
if self._write_group is not self.get_transaction():
# has an unlock or relock occured ?
raise errors.BzrError('mismatched lock context and write group.')
- self._abort_write_group()
+ try:
+ self._abort_write_group()
+ except Exception, exc:
+ self._write_group = None
+ if not suppress_errors:
+ raise
+ mutter('abort_write_group failed')
+ log_exception_quietly()
+ note('bzr: ERROR (ignored): %s', exc)
self._write_group = None
def _abort_write_group(self):
=== modified file 'bzrlib/tests/per_repository/test_write_group.py'
--- a/bzrlib/tests/per_repository/test_write_group.py 2008-09-04 20:32:04 +0000
+++ b/bzrlib/tests/per_repository/test_write_group.py 2008-11-12 03:56:51 +0000
@@ -17,6 +17,8 @@
"""Tests for repository write groups."""
from bzrlib import errors
+from bzrlib.transport import local, memory
+from bzrlib.tests import TestNotApplicable
from bzrlib.tests.per_repository import TestCaseWithRepository
@@ -96,3 +98,20 @@
repo.start_write_group()
self.assertEqual(None, repo.abort_write_group())
repo.unlock()
+
+ def test_abort_write_group_does_not_raise_when_suppressed(self):
+ if self.transport_server is local.LocalURLServer:
+ self.transport_server = None
+ self.vfs_transport_factory = memory.MemoryServer
+ repo = self.make_repository('repo')
+ token = repo.lock_write()
+ self.addCleanup(repo.unlock)
+ repo.start_write_group()
+ # Damage the repository on the filesystem
+ self.get_transport('').rename('repo', 'foo')
+ # abort_write_group will not raise an error, because either an
+ # exception was not generated, or the exception was caught and
+ # suppressed. See also test_pack_repository's test of the same name.
+ self.assertEqual(None, repo.abort_write_group(suppress_errors=True))
+ if token is not None:
+ repo.leave_lock_in_place()
=== modified file 'bzrlib/tests/test_pack_repository.py'
--- a/bzrlib/tests/test_pack_repository.py 2008-11-03 04:12:11 +0000
+++ b/bzrlib/tests/test_pack_repository.py 2008-11-12 02:53:12 +0000
@@ -49,8 +49,10 @@
)
from bzrlib.transport import (
fakenfs,
+ memory,
get_transport,
)
+from bzrlib.tests.per_repository import TestCaseWithRepository
class TestPackRepository(TestCaseWithTransport):
@@ -507,6 +509,40 @@
self.assertEqual(self.format_supports_external_lookups,
repo._format.supports_external_lookups)
+ def test_abort_write_group_does_not_raise_when_suppressed(self):
+ """Similar to per_repository.test_write_group's test of the same name.
+
+ Also requires that the exception is logged.
+ """
+ self.vfs_transport_factory = memory.MemoryServer
+ repo = self.make_repository('repo')
+ token = repo.lock_write()
+ self.addCleanup(repo.unlock)
+ repo.start_write_group()
+ # Damage the repository on the filesystem
+ self.get_transport('').rename('repo', 'foo')
+ # abort_write_group will not raise an error
+ self.assertEqual(None, repo.abort_write_group(suppress_errors=True))
+ # But it does log an error
+ log_file = self._get_log(keep_log_file=True)
+ self.assertContainsRe(log_file, 'abort_write_group failed')
+ self.assertContainsRe(log_file, r'INFO bzr: ERROR \(ignored\):')
+ if token is not None:
+ repo.leave_lock_in_place()
+
+ def test_abort_write_group_does_raise_when_not_suppressed(self):
+ self.vfs_transport_factory = memory.MemoryServer
+ repo = self.make_repository('repo')
+ token = repo.lock_write()
+ self.addCleanup(repo.unlock)
+ repo.start_write_group()
+ # Damage the repository on the filesystem
+ self.get_transport('').rename('repo', 'foo')
+ # abort_write_group will not raise an error
+ self.assertRaises(Exception, repo.abort_write_group)
+ if token is not None:
+ repo.leave_lock_in_place()
+
class TestPackRepositoryStacking(TestCaseWithTransport):
More information about the bazaar-commits
mailing list