Rev 4031: Fix critical issue in bzr.dev - pushing to an old bzr:// server fails because the stream being consumed before the fallback code occurs, which makes it fail to do the fetch. (Robert Collins, Andrew Bennetts, #332314) in http://people.ubuntu.com/~robertc/baz2.0/integration
Robert Collins
robertc at robertcollins.net
Sat Feb 21 00:06:03 GMT 2009
At http://people.ubuntu.com/~robertc/baz2.0/integration
------------------------------------------------------------
revno: 4031
revision-id: robertc at robertcollins.net-20090221000558-5v6ru51rj2g8kvza
parent: robertc at robertcollins.net-20090220221045-bmuh2t0wf09szn3z
committer: Robert Collins <robertc at robertcollins.net>
branch nick: integration
timestamp: Sat 2009-02-21 11:05:58 +1100
message:
Fix critical issue in bzr.dev - pushing to an old bzr:// server fails because the stream being consumed before the fallback code occurs, which makes it fail to do the fetch. (Robert Collins, Andrew Bennetts, #332314)
=== modified file 'bzrlib/remote.py'
--- a/bzrlib/remote.py 2009-02-20 10:48:51 +0000
+++ b/bzrlib/remote.py 2009-02-21 00:05:58 +0000
@@ -1357,13 +1357,30 @@
if self.target_repo._fallback_repositories:
return self._insert_real(stream, src_format)
client = repo._client
+ medium = client._medium
+ if medium._is_remote_before((1,13)):
+ # No possible way this can work.
+ return self._insert_real(stream, src_format)
path = repo.bzrdir._path_for_remote_call(client)
- byte_stream = self._stream_to_byte_stream(stream, src_format)
+ # XXX: Ugly but important for correctness, *will* be fixed during 1.13
+ # cycle. Pushing a stream that is interrupted results in a fallback to
+ # the _real_repositories sink *with a partial stream*. Thats bad
+ # because we insert less data than bzr expected. To avoid this we do a
+ # trial push to make sure the verb is accessible, and do not fallback
+ # when actually pushing the stream. A cleanup patch is going to look at
+ # rewinding/restarting the stream/partial buffering etc.
+ byte_stream = self._stream_to_byte_stream([], src_format)
try:
response = client.call_with_body_stream(
('Repository.insert_stream', path), byte_stream)
except errors.UnknownSmartMethod:
+ medium._remember_remote_is_before((1,13))
return self._insert_real(stream, src_format)
+ byte_stream = self._stream_to_byte_stream(stream, src_format)
+ response = client.call_with_body_stream(
+ ('Repository.insert_stream', path), byte_stream)
+ if response[0][0] not in ('ok', ):
+ raise errors.UnexpectedSmartServerResponse(response)
def _stream_to_byte_stream(self, stream, src_format):
bytes = []
=== modified file 'bzrlib/tests/blackbox/test_push.py'
--- a/bzrlib/tests/blackbox/test_push.py 2009-02-20 08:26:50 +0000
+++ b/bzrlib/tests/blackbox/test_push.py 2009-02-21 00:05:58 +0000
@@ -202,7 +202,7 @@
# being too low. If rpc_count increases, more network roundtrips have
# become necessary for this use case. Please do not adjust this number
# upwards without agreement from bzr's network support maintainers.
- self.assertEqual(60, rpc_count)
+ self.assertEqual(61, rpc_count)
def test_push_smart_stacked_streaming_acceptance(self):
self.setup_smart_server_with_call_log()
More information about the bazaar-commits
mailing list