8000 fallback: fix BufferFull with sloppy consume · didlie/msgpack-python@0532ea8 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0532ea8

Browse files
committed
fallback: fix BufferFull with sloppy consume
1 parent b334d44 commit 0532ea8

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

msgpack/fallback.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,11 @@ def __init__(self, file_like=None, read_size=0, use_list=True,
166166
self._fb_buf_o = 0
167167
self._fb_buf_i = 0
168168
self._fb_buf_n = 0
169+
# When Unpacker is used as an iterable, between the calls to next(),
170+
# the buffer is not "consumed" completely, for efficiency sake.
171+
# Instead, it is done sloppily. To make sure we raise BufferFull at
172+
# the correct moments, we have to keep track of how sloppy we were.
173+
self._fb_sloppiness = 0
169174
self._max_buffer_size = max_buffer_size or 2**31-1
170175
if read_size > self._max_buffer_size:
171176
raise ValueError("read_size must be smaller than max_buffer_size")
@@ -196,7 +201,8 @@ def feed(self, next_bytes):
196201
elif isinstance(next_bytes, bytearray):
197202
next_bytes = bytes(next_bytes)
198203
assert self._fb_feeding
199-
if self._fb_buf_n + len(next_bytes) > self._max_buffer_size:
204+
if (self._fb_buf_n + len(next_bytes) - self._fb_sloppiness
205+
> self._max_buffer_size):
200206
raise BufferFull
201207
self._fb_buf_n += len(next_bytes)
202208
self._fb_buffers.append(next_bytes)
@@ -208,6 +214,10 @@ def _fb_sloppy_consume(self):
208214
self._fb_buf_n -= len(self._fb_buffers[i])
209215
self._fb_buffers = self._fb_buffers[self._fb_buf_i:]
210216
self._fb_buf_i = 0
217+
if self._fb_buffers:
218+
self._fb_sloppiness = self._fb_buf_o
219+
else:
220+
self._fb_sloppiness = 0
211221

212222
def _fb_consume(self):
213223
""" Gets rid of the used parts of the buffer. """
@@ -222,6 +232,7 @@ def _fb_consume(self):
222232
else:
223233
self._fb_buf_n = 0
224234
self._fb_buf_o = 0
235+
self._fb_sloppiness = 0
225236

226237
def _fb_got_extradata(self):
227238
if self._fb_buf_i != len(self._fb_buffers):

0 commit comments

Comments
 (0)
0