@@ -23,6 +23,7 @@ def __init__(self, *args, **kwargs):
23
23
self ._close_callback = None
24
24
self ._rbuffer = StringIO (b'' )
25
25
self ._rbuffer_size = 0
26
+ self ._loop = None
26
27
super (Connection , self ).__init__ (* args , ** kwargs )
27
28
28
29
def set_close_callback (self , callback ):
@@ -50,6 +51,7 @@ def __del__(self):
50
51
self .close ()
51
52
52
53
def _connect (self ):
54
+ self ._loop = IOLoop .current ()
53
55
try :
54
56
if self .unix_socket and self .host in ('localhost' , '127.0.0.1' ):
55
57
sock = socket .socket (socket .AF_UNIX , socket .SOCK_STREAM )
@@ -126,14 +128,19 @@ def _read_bytes(self, num_bytes):
126
128
main = child_gr .parent
127
129
assert main is not None , "Execut must be running in child greenlet"
128
130
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 ()
130
136
last_buf = b''
131
137
if self ._rbuffer_size > 0 :
132
138
last_buf += self ._rbuffer .read ()
133
139
self ._rbuffer_size = 0
134
140
return child_gr .switch (last_buf + data )
135
141
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 )
137
144
except (AttributeError , StreamClosedError ) as e :
138
145
raise err .OperationalError (2006 , "MySQL server has gone away (%r)" % (e ,))
139
146
return main .switch ()
0 commit comments