Rev 3800: Test that a readv() failing after yielding data will still raise Retry in http://bzr.arbash-meinel.com/branches/bzr/1.9-dev/pack_retry_153786

John Arbash Meinel john at arbash-meinel.com
Fri Oct 24 21:26:48 BST 2008


At http://bzr.arbash-meinel.com/branches/bzr/1.9-dev/pack_retry_153786

------------------------------------------------------------
revno: 3800
revision-id: john at arbash-meinel.com-20081024202643-1n4w1g6mg2jgb9r0
parent: john at arbash-meinel.com-20081024201311-4kteabxxs3istdan
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: pack_retry_153786
timestamp: Fri 2008-10-24 15:26:43 -0500
message:
  Test that a readv() failing after yielding data will still raise Retry
-------------- next part --------------
=== modified file 'bzrlib/tests/test_knit.py'
--- a/bzrlib/tests/test_knit.py	2008-10-24 20:13:11 +0000
+++ b/bzrlib/tests/test_knit.py	2008-10-24 20:26:43 +0000
@@ -270,6 +270,22 @@
         return queue_call
 
 
+class MockReadvFailingTransport(MockTransport):
+    """Fail in the middle of a readv() result.
+
+    This Transport will successfully yield the first requested hunk, but raise
+    NoSuchFile for the rest.
+    """
+
+    def readv(self, relpath, offsets):
+        first = True
+        for result in MockTransport.readv(self, relpath, offsets):
+            if not first:
+                raise errors.NoSuchFile(relpath)
+            first = False
+            yield result
+
+
 class KnitRecordAccessTestsMixin(object):
     """Tests for getting and putting knit records."""
 
@@ -397,6 +413,26 @@
         self.assertIsInstance(e.exc_info[1], errors.NoSuchFile)
         self.assertEqual('different-packname', e.exc_info[1].path)
 
+    def test_failing_readv_raises_retry(self):
+        access, writer = self._get_access(packname='packname', index='foo')
+        memos = []
+        memos.extend(access.add_raw_records([('key', 10)], '1234567890'))
+        memos.extend(access.add_raw_records([('key', 5)], '12345'))
+        writer.end()
+        transport = self.get_transport()
+        failing_transport = MockReadvFailingTransport(
+                                [transport.get_bytes('packname')])
+        # The readv() will fail mid-way through
+        access = _DirectPackAccess({'foo':(failing_transport, 'packname')})
+        e = self.assertListRaises(errors.RetryWithNewPacks,
+                                  access.get_raw_records, memos)
+        # The file has gone missing, so we assume we need to reload
+        self.assertFalse(e.reload_occurred)
+        self.assertIsInstance(e.exc_info, tuple)
+        self.assertIs(e.exc_info[0], errors.NoSuchFile)
+        self.assertIsInstance(e.exc_info[1], errors.NoSuchFile)
+        self.assertEqual('packname', e.exc_info[1].path)
+
 
 class LowLevelKnitDataTests(TestCase):
 



More information about the bazaar-commits mailing list