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