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