Skip to content

Commit 0ffd49d

Browse files
committed
Fix incorrect sync read
1 parent ef8687e commit 0ffd49d

File tree

1 file changed

+15
-16
lines changed

1 file changed

+15
-16
lines changed

pyignite/connection/connection.py

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@ def _connection_listener(self):
156156
return self.client._event_listeners
157157

158158

159+
DEFAULT_INITIAL_BUF_SIZE = 1024
160+
161+
159162
class Connection(BaseConnection):
160163
"""
161164
This is a `pyignite` class, that represents a connection to Ignite
@@ -348,39 +351,35 @@ def recv(self, flags=None, reconnect=True) -> bytearray:
348351
if flags is not None:
349352
kwargs['flags'] = flags
350353

351-
data = bytearray(1024)
354+
data = bytearray(DEFAULT_INITIAL_BUF_SIZE)
352355
buffer = memoryview(data)
353-
bytes_total_received, bytes_to_receive = 0, 0
356+
total_rcvd, packet_len = 0, 0
354357
while True:
355358
try:
356-
bytes_received = self._socket.recv_into(buffer, len(buffer), **kwargs)
357-
if bytes_received == 0:
359+
bytes_rcvd = self._socket.recv_into(buffer, len(buffer), **kwargs)
360+
if bytes_rcvd == 0:
358361
raise SocketError('Connection broken.')
359-
bytes_total_received += bytes_received
362+
total_rcvd += bytes_rcvd
360363
except connection_errors as e:
361364
self.failed = True
362365
if reconnect:
363366
self._on_connection_lost(e)
364367
self.reconnect()
365368
raise e
366369

367-
if bytes_total_received < 4:
368-
continue
369-
elif bytes_to_receive == 0:
370-
response_len = int.from_bytes(data[0:4], PROTOCOL_BYTE_ORDER)
371-
bytes_to_receive = response_len
372-
373-
if response_len + 4 > len(data):
370+
if packet_len == 0 and total_rcvd > 4:
371+
packet_len = int.from_bytes(data[0:4], PROTOCOL_BYTE_ORDER, signed=True) + 4
372+
if packet_len > len(data):
374373
buffer.release()
375-
data.extend(bytearray(response_len + 4 - len(data)))
376-
buffer = memoryview(data)[bytes_total_received:]
374+
data.extend(bytearray(packet_len - len(data)))
375+
buffer = memoryview(data)[total_rcvd:]
377376
continue
378377

379-
if bytes_total_received >= bytes_to_receive:
378+
if 0 < packet_len <= total_rcvd:
380379
buffer.release()
381380
break
382381

383-
buffer = buffer[bytes_received:]
382+
buffer = buffer[bytes_rcvd:]
384383

385384
return data
386385

0 commit comments

Comments
 (0)