[MERGE][1.1][#115781] Limit smart protocol reads to 64k to avoid 'no buffer space available' errors on Windows.
Andrew Bennetts
andrew at canonical.com
Tue Jan 8 05:52:07 GMT 2008
Josh Jensen reported that the previous fix to #115781 didn't totally eradicate
the problem for him. It turns out that reading large amounts from a socket also
has the same problem as writing large amounts, i.e. on Windows it can cause
error 10053 or 10055.
This change limits reads by the smart protocol implementation to 64k, which
seems to be a safe maximum. Hopefully it shouldn't make a significant impact on
performance.
-Andrew.
-------------- next part --------------
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: andrew.bennetts at canonical.com-20080108053931-\
# ezafty4oqtnl8j4z
# target_branch: http://bazaar-vcs.org/bzr/bzr.dev
# testament_sha1: d2f071b2b8ee30dafd528c1adf1e47ccd56b754f
# timestamp: 2008-01-08 16:44:27 +1100
# source_branch: http://people.ubuntu.com/~andrew/bzr/windows-recv-\
# limit
# base_revision_id: pqm at pqm.ubuntu.com-20080107174938-hvwo399dzshh3cod
#
# Begin patch
=== modified file 'bzrlib/smart/protocol.py'
--- bzrlib/smart/protocol.py 2007-11-09 20:49:54 +0000
+++ bzrlib/smart/protocol.py 2008-01-08 05:39:31 +0000
@@ -543,8 +543,11 @@
return self._body_buffer.read(count)
_body_decoder = LengthPrefixedBodyDecoder()
+ # Read no more than 64k at a time so that we don't risk error 10055 (no
+ # buffer space available) on Windows.
+ max_read = 64 * 1024
while not _body_decoder.finished_reading:
- bytes_wanted = _body_decoder.next_read_size()
+ bytes_wanted = min(_body_decoder.next_read_size(), max_read)
bytes = self._request.read_bytes(bytes_wanted)
_body_decoder.accept_bytes(bytes)
self._request.finished_reading()
@@ -627,9 +630,12 @@
def read_streamed_body(self):
"""Read bytes from the body, decoding into a byte stream.
"""
+ # Read no more than 64k at a time so that we don't risk error 10055 (no
+ # buffer space available) on Windows.
+ max_read = 64 * 1024
_body_decoder = ChunkedBodyDecoder()
while not _body_decoder.finished_reading:
- bytes_wanted = _body_decoder.next_read_size()
+ bytes_wanted = min(_body_decoder.next_read_size(), max_read)
bytes = self._request.read_bytes(bytes_wanted)
_body_decoder.accept_bytes(bytes)
for body_bytes in iter(_body_decoder.read_next_chunk, None):
# Begin bundle
IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWeuCUIMAAkTfgCRQWf///3//
//C////wUAVb02BpTE0LWAANESnqPU2m0pmU9TR6T2qZPJPUaNB6j1HpND1DQ00bSPSDjI0yYmgy
ZMJpkDIaA0Bpk0MAJoDCUU2mqp7NKemjSn5FPUPU9EeKHpGgAZAYGkaaD0OMjTJiaDJkwmmQMhoD
QGmTQwAmgMJJE0AAiaZoEaU81MTyjQmmNT0nqeQT0hiaPUqEiBhxLbmLq1XZtR8rXiJcRO5XskjC
pBd3NRJsCOhQkm0xWvc7XAtbsxAKMD4/bZHMZDA762GYP68Asu63o6zwk0MWqqgZJskxc5lKkarn
D/S9B8jQQ4knLEh1J0jn5eLJEV5sm3HVDgMJDUPGBTpJTxkqRmRhjPESTQ/vsmB37Agb67sTp8KZ
dBpeII34EkQ5wOOQ4S2whAMrDgugeogePLpPQIOxb1rKcMxahZgLAuql++/OeaVjM4ij6BH4PEGA
eMqg8eE+uFt7veHE2ORBfc7jvXnAIwTlBw9gHI9Q0QehwJyRwEydgenOcPEu3itE8ZOPcBRVrpjG
YrBwwDVOvUfoyeW+HREWH7zm8dSSEhZSHXYtkk2Z8zyYjlaNYsYBXaU4lfTuGRnLUOLnFn3isKQH
aC8dKUk752kDgHnBaBZ1BYagUWgoHsnGnYSqF8gRtC/jR3LpJnA0f8DgIqS5+IcPjXrjKgMkshfw
hAZ1pefnbeUF5nySU11J6toyFVtuQxOQX2FxmUpUTGmu19JBFcAqLYnaCQLTWN1U0rGiYFnEQpwQ
Nydykb4wGYsA7UpfhyTGZSt4EiGvqcFxaUEA8PbJ08V71SVGhUA8KylEPIaOocwu1jfwh46yM133
FxBzMTcmc5fS+NxKzkoBDpAzac1IZkbaIGXqJO5+q1QxYnhbpNvWlFmqbSvLQ4NBUsE9cc0T0MFb
Cm0tft+xXEobIdO4fvgQVLRZ729GrCTDIs2kAalSvhYyq1DDr4vxfguFQrngt44w4HigmMhnAQEz
Y0s9Q6IrUEd5X3HedZoMhmVoiEhACg5kfwUCKee8tHqP+/luWLrTpxHtPgYktPY0qpHFbxwbuDA7
juO7ScWGxtPGd8nGOQ5S9e5BDewXG0fEnAH8K0TmL5aYRQ+JyCP+EVE+eJ7YwyH7rGJWvjGTKJjT
SWsYFCeDGQpF1ykhMsgw+84itTiUFEGw2GHTc45l0EQ5qeQ3NnuPK4lsnPAzdOA3a1cEWLaMF0hY
PkMXk5IqcvPjEWw3JhVVDVLFXvoNWkNZApGbhSKQQxAOkBs2Oytde7rPAaBzEKXVmk/Wm2xQoA3x
2pZCwNXq8V+IBcSTIOQkFm6YYAScF0CoPAmTjW+CBmz5UHMpRaZUZDNXnPghr2Fft254XtwQyIFh
LxL0RSrzAcr9qY1GI+3x2YI2YCOhYThqQcyrGI9bc55jbjK8tQl+QGH0sgvwaTdarF7uN5AbXU9R
9JzRvUBOGR/LBGboQA+ThEMEj2EMIhDcYEvMkc5QTiHjDKVhaQ+jwm8tQZS4PnWtosNhY8QMUb0y
DqoESI6AGJkYKsNvqiVxTllVSmjvIzVq1BGTBRw9Ye+NSyjPZvnrXw7icCgRq1sZhzkXNsgjSyu3
mNgytMlf6SGJk/KkUyRE4ZX2hmGUahQ4cwyj409wzJDFxljYrnMQUv1qphQWpxQGEgeyoNxSKoKP
FbHj7zbJVAj7QxDFjxtJYpRhTzNQPRMbwIk5EyxtOwwiRwZJrkh4Vw5QGkDRD67A0cSlGCuWTl7P
JjrILz2oOd7A5I2cZIfX9JQzLu1+vDnsDvrFo4LU5yDTgPnMxtA8KCcCoKp35CgP/F3JFOFCQ64J
Qgw=
More information about the bazaar
mailing list