Skip to content

Commit 9851167

Browse files
committed
Implement getting the cluster nodes list from nodes
Periodically call a user-defined Lua function on a node to obtain or refresh the full cluster nodes list. Resolves: #134
1 parent a6b6d56 commit 9851167

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

tarantool/const.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,5 @@
8686
RECONNECT_MAX_ATTEMPTS = 10
8787
# Default delay between attempts to reconnect (seconds)
8888
RECONNECT_DELAY = 0.1
89+
# Default cluster nodes list refresh interval (seconds)
90+
NODES_REFRESH_INTERVAL = 300

tarantool/mesh_connection.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
between tarantool instances and basic Round-Robin strategy.
55
'''
66

7+
import time
78
from tarantool.connection import Connection
89
from tarantool.error import NetworkError
910
from tarantool.utils import ENCODING_DEFAULT
1011
from tarantool.const import (
1112
SOCKET_TIMEOUT,
1213
RECONNECT_MAX_ATTEMPTS,
13-
RECONNECT_DELAY
14+
RECONNECT_DELAY,
15+
NODES_REFRESH_INTERVAL
1416
)
1517

1618

@@ -34,12 +36,15 @@ def __init__(self, addrs,
3436
reconnect_delay=RECONNECT_DELAY,
3537
connect_now=True,
3638
encoding=ENCODING_DEFAULT,
37-
strategy_class=RoundRobinStrategy):
39+
strategy_class=RoundRobinStrategy,
40+
nodes_refresh_interval=NODES_REFRESH_INTERVAL):
3841
self.nattempts = 2 * len(addrs) + 1
3942
self.strategy = strategy_class(addrs)
4043
addr = self.strategy.getnext()
4144
host = addr['host']
4245
port = addr['port']
46+
self.nodes_refresh_interval = nodes_refresh_interval
47+
self.last_nodes_refresh = 0
4348
super(MeshConnection, self).__init__(host=host,
4449
port=port,
4550
user=user,
@@ -63,3 +68,11 @@ def _opt_reconnect(self):
6368
self.port = addr['port']
6469
else:
6570
raise NetworkError
71+
72+
now = time.time()
73+
if now - self.last_nodes_refresh > self.nodes_refresh_interval:
74+
addrs = super(MeshConnection, self).call('get_nodes')
75+
if addrs and type(addrs) is list:
76+
self.addrs = addrs
77+
self.pos = 0
78+
self.last_nodes_refresh = now

0 commit comments

Comments
 (0)