Skip to content

Commit 3158dbb

Browse files
committed
Teach redirect_messages() to stop at certain received buffer size
1 parent b5ec5d7 commit 3158dbb

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

buffer.pxd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ cdef class ReadBuffer:
124124
cdef inline const char* try_consume_message(self, ssize_t* len)
125125
cdef bytes consume_message(self)
126126
cdef discard_message(self)
127-
cdef redirect_messages(self, WriteBuffer buf, char mtype)
127+
cdef redirect_messages(self, WriteBuffer buf, char mtype, int stop_at=?)
128128
cdef bytearray consume_messages(self, char mtype)
129129
cdef finish_message(self)
130130
cdef inline _finish_message(self)

buffer.pyx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,8 @@ cdef class ReadBuffer:
634634
self._finish_message()
635635
return mem
636636

637-
cdef redirect_messages(self, WriteBuffer buf, char mtype):
637+
cdef redirect_messages(self, WriteBuffer buf, char mtype,
638+
int stop_at=0):
638639
if not self._current_message_ready:
639640
raise exceptions.BufferError(
640641
'consume_full_messages called on a buffer without a '
@@ -669,7 +670,10 @@ cdef class ReadBuffer:
669670
else:
670671
return
671672

672-
# Fast path: exhaust buf0 as efficiently as possible.
673+
if stop_at and buf._length >= stop_at:
674+
return
675+
676+
# Fast path: exhaust buf0 as efficiently as possible.
673677
if self._pos0 + 5 <= self._len0:
674678
cbuf = cpython.PyBytes_AS_STRING(self._buf0)
675679
new_pos0 = self._pos0
@@ -682,14 +686,17 @@ cdef class ReadBuffer:
682686
if (cbuf + new_pos0)[0] != mtype:
683687
done = 1
684688
break
689+
if (stop_at and
690+
(buf._length + new_pos0 - self._pos0) > stop_at):
691+
done = 1
692+
break
685693
msg_len = hton.unpack_int32(cbuf + new_pos0 + 1) + 1
686694
if new_pos0 + msg_len > cbuf_len:
687695
break
688696
new_pos0 += msg_len
689697

690698
if new_pos0 != self._pos0:
691-
if PG_DEBUG:
692-
assert self._pos0 < new_pos0 <= self._len0
699+
assert self._pos0 < new_pos0 <= self._len0
693700

694701
pos_delta = new_pos0 - self._pos0
695702
buf.write_cstr(
@@ -699,8 +706,7 @@ cdef class ReadBuffer:
699706
self._pos0 = new_pos0
700707
self._length -= pos_delta
701708

702-
if PG_DEBUG:
703-
assert self._length >= 0
709+
assert self._length >= 0
704710

705711
if done:
706712
# The next message is of a different type.

0 commit comments

Comments
 (0)