Skip to content
This repository was archived by the owner on Jan 9, 2024. It is now read-only.

Commit d154a7c

Browse files
committed
copy slaves to new slots as well
1 parent 8a23dc1 commit d154a7c

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

rediscluster/client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -680,8 +680,8 @@ def _execute_command(self, *args, **kwargs):
680680
self.refresh_table_asap = True
681681
self.connection_pool.nodes.increment_reinitialize_counter()
682682

683-
node = self.connection_pool.nodes.set_node(e.host, e.port, server_type='master')
684-
self.connection_pool.nodes.slots[e.slot_id][0] = node
683+
node = self.connection_pool.nodes.get_node(e.host, e.port, server_type='master')
684+
self.connection_pool.nodes.move_slot_to_node(e.slot_id, node)
685685
except TryAgainError as e:
686686
log.exception("TryAgainError")
687687

rediscluster/nodemanager.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def __init__(self, startup_nodes=None, reinitialize_steps=None, skip_full_covera
3939
self.connection_kwargs = connection_kwargs
4040
self.nodes = {}
4141
self.slots = {}
42+
self.slave_nodes_by_master = {}
4243
self.startup_nodes = [] if startup_nodes is None else startup_nodes
4344
self.orig_startup_nodes = [node for node in self.startup_nodes]
4445
self.reinitialize_counter = 0
@@ -257,6 +258,8 @@ def initialize(self):
257258
node, node_name = self.make_node_obj(master_node[0], master_node[1], 'master')
258259
nodes_cache[node_name] = node
259260

261+
self.slave_nodes_by_master[node_name] = set()
262+
260263
for i in range(int(slot[0]), int(slot[1]) + 1):
261264
if i not in tmp_slots:
262265
tmp_slots[i] = [node]
@@ -267,6 +270,7 @@ def initialize(self):
267270
target_slave_node, slave_node_name = self.make_node_obj(slave_node[0], slave_node[1], 'slave')
268271
nodes_cache[slave_node_name] = target_slave_node
269272
tmp_slots[i].append(target_slave_node)
273+
self.slave_nodes_by_master[node_name].add(slave_node_name)
270274
else:
271275
# Validate that 2 nodes want to use the same slot cache setup
272276
if tmp_slots[i][0]['name'] != node['name']:
@@ -409,6 +413,22 @@ def set_node(self, host, port, server_type=None):
409413

410414
return node
411415

416+
def get_node(self, host, port, server_type=None):
417+
node, node_name = self.make_node_obj(host, port, server_type)
418+
if node_name not in self.nodes:
419+
self.nodes[node_name] = node
420+
return self.nodes[node_name]
421+
422+
def move_slot_to_node(self, slot, node):
423+
node_name = node['name']
424+
self.slots[slot] = [node]
425+
slave_nodes = self.slave_nodes_by_master.get(node_name)
426+
if slave_nodes:
427+
for slave_name in slave_nodes:
428+
slave_node = self.nodes.get(slave_name)
429+
if slave_node:
430+
self.slots[slot].append(slave_node)
431+
412432
def populate_startup_nodes(self):
413433
"""
414434
Do something with all startup nodes and filters out any duplicates

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
setup(
2222
name="redis-py-cluster-patched",
23-
version="2.1.0.999.6",
23+
version="2.1.0.999.7",
2424
description="Library for communicating with Redis Clusters. Built on top of redis-py lib",
2525
long_description=readme + '\n\n' + history,
2626
long_description_content_type="text/markdown",
@@ -30,7 +30,7 @@
3030
maintainer_email='Grokzen@gmail.com',
3131
packages=["rediscluster"],
3232
url='http://github.com/grokzen/redis-py-cluster',
33-
download_url="https://github.com/duke-cliff/redis-py-cluster/archive/2.1.0.999.6.tar.gz",
33+
download_url="https://github.com/duke-cliff/redis-py-cluster/archive/2.1.0.999.7.tar.gz",
3434
license='MIT',
3535
install_requires=[
3636
'redis>=3.0.0,<4.0.0'

0 commit comments

Comments
 (0)