Skip to content

Commit ee0271b

Browse files
Reload ro info on ro error
1 parent 0cf8c33 commit ee0271b

File tree

1 file changed

+37
-6
lines changed

1 file changed

+37
-6
lines changed

tarantool/connection_pool.py

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
RECONNECT_DELAY, RECONNECT_MAX_ATTEMPTS,
1010
SOCKET_TIMEOUT)
1111
from tarantool.error import (ClusterConnectWarning, ClusterTolopogyWarning,
12-
ConfigurationError, warn)
12+
ConfigurationError, DatabaseError, tnt_strerror,
13+
warn)
1314
from tarantool.utils import ENCODING_DEFAULT
1415

1516
try:
@@ -184,10 +185,9 @@ def close(self):
184185
def is_closed(self):
185186
raise NotImplementedError
186187

187-
def connect(self):
188+
def update_ro_info(self):
188189
for addr in self.addrs:
189190
key = json.dumps(addr)
190-
self.pool[key]['conn'].connect()
191191

192192
if not self.pool[key]['conn'].connected:
193193
msg = 'Failed to connect to %s:%s' % str(addr['host'], addr['port'])
@@ -203,14 +203,45 @@ def connect(self):
203203

204204
self.strategy.update(self.pool)
205205

206+
def connect(self):
207+
for addr in self.addrs:
208+
key = json.dumps(addr)
209+
self.pool[key]['conn'].connect()
210+
211+
self.update_ro_info()
212+
206213
def call(self, func_name, *args, **kwargs):
207214
mode = kwargs.get('mode', Mode.PREFER_RW)
208215
conn = self.strategy.getnext(mode)
209216

210-
return conn.call(func_name, args)
217+
# try:
218+
resp = conn.call(func_name, args)
219+
# except ValueError:
220+
#reload
221+
# resp = conn.call(func_name, args)
222+
223+
return resp
211224

212-
def eval(self, expr, *args):
213-
raise NotImplementedError
225+
def eval(self, expr, *args, **kwargs):
226+
mode = kwargs.get('mode', Mode.PREFER_RW)
227+
conn = self.strategy.getnext(mode)
228+
229+
try:
230+
resp = conn.eval(expr, args)
231+
except DatabaseError as e:
232+
if len(e.args) > 0:
233+
strerror = tnt_strerror(e.args[0])
234+
else:
235+
raise
236+
237+
if strerror != 'UNDEFINED' and strerror[0] == 'ER_READONLY':
238+
self.update_ro_info()
239+
conn = self.strategy.getnext(mode)
240+
resp = conn.eval(expr, args)
241+
else:
242+
raise
243+
244+
return resp
214245

215246
def replace(self, space_name, values):
216247
raise NotImplementedError

0 commit comments

Comments
 (0)