1
+ from datetime import timedelta
2
+ import random
3
+
4
+ class RetrySettings (object ):
5
+
6
+ def __init__ (self , maximum_retries = None ):
7
+
8
+ self .__default_number_of_retries = 0
9
+ self .__maximum_allowed_number_of_retries = 5
10
+ self .__minimum_retry_time = timedelta (seconds = 1 )
11
+ self .__maximum_retry_time = timedelta (seconds = 10 )
12
+
13
+ if maximum_retries :
14
+ if maximum_retries < 0 :
15
+ raise ValueError ("maximumNumberOfRetries must be greater than 0" )
16
+ if maximum_retries > self .__maximum_allowed_number_of_retries :
17
+ raise ValueError ("The maximum number of allowed retries is " , self .__maximum_allowed_number_of_retries )
18
+ self .__maximum_number_of_retries = maximum_retries
19
+ else :
20
+ self .__maximum_number_of_retries = self .__default_number_of_retries
21
+
22
+ @property
23
+ def maximum_number_of_retries (self ):
24
+ return self .__maximum_number_of_retries
25
+
26
+ def get_next_wait_interval (self , number_of_attempts ):
27
+
28
+ interval = int (min (
29
+ ((self .__minimum_retry_time .seconds * 1000 ) + self .get_retry_delta (number_of_attempts )),
30
+ (self .__maximum_retry_time .seconds * 1000 )
31
+ ))
32
+
33
+ return timedelta (milliseconds = interval )
34
+
35
+ def get_retry_delta (self , number_of_attempts ):
36
+
37
+ minimum = (int )((timedelta (seconds = 1 ).seconds * 1000 ) * 0.8 )
38
+ maximum = (int )((timedelta (seconds = 1 ).seconds * 1000 ) * 1.2 )
39
+
40
+ return (int )((pow (2.0 , number_of_attempts ) - 1.0 ) * random .randint (minimum , maximum ))
0 commit comments