Skip to content

Commit 49357de

Browse files
committed
Simplify logic in Downgrading write timeout, and test
1 parent be479b9 commit 49357de

2 files changed

Lines changed: 15 additions & 13 deletions

File tree

cassandra/policies.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -816,14 +816,19 @@ def on_write_timeout(self, query, consistency, write_type,
816816
required_responses, received_responses, retry_num):
817817
if retry_num != 0:
818818
return (self.RETHROW, None)
819-
elif write_type in (WriteType.SIMPLE, WriteType.BATCH, WriteType.COUNTER) and received_responses > 0:
820-
return (self.IGNORE, None)
819+
820+
if write_type in (WriteType.SIMPLE, WriteType.BATCH, WriteType.COUNTER):
821+
if received_responses > 0:
822+
# persisted on at least one replica
823+
return (self.IGNORE, None)
824+
else:
825+
return (self.RETHROW, None)
821826
elif write_type == WriteType.UNLOGGED_BATCH:
822827
return self._pick_consistency(received_responses)
823828
elif write_type == WriteType.BATCH_LOG:
824829
return (self.RETRY, consistency)
825-
else:
826-
return (self.RETHROW, None)
830+
831+
return (self.RETHROW, None)
827832

828833
def on_unavailable(self, query, consistency, required_replicas, alive_replicas, retry_num):
829834
if retry_num != 0:

tests/unit/test_policies.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,20 +1052,17 @@ def test_write_timeout(self):
10521052
self.assertEqual(retry, RetryPolicy.RETHROW)
10531053
self.assertEqual(consistency, None)
10541054

1055-
# On these type of writes failures should not be ignored
1056-
# if received_responses is 0
1057-
for write_type in (WriteType.SIMPLE, WriteType.BATCH, WriteType.COUNTER):
1058-
retry, consistency = policy.on_write_timeout(
1059-
query=None, consistency=ONE, write_type=write_type,
1060-
required_responses=1, received_responses=0, retry_num=0)
1061-
self.assertEqual(retry, RetryPolicy.RETHROW)
1062-
1063-
# ignore failures on these types of writes
10641055
for write_type in (WriteType.SIMPLE, WriteType.BATCH, WriteType.COUNTER):
1056+
# ignore failures if at least one response (replica persisted)
10651057
retry, consistency = policy.on_write_timeout(
10661058
query=None, consistency=ONE, write_type=write_type,
10671059
required_responses=1, received_responses=2, retry_num=0)
10681060
self.assertEqual(retry, RetryPolicy.IGNORE)
1061+
# retrhow if we can't be sure we have a replica
1062+
retry, consistency = policy.on_write_timeout(
1063+
query=None, consistency=ONE, write_type=write_type,
1064+
required_responses=1, received_responses=0, retry_num=0)
1065+
self.assertEqual(retry, RetryPolicy.RETHROW)
10691066

10701067
# downgrade consistency level on unlogged batch writes
10711068
retry, consistency = policy.on_write_timeout(

0 commit comments

Comments
 (0)