socket error on Windows with bzr:// and large projects

John Arbash Meinel john at arbash-meinel.com
Wed Feb 7 23:05:53 GMT 2007


We managed to do a conversion of one of the Mozilla trees, and J. Paul
Reed was experimenting with doing a 'bzr branch' over the bzr:// protocol.

This is the traceback he got:
Traceback (most recent call last):
  File "bzrlib\commands.pyc", line 650, in run_bzr_catch_errors
  File "bzrlib\commands.pyc", line 612, in run_bzr
  File "bzrlib\commands.pyc", line 304, in run_argv_aliases
  File "bzrlib\builtins.pyc", line 750, in run
  File "bzrlib\bzrdir.pyc", line 685, in sprout
  File "bzrlib\repository.pyc", line 276, in fetch
  File "bzrlib\decorators.pyc", line 51, in write_locked
  File "bzrlib\repository.pyc", line 2080, in fetch
  File "bzrlib\fetch.pyc", line 110, in __init__
  File "bzrlib\fetch.pyc", line 137, in __fetch
  File "bzrlib\fetch.pyc", line 169, in _fetch_weave_texts
  File "bzrlib\repository.pyc", line 459, in fileids_altered_by_revision_ids
  File "bzrlib\knit.pyc", line 883, in
iter_lines_added_or_present_in_versions
  File "bzrlib\knit.pyc", line 1568, in read_records_iter
  File "bzrlib\transport\smart.pyc", line 1155, in readv
  File "bzrlib\transport\smart.pyc", line 1507, in read_body_bytes
  File "bzrlib\transport\smart.pyc", line 1376, in read_bytes
  File "bzrlib\transport\smart.pyc", line 1432, in _read_bytes
  File "bzrlib\transport\smart.pyc", line 1719, in _read_bytes
error: (10055, 'No buffer space available')

And that line happens to be:
return self._socket.recv(count)


So my best guess is that we are trying to download all of
inventory.knit, which is approx 150MB at this point. And 'recv()' on
Windows is asking to buffer all of that in a receive buffer.

There are 2 ways to handle this. One is to just change the simple
self._socket.recv(count) to be a loop around the requested size, and
just have it request in smaller chunks (32KB, 64KB, whatever).

Another possibility would be to improve the caller a little bit, so that
it doesn't try to read_bytes() for very large values.

We probably need the explicit chunking anyway, but it would be nice to
have the smart transport not need to buffer too much before it can start
returning data.

Specifically it would be nice to have something slightly smaller than
"data = self.read_body_bytes()" for readv to use, so that as data is
coming back, it can yield data up the stack.

John
=:->



More information about the bazaar mailing list