@@ -842,41 +842,49 @@ def set_response_callback(self, command, callback):
842
842
def _determine_nodes (self , * args , ** kwargs ) -> List ["ClusterNode" ]:
843
843
# Determine which nodes should be executed the command on.
844
844
# Returns a list of target nodes.
845
- command = args [0 ].upper ()
846
- if len (args ) >= 2 and f"{ args [0 ]} { args [1 ]} " .upper () in self .command_flags :
847
- command = f"{ args [0 ]} { args [1 ]} " .upper ()
848
-
849
- nodes_flag = kwargs .pop ("nodes_flag" , None )
850
- if nodes_flag is not None :
851
- # nodes flag passed by the user
852
- command_flag = nodes_flag
853
- else :
854
- # get the nodes group for this command if it was predefined
855
- command_flag = self .command_flags .get (command )
856
- if command_flag == self .__class__ .RANDOM :
857
- # return a random node
858
- return [self .get_random_node ()]
859
- elif command_flag == self .__class__ .PRIMARIES :
860
- # return all primaries
861
- return self .get_primaries ()
862
- elif command_flag == self .__class__ .REPLICAS :
863
- # return all replicas
864
- return self .get_replicas ()
865
- elif command_flag == self .__class__ .ALL_NODES :
866
- # return all nodes
867
- return self .get_nodes ()
868
- elif command_flag == self .__class__ .DEFAULT_NODE :
869
- # return the cluster's default node
870
- return [self .nodes_manager .default_node ]
871
- elif command in self .__class__ .SEARCH_COMMANDS [0 ]:
872
- return [self .nodes_manager .default_node ]
873
- else :
874
- # get the node that holds the key's slot
875
- slot = self .determine_slot (* args )
876
- node = self .nodes_manager .get_node_from_slot (
877
- slot , self .read_from_replicas and command in READ_COMMANDS
878
- )
879
- return [node ]
845
+ try :
846
+ command = args [0 ].upper ()
847
+ if len (args ) >= 2 and f"{ args [0 ]} { args [1 ]} " .upper () in self .command_flags :
848
+ command = f"{ args [0 ]} { args [1 ]} " .upper ()
849
+
850
+ nodes_flag = kwargs .pop ("nodes_flag" , None )
851
+ if nodes_flag is not None :
852
+ # nodes flag passed by the user
853
+ command_flag = nodes_flag
854
+ else :
855
+ # get the nodes group for this command if it was predefined
856
+ command_flag = self .command_flags .get (command )
857
+ if command_flag == self .__class__ .RANDOM :
858
+ # return a random node
859
+ return [self .get_random_node ()]
860
+ elif command_flag == self .__class__ .PRIMARIES :
861
+ # return all primaries
862
+ return self .get_primaries ()
863
+ elif command_flag == self .__class__ .REPLICAS :
864
+ # return all replicas
865
+ return self .get_replicas ()
866
+ elif command_flag == self .__class__ .ALL_NODES :
867
+ # return all nodes
868
+ return self .get_nodes ()
869
+ elif command_flag == self .__class__ .DEFAULT_NODE :
870
+ # return the cluster's default node
871
+ return [self .nodes_manager .default_node ]
872
+ elif command in self .__class__ .SEARCH_COMMANDS [0 ]:
873
+ return [self .nodes_manager .default_node ]
874
+ else :
875
+ # get the node that holds the key's slot
876
+ slot = self .determine_slot (* args )
877
+ node = self .nodes_manager .get_node_from_slot (
878
+ slot , self .read_from_replicas and command in READ_COMMANDS
879
+ )
880
+ return [node ]
881
+ except SlotNotCoveredError as e :
882
+ self .reinitialize_counter += 1
883
+ if self ._should_reinitialized ():
884
+ self .nodes_manager .initialize ()
885
+ # Reset the counter
886
+ self .reinitialize_counter = 0
887
+ raise e
880
888
881
889
def _should_reinitialized (self ):
882
890
# To reinitialize the cluster on every MOVED error,
@@ -1150,6 +1158,13 @@ def _execute_command(self, target_node, *args, **kwargs):
1150
1158
else :
1151
1159
self .nodes_manager .update_moved_exception (e )
1152
1160
moved = True
1161
+ except SlotNotCoveredError as e :
1162
+ self .reinitialize_counter += 1
1163
+ if self ._should_reinitialized ():
1164
+ self .nodes_manager .initialize ()
1165
+ # Reset the counter
1166
+ self .reinitialize_counter = 0
1167
+ raise e
1153
1168
except TryAgainError :
1154
1169
if ttl < self .RedisClusterRequestTTL / 2 :
1155
1170
time .sleep (0.05 )
0 commit comments