Skip to content

Commit f502b13

Browse files
committed
Check that connection is alive using ctypes.c.recv
1 parent 0e214d5 commit f502b13

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

src/tarantool/connection.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
This module provides low-level API for Tarantool
55
'''
66

7+
import time
78
import errno
9+
import ctypes
10+
import ctypes.util
811
import socket
9-
import time
1012

1113
from tarantool.response import Response
1214
from tarantool.request import (
@@ -77,6 +79,9 @@ def __init__(self, host, port,
7779
self._socket = None
7880
if connect_now:
7981
self.connect()
82+
self._libc = ctypes.CDLL(ctypes.util.find_library('c'), use_errno=True)
83+
self._recv_type = ctypes.CFUNCTYPE(ctypes.c_ssize_t, *[ctypes.c_int, ctypes.c_void_p, ctypes.c_ssize_t, ctypes.c_int], use_errno=True)
84+
self._recv = self._recv_type(self._libc.recv)
8085

8186
def close(self):
8287
'''\
@@ -153,19 +158,16 @@ def _send_request_wo_reconnect(self, request, space_name = None, field_defs = No
153158

154159
def _opt_reconnect(self):
155160
attempt = 0
161+
if not self._socket:
162+
self.connect()
156163
while True:
157-
try:
158-
if not self._socket or not self._socket.recv(0, socket.MSG_DONTWAIT):
159-
time.sleep(self.reconnect_delay)
160-
self.connect()
161-
warn("Reconnect attempt %d of %d"%(attempt, self.reconnect_max_attempts), NetworkWarning)
162-
except socket.error as e:
163-
if e.errno == errno.EAGAIN:
164-
break
165-
else:
166-
time.sleep(self.reconnect_delay)
167-
self.connect()
168-
warn("%s : Reconnect attempt %d of %d"%(e.message, attempt, self.reconnect_max_attempts), NetworkWarning)
164+
rc = self._recv(self._socket.fileno(), '', 0, socket.MSG_DONTWAIT)
165+
if ctypes.get_errno() == errno.EAGAIN:
166+
ctypes.set_errno(0)
167+
break
168+
time.sleep(self.reconnect_delay)
169+
self.connect()
170+
warn("Reconnect attempt %d of %d"%(attempt, self.reconnect_max_attempts), NetworkWarning)
169171
if attempt == self.reconnect_max_attempts:
170172
raise
171173
attempt += 1

0 commit comments

Comments
 (0)