@@ -96,19 +96,19 @@ def __exit__(self, exc_type, exc_val, exc_tb):
96
96
self .__update_fastest_node_timer .__exit__ ()
97
97
98
98
def __init__ (self , topology : Topology , thread_pool : ThreadPoolExecutor ):
99
- self .__state = self .__NodeSelectorState (topology )
99
+ self ._state = self .__NodeSelectorState (topology )
100
100
self .__update_fastest_node_timer : Union [None , time ] = None
101
101
self .__thread_pool_executor = thread_pool
102
102
103
103
@property
104
104
def topology (self ) -> Topology :
105
- return self .__state .topology
105
+ return self ._state .topology
106
106
107
107
def node_is_available (self , index : int ) -> bool :
108
- return self .__state .failures [index ] == 0
108
+ return self ._state .failures [index ] == 0
109
109
110
110
def on_failed_request (self , node_index : int ) -> None :
111
- state = self .__state
111
+ state = self ._state
112
112
if node_index < 0 or node_index >= len (state .failures ):
113
113
return
114
114
state .failures [node_index ] += 1
@@ -117,19 +117,19 @@ def on_update_topology(self, topology: Topology, force_update: bool = False) ->
117
117
if topology is None :
118
118
return False
119
119
120
- state_etag = self .__state .topology .etag if self .__state .topology .etag else 0
120
+ state_etag = self ._state .topology .etag if self ._state .topology .etag else 0
121
121
topology_etag = topology .etag if topology .etag else 0
122
122
123
123
if state_etag >= topology_etag and not force_update :
124
124
return False
125
125
126
126
state = NodeSelector .__NodeSelectorState (topology )
127
- self .__state = state
127
+ self ._state = state
128
128
129
129
return True
130
130
131
131
def get_requested_node (self , node_tag : str ) -> CurrentIndexAndNode :
132
- state = self .__state
132
+ state = self ._state
133
133
server_nodes = state .nodes
134
134
for i in range (len (server_nodes )):
135
135
if server_nodes [i ].cluster_tag == node_tag :
@@ -140,7 +140,7 @@ def get_requested_node(self, node_tag: str) -> CurrentIndexAndNode:
140
140
raise RequestedNodeUnavailableException (f"Could not find requested node { node_tag } " )
141
141
142
142
def get_preferred_node (self ) -> CurrentIndexAndNode :
143
- state = self .__state
143
+ state = self ._state
144
144
return self .get_preferred_node_internal (state )
145
145
146
146
@classmethod
@@ -154,7 +154,7 @@ def get_preferred_node_internal(cls, state: NodeSelector.__NodeSelectorState) ->
154
154
return cls .unlikely_everyone_faulted_choice (state )
155
155
156
156
def get_preferred_node_with_topology (self ) -> CurrentIndexAndNodeAndEtag :
157
- state = self .__state
157
+ state = self ._state
158
158
preferred_node = self .get_preferred_node_internal (state )
159
159
etag = (state .topology .etag if state .topology .etag else - 2 ) if state .topology else - 2
160
160
return CurrentIndexAndNodeAndEtag (preferred_node .current_index , preferred_node .current_node , etag )
@@ -168,7 +168,7 @@ def unlikely_everyone_faulted_choice(state: NodeSelector.__NodeSelectorState) ->
168
168
return state .node_when_everyone_marked_as_faulted
169
169
170
170
def get_node_by_session_id (self , session_id : int ) -> CurrentIndexAndNode :
171
- state = self .__state
171
+ state = self ._state
172
172
if len (state .topology .nodes ) == 0 :
173
173
raise AllTopologyNodesDownException ("There are no nodes in the topology at all" )
174
174
index = abs (session_id % len (state .topology .nodes ))
@@ -183,19 +183,19 @@ def get_node_by_session_id(self, session_id: int) -> CurrentIndexAndNode:
183
183
return self .get_preferred_node ()
184
184
185
185
def get_fastest_node (self ) -> CurrentIndexAndNode :
186
- state = self .__state
186
+ state = self ._state
187
187
if state .failures [state .fastest ] == 0 and state .nodes [state .fastest ].server_role == ServerNode .Role .MEMBER :
188
188
return CurrentIndexAndNode (state .fastest , state .nodes [state .fastest ])
189
189
190
190
# if the fastest node has failures, we'll immediately schedule
191
191
# another run of finding who the fastest node is, in the mantime
192
192
# we'll just use the server preferred node or failover as usual
193
193
194
- self .__switch_to_speed_test_phase ()
194
+ self ._switch_to_speed_test_phase ()
195
195
return self .get_preferred_node ()
196
196
197
197
def restore_node_index (self , node_index : int ) -> None :
198
- state = self .__state
198
+ state = self ._state
199
199
if len (state .failures ) <= node_index :
200
200
return
201
201
@@ -205,24 +205,23 @@ def restore_node_index(self, node_index: int) -> None:
205
205
def _throw_empty_topology () -> None :
206
206
raise RuntimeError ("Empty database topology, this shouldn't happen." )
207
207
208
- def __switch_to_speed_test_phase (self ) -> None :
209
- state = self .__state
208
+ def _switch_to_speed_test_phase (self ) -> None :
209
+ state = self ._state
210
210
211
211
if not state .speed_test_mode == 0 :
212
212
state .speed_test_mode = 1
213
213
return
214
214
215
- for i in state .fastest_records :
216
- i = 0
215
+ state .fastest_records = len (state .fastest_records ) * [0 ]
217
216
218
217
state .speed_test_mode += 1
219
218
220
219
@property
221
220
def in_speed_test_phase (self ) -> bool :
222
- return self .__state .speed_test_mode > 1
221
+ return self ._state .speed_test_mode > 1
223
222
224
223
def record_fastest (self , index : int , node : ServerNode ) -> None :
225
- state = self .__state
224
+ state = self ._state
226
225
state_fastest = state .fastest_records
227
226
228
227
# the following two checks are to verify that things didn't move
@@ -273,11 +272,11 @@ def __select_fastest(self, state: NodeSelector.__NodeSelectorState, index: int)
273
272
274
273
else :
275
274
self .__update_fastest_node_timer = threading .Timer (
276
- datetime .timedelta (minutes = 1 ), self .__switch_to_speed_test_phase
275
+ datetime .timedelta (minutes = 1 ), self ._switch_to_speed_test_phase
277
276
)
278
277
279
278
def schedule_speed_test (self ) -> None :
280
- self .__switch_to_speed_test_phase ()
279
+ self ._switch_to_speed_test_phase ()
281
280
282
281
283
282
class CurrentIndexAndNode :
0 commit comments