U vi,@sdZddlZddlmZmZddlmZddlmZddlmZddl m Z ddl m Z m Z dd lmZed ZGd d d e ZdS) z7Implementation for Retry strategy during HTTP requests.N)datetime timedelta) takewhilerandom)Callable)Retry) MaxRetryError ResponseError) InfluxDBErrorz"influxdb_client.client.write.retrycszeZdZdZdeegefdfd d Zfd d ZdddZ ddZ fddZ dfdd Z ddZ ddZZS) WritesRetrya Writes retry configuration. The next delay is computed as random value between range `retry_interval * exponential_base^(attempts-1)` and `retry_interval * exponential_base^(attempts) Example: for retry_interval=5, exponential_base=2, max_retry_delay=125, total=5 retry delays are random distributed values within the ranges of [5-10, 10-20, 20-40, 40-80, 80-125] r}N)retry_callbackc  sPtjf|||_||_||_||_||_||_t t |d|_ ||_ dS)a Initialize defaults. :param int jitter_interval: random milliseconds when retrying writes :param num max_retry_delay: maximum delay when retrying write in seconds :param int max_retry_time: maximum total retry timeout in seconds, attempt after this timout throws MaxRetryError :param int total: maximum number of retries :param num retry_interval: initial first retry delay range in seconds :param int exponential_base: base for the exponential retry delay, :param Callable[[Exception], int] retry_callback: the callable ``callback`` to run after retryable error occurred. The callable must accept one argument: - `Exception`: an retryable error )secondsN) super__init__jitter_intervaltotalretry_intervalmax_retry_delaymax_retry_timeexponential_basernowr retry_timeoutr) selfrrrrrrrkw __class__S/opt/alt/python38/lib/python3.8/site-packages/influxdb_client/client/write/retry.pyrszWritesRetry.__init__c sd|kr|j|d<d|kr$|j|d<d|kr6|j|d<d|krH|j|d<d|krZ|j|d<d|krl|j|d<tjf|}|j|_|S)zInitialize defaults.rrrrrr) rrrrrrrnewr)rrr#rr!r"r#9s      zWritesRetry.newFcCs||sdS|jo|dkS)z]is_retry doesn't require retry_after header. If there is not Retry-After we will use backoff.Fi)_is_method_retryabler)rmethod status_codehas_retry_afterr!r!r"is_retryLs zWritesRetry.is_retrycCstttddt|j}|d8}|dkr0dS|j}|j|j}d}||krr|d7}|}||j}||jkrFqrqF||jkr|j}||||S)zTVariant of exponential backoff with initial and max delay and a random jitter delay.cSs |jdkSN)redirect_location)xr!r!r"Xz.WritesRetry.get_backoff_time..r) lenlistrreversedhistoryrrr_random)rconsecutive_errors_lenZ range_startZ range_stopir!r!r"get_backoff_timeSs(    zWritesRetry.get_backoff_timecs t|}|r||7}|S)zCGet the value of Retry-After header and append random jitter delay.)rget_retry_after _jitter_delay)rresponse retry_afterrr!r"r7ps  zWritesRetry.get_retry_afterc s|jtkr"t|||ptdt||||||}|dk rLt|d}n|dk rZ|}n d|}d|d} t|tr| d|j d7} |j r| |t | |S) z:Return a new Retry object with incremented retry counters.zmax_retry_time exceededN)r9zFailed request to: z6The retriable error occurred during request. Reason: 'z'.z Retry in zs.) rrrr r r incrementr isinstancer:rloggerwarning) rr%urlr9error_pool _stacktrace new_retryZ parsed_errormessagerr!r"r;ws      zWritesRetry.incrementcCs |jtSr))rrrr!r!r"r8szWritesRetry._jitter_delaycCstSr)rrEr!r!r"r3szWritesRetry._random)rr rrrrN)F)NNNNNN)__name__ __module__ __qualname____doc__r Exceptionintrr#r(r6r7r;r8r3 __classcell__r!r!rr"r s     r )rIloggingrr itertoolsrrtypingrurllib3rZurllib3.exceptionsr r Z!influxdb_client.client.exceptionsr getLoggerr=r r!r!r!r"s