30
30
RESULT_KIND_ROWS , RESULT_KIND_SET_KEYSPACE ,
31
31
RESULT_KIND_SCHEMA_CHANGE , RESULT_KIND_PREPARED ,
32
32
ProtocolHandler )
33
- from cassandra .policies import RetryPolicy
33
+ from cassandra .policies import RetryPolicy , ExponentialBackoffRetryPolicy
34
34
from cassandra .pool import NoConnectionsAvailable
35
35
from cassandra .query import SimpleStatement
36
36
@@ -265,7 +265,7 @@ def test_retry_policy_says_retry(self):
265
265
host = Mock ()
266
266
rf ._set_result (host , None , None , result )
267
267
268
- session .submit . assert_called_once_with (rf ._retry_task , True , host )
268
+ rf . session .cluster . scheduler . schedule . assert_called_once_with (ANY , rf ._retry_task , True , host )
269
269
self .assertEqual (1 , rf ._query_retries )
270
270
271
271
connection = Mock (spec = Connection )
@@ -300,7 +300,7 @@ def test_retry_with_different_host(self):
300
300
host = Mock ()
301
301
rf ._set_result (host , None , None , result )
302
302
303
- session .submit . assert_called_once_with (rf ._retry_task , False , host )
303
+ rf . session .cluster . scheduler . schedule . assert_called_once_with (ANY , rf ._retry_task , False , host )
304
304
# query_retries does get incremented for Overloaded/Bootstrapping errors (since 3.18)
305
305
self .assertEqual (1 , rf ._query_retries )
306
306
@@ -332,7 +332,8 @@ def test_all_retries_fail(self):
332
332
rf ._set_result (host , None , None , result )
333
333
334
334
# simulate the executor running this
335
- session .submit .assert_called_once_with (rf ._retry_task , False , host )
335
+ rf .session .cluster .scheduler .schedule .assert_called_once_with (ANY , rf ._retry_task , False , host )
336
+
336
337
rf ._retry_task (False , host )
337
338
338
339
# it should try with a different host
@@ -342,11 +343,34 @@ def test_all_retries_fail(self):
342
343
rf ._set_result (host , None , None , result )
343
344
344
345
# simulate the executor running this
345
- session .submit . assert_called_with (rf ._retry_task , False , host )
346
+ rf . session .cluster . scheduler . schedule . assert_called_with (ANY , rf ._retry_task , False , host )
346
347
rf ._retry_task (False , host )
347
348
348
349
self .assertRaises (NoHostAvailable , rf .result )
349
350
351
+ def test_exponential_retry_policy_fail (self ):
352
+ session = self .make_session ()
353
+ pool = session ._pools .get .return_value
354
+ connection = Mock (spec = Connection )
355
+ pool .borrow_connection .return_value = (connection , 1 )
356
+
357
+ query = SimpleStatement ("SELECT * FROM foo" )
358
+ message = QueryMessage (query = query , consistency_level = ConsistencyLevel .ONE )
359
+ rf = ResponseFuture (session , message , query , 1 , retry_policy = ExponentialBackoffRetryPolicy (2 ))
360
+ rf .send_request ()
361
+ rf .session ._pools .get .assert_called_once_with ('ip1' )
362
+
363
+ result = Mock (spec = IsBootstrappingErrorMessage , info = {})
364
+ host = Mock ()
365
+ rf ._set_result (host , None , None , result )
366
+
367
+ # simulate the executor running this
368
+ rf .session .cluster .scheduler .schedule .assert_called_once_with (ANY , rf ._retry_task , False , host )
369
+
370
+ delay = rf .session .cluster .scheduler .schedule .mock_calls [- 1 ][1 ][0 ]
371
+ assert delay > 0.05
372
+ rf ._retry_task (False , host )
373
+
350
374
def test_all_pools_shutdown (self ):
351
375
session = self .make_basic_session ()
352
376
session .cluster ._default_load_balancing_policy .make_query_plan .return_value = ['ip1' , 'ip2' ]
0 commit comments