Skip to content

Commit 95f74b9

Browse files
committed
fix read_bytes raise StreamClosedError
1 parent 5d4a95b commit 95f74b9

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

tormysql/connections.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ def __init__(self, *args, **kwargs):
2323
self._close_callback = None
2424
self._rbuffer = StringIO(b'')
2525
self._rbuffer_size = 0
26+
self._loop = None
2627
super(Connection, self).__init__(*args, **kwargs)
2728

2829
def set_close_callback(self, callback):
@@ -50,6 +51,7 @@ def __del__(self):
5051
self.close()
5152

5253
def _connect(self):
54+
self._loop = IOLoop.current()
5355
try:
5456
if self.unix_socket and self.host in ('localhost', '127.0.0.1'):
5557
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
@@ -126,14 +128,19 @@ def _read_bytes(self, num_bytes):
126128
main = child_gr.parent
127129
assert main is not None, "Execut must be running in child greenlet"
128130

129-
def read_callback(data):
131+
def read_callback(future):
132+
if future._exc_info is not None:
133+
return child_gr.throw(err.OperationalError(2006, "MySQL server has gone away (%r)" % (future.exception(),)))
134+
135+
data = future.result()
130136
last_buf = b''
131137
if self._rbuffer_size > 0:
132138
last_buf += self._rbuffer.read()
133139
self._rbuffer_size = 0
134140
return child_gr.switch(last_buf + data)
135141
try:
136-
self._rfile.read_bytes(num_bytes - self._rbuffer_size, read_callback)
142+
future = self._rfile.read_bytes(num_bytes - self._rbuffer_size)
143+
self._loop.add_future(future, read_callback)
137144
except (AttributeError, StreamClosedError) as e:
138145
raise err.OperationalError(2006, "MySQL server has gone away (%r)" % (e,))
139146
return main.switch()

0 commit comments

Comments
 (0)