@@ -551,8 +551,8 @@ def __init__(self, base_delay, max_delay, max_attempts=64):
551551 self .max_attempts = max_attempts
552552
553553 def new_schedule (self ):
554- i = 0
555- while self .max_attempts == None or i < self .max_attempts :
554+ i = 0
555+ while self .max_attempts is None or i < self .max_attempts :
556556 yield min (self .base_delay * (2 ** i ), self .max_delay )
557557 i += 1
558558
@@ -647,6 +647,12 @@ class or one of its subclasses.
647647 should be ignored but no more retries should be attempted.
648648 """
649649
650+ RETRY_NEXT_HOST = 3
651+ """
652+ This should be returned from the below methods if the operation
653+ should be retried on another connection.
654+ """
655+
650656 def on_read_timeout (self , query , consistency , required_responses ,
651657 received_responses , data_retrieved , retry_num ):
652658 """
@@ -674,11 +680,11 @@ def on_read_timeout(self, query, consistency, required_responses,
674680 a sufficient number of replicas responded (with data digests).
675681 """
676682 if retry_num != 0 :
677- return ( self .RETHROW , None )
683+ return self .RETHROW , None
678684 elif received_responses >= required_responses and not data_retrieved :
679- return ( self .RETRY , consistency )
685+ return self .RETRY , consistency
680686 else :
681- return ( self .RETHROW , None )
687+ return self .RETHROW , None
682688
683689 def on_write_timeout (self , query , consistency , write_type ,
684690 required_responses , received_responses , retry_num ):
@@ -707,11 +713,11 @@ def on_write_timeout(self, query, consistency, write_type,
707713 :attr:`~.WriteType.BATCH_LOG`.
708714 """
709715 if retry_num != 0 :
710- return ( self .RETHROW , None )
716+ return self .RETHROW , None
711717 elif write_type == WriteType .BATCH_LOG :
712- return ( self .RETRY , consistency )
718+ return self .RETRY , consistency
713719 else :
714- return ( self .RETHROW , None )
720+ return self .RETHROW , None
715721
716722 def on_unavailable (self , query , consistency , required_replicas , alive_replicas , retry_num ):
717723 """
@@ -736,7 +742,7 @@ def on_unavailable(self, query, consistency, required_replicas, alive_replicas,
736742
737743 By default, no retries will be attempted and the error will be re-raised.
738744 """
739- return (self .RETHROW , None )
745+ return (self .RETRY_NEXT_HOST , consistency ) if retry_num == 0 else ( self . RETHROW , None )
740746
741747
742748class FallthroughRetryPolicy (RetryPolicy ):
@@ -746,13 +752,13 @@ class FallthroughRetryPolicy(RetryPolicy):
746752 """
747753
748754 def on_read_timeout (self , * args , ** kwargs ):
749- return ( self .RETHROW , None )
755+ return self .RETHROW , None
750756
751757 def on_write_timeout (self , * args , ** kwargs ):
752- return ( self .RETHROW , None )
758+ return self .RETHROW , None
753759
754760 def on_unavailable (self , * args , ** kwargs ):
755- return ( self .RETHROW , None )
761+ return self .RETHROW , None
756762
757763
758764class DowngradingConsistencyRetryPolicy (RetryPolicy ):
@@ -804,46 +810,46 @@ class DowngradingConsistencyRetryPolicy(RetryPolicy):
804810 """
805811 def _pick_consistency (self , num_responses ):
806812 if num_responses >= 3 :
807- return ( self .RETRY , ConsistencyLevel .THREE )
813+ return self .RETRY , ConsistencyLevel .THREE
808814 elif num_responses >= 2 :
809- return ( self .RETRY , ConsistencyLevel .TWO )
815+ return self .RETRY , ConsistencyLevel .TWO
810816 elif num_responses >= 1 :
811- return ( self .RETRY , ConsistencyLevel .ONE )
817+ return self .RETRY , ConsistencyLevel .ONE
812818 else :
813- return ( self .RETHROW , None )
819+ return self .RETHROW , None
814820
815821 def on_read_timeout (self , query , consistency , required_responses ,
816822 received_responses , data_retrieved , retry_num ):
817823 if retry_num != 0 :
818- return ( self .RETHROW , None )
824+ return self .RETHROW , None
819825 elif received_responses < required_responses :
820826 return self ._pick_consistency (received_responses )
821827 elif not data_retrieved :
822- return ( self .RETRY , consistency )
828+ return self .RETRY , consistency
823829 else :
824- return ( self .RETHROW , None )
830+ return self .RETHROW , None
825831
826832 def on_write_timeout (self , query , consistency , write_type ,
827833 required_responses , received_responses , retry_num ):
828834 if retry_num != 0 :
829- return ( self .RETHROW , None )
835+ return self .RETHROW , None
830836
831837 if write_type in (WriteType .SIMPLE , WriteType .BATCH , WriteType .COUNTER ):
832838 if received_responses > 0 :
833839 # persisted on at least one replica
834- return ( self .IGNORE , None )
840+ return self .IGNORE , None
835841 else :
836- return ( self .RETHROW , None )
842+ return self .RETHROW , None
837843 elif write_type == WriteType .UNLOGGED_BATCH :
838844 return self ._pick_consistency (received_responses )
839845 elif write_type == WriteType .BATCH_LOG :
840- return ( self .RETRY , consistency )
846+ return self .RETRY , consistency
841847
842- return ( self .RETHROW , None )
848+ return self .RETHROW , None
843849
844850 def on_unavailable (self , query , consistency , required_replicas , alive_replicas , retry_num ):
845851 if retry_num != 0 :
846- return ( self .RETHROW , None )
852+ return self .RETHROW , None
847853 else :
848854 return self ._pick_consistency (alive_replicas )
849855
0 commit comments