@@ -51,7 +51,7 @@ def __init__(self,
5151 retry_max_attempts = 4 ,
5252 retry_first_delay = 15 ,
5353 retry_random_delay = 5 ,
54- timeout_seconds = 60 .0 ,
54+ timeout_seconds = 120 .0 ,
5555 throttle_actions = 10 ,
5656 throttle_commands = 10 ,
5757 user_agent = None ,
@@ -369,42 +369,49 @@ def call():
369369 def call ():
370370 return self .session .get (self .endpoint + path , auth = self .auth , timeout = self .timeout )
371371
372- total_time = wait_time = 0
372+ total_time = 0
373373 result = None
374374 for num_attempts in range (1 , self .retry_max_attempts + 1 ):
375- if wait_time > 0 :
376- sleep (wait_time )
377- total_time += wait_time
378- wait_time = 0
379375 try :
380376 result = call ()
377+ if result .status_code == 200 :
378+ return result
379+ elif result .status_code in [429 , 502 , 503 , 504 ]:
380+ if self .logger : self .logger .warning ("UMAPI timeout...service unavailable (code %d on try %d)" ,
381+ result .status_code , num_attempts )
382+ retry_wait = 0
383+ if "Retry-After" in result .headers :
384+ advice = result .headers ["Retry-After" ]
385+ advised_time = parsedate_tz (advice )
386+ if advised_time is not None :
387+ # header contains date
388+ retry_wait = int (mktime_tz (advised_time ) - time ())
389+ else :
390+ # header contains delta seconds
391+ retry_wait = int (advice )
392+ if retry_wait <= 0 :
393+ # use exponential back-off with random delay
394+ delay = randint (0 , self .retry_random_delay )
395+ retry_wait = (int (pow (2 , num_attempts - 1 )) * self .retry_first_delay ) + delay
396+ elif 201 <= result .status_code < 400 :
397+ raise ClientError ("Unexpected HTTP Status {:d}: {}" .format (result .status_code , result .text ), result )
398+ elif 400 <= result .status_code < 500 :
399+ raise RequestError (result )
400+ else :
401+ raise ServerError (result )
381402 except requests .Timeout :
382403 total_time += int (self .timeout )
383- raise UnavailableError (num_attempts , total_time , result )
384- if result .status_code == 200 :
385- return result
386- elif result .status_code in [429 , 502 , 503 , 504 ]:
387- if self .logger : self .logger .warning ("UMAPI timeout...service unavailable (code %d on try %d)" ,
388- result .status_code , num_attempts )
389- if "Retry-After" in result .headers :
390- advice = result .headers ["Retry-After" ]
391- advised_time = parsedate_tz (advice )
392- if advised_time is not None :
393- # header contains date
394- wait_time = int (mktime_tz (advised_time ) - time ())
395- else :
396- # header contains delta seconds
397- wait_time = int (advice )
398- if wait_time <= 0 :
399- # use exponential back-off with random delay
400- delay = randint (0 , self .retry_random_delay )
401- wait_time = (int (pow (2 , num_attempts )) * self .retry_first_delay ) + delay
402- if self .logger : self .logger .warning ("Next retry in %d seconds..." , wait_time )
403- elif 201 <= result .status_code < 400 :
404- raise ClientError ("Unexpected HTTP Status {:d}: {}" .format (result .status_code , result .text ), result )
405- elif 400 <= result .status_code < 500 :
406- raise RequestError (result )
407- else :
408- raise ServerError (result )
409- if self .logger : self .logger .error ("UMAPI timeout...giving up after %d attempts." , self .retry_max_attempts )
404+ if self .logger : self .logger .warning ("UMAPI connection timeout...(%d seconds on try %d)" ,
405+ self .timeout , num_attempts )
406+ retry_wait = 0
407+ result = None
408+ if num_attempts < self .retry_max_attempts :
409+ if retry_wait > 0 :
410+ if self .logger : self .logger .warning ("Next retry in %d seconds..." , retry_wait )
411+ sleep (retry_wait )
412+ total_time += retry_wait
413+ else :
414+ if self .logger : self .logger .warning ("Immediate retry..." , retry_wait )
415+ if self .logger : self .logger .error ("UMAPI timeout...giving up after %d attempts (%d seconds)." ,
416+ self .retry_max_attempts , total_time )
410417 raise UnavailableError (self .retry_max_attempts , total_time , result )
0 commit comments