Skip to content

Commit 4b7330d

Browse files
committed
fixes for ExponentialReconnectionPolicy
- documentation specified floats for base_delay and max_delay; fix tests to match - fix issue from PYTHON-707
1 parent 3336fe1 commit 4b7330d

2 files changed

Lines changed: 24 additions & 6 deletions

File tree

cassandra/policies.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -564,9 +564,17 @@ def __init__(self, base_delay, max_delay, max_attempts=64):
564564
self.max_attempts = max_attempts
565565

566566
def new_schedule(self):
567-
i = 0
567+
i, overflowed = 0, False
568568
while self.max_attempts is None or i < self.max_attempts:
569-
yield min(self.base_delay * (2 ** i), self.max_delay)
569+
if overflowed:
570+
yield self.max_delay
571+
else:
572+
try:
573+
yield min(self.base_delay * (2 ** i), self.max_delay)
574+
except OverflowError:
575+
overflowed = True
576+
yield self.max_delay
577+
570578
i += 1
571579

572580

tests/unit/test_policies.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -885,8 +885,8 @@ def test_bad_vals(self):
885885
self.assertRaises(ValueError, ExponentialReconnectionPolicy, 1, 2,-1)
886886

887887
def test_schedule_no_max(self):
888-
base_delay = 2
889-
max_delay = 100
888+
base_delay = 2.0
889+
max_delay = 100.0
890890
test_iter = 10000
891891
policy = ExponentialReconnectionPolicy(base_delay=base_delay, max_delay=max_delay, max_attempts=None)
892892
sched_slice = list(islice(policy.new_schedule(), 0, test_iter))
@@ -895,8 +895,8 @@ def test_schedule_no_max(self):
895895
self.assertEqual(len(sched_slice), test_iter)
896896

897897
def test_schedule_with_max(self):
898-
base_delay = 2
899-
max_delay = 100
898+
base_delay = 2.0
899+
max_delay = 100.0
900900
max_attempts = 64
901901
policy = ExponentialReconnectionPolicy(base_delay=base_delay, max_delay=max_delay, max_attempts=max_attempts)
902902
schedule = list(policy.new_schedule())
@@ -909,6 +909,16 @@ def test_schedule_with_max(self):
909909
else:
910910
self.assertEqual(delay, max_delay)
911911

912+
def test_schedule_exactly_one_attempt(self):
913+
base_delay = 2.0
914+
max_delay = 100.0
915+
max_attempts = 1
916+
policy = ExponentialReconnectionPolicy(
917+
base_delay=base_delay, max_delay=max_delay, max_attempts=max_attempts
918+
)
919+
self.assertEqual(len(list(policy.new_schedule())), 1)
920+
921+
912922
ONE = ConsistencyLevel.ONE
913923

914924

0 commit comments

Comments
 (0)