File: //opt/saltstack/salt/lib/python3.10/site-packages/libcloud/utils/__pycache__/retry.cpython-310.pyc
o
;j� � @ s� d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZ d dlm Z d dl
mZ ddgZe�
e�ZdZG d d
� d
e j�ZdZdZdZeejeje je jefZG d
d� d�ZG dd� de�ZG dd� de�ZdS )� N)�datetime� timedelta��wraps)�httplib)�RateLimitReachedError�Retry�RetryForeverOnRateLimitErrorzThe read operation timed outc @ s e Zd ZdZdS )�TransientSSLErrorz-Represent transient SSL errors, e.g. timeoutsN)�__name__�
__module__�__qualname__�__doc__� r r �H/opt/saltstack/salt/lib/python3.10/site-packages/libcloud/utils/retry.pyr
% s r
� � c @ s, e Zd Zeeefdd�Zdd� Zdd� ZdS )�MinimalRetryc C sD |du rt }|du rt}|du rt}t|d�}|| _|| _|| _dS )a�
Wrapper around retrying that helps to handle common transient
exceptions.
This minimalistic version only retries SSL errors and rate limiting.
:param retry_delay: retry delay between the attempts.
:param timeout: maximum time to wait.
:param backoff: multiplier added to delay between attempts.
:Example:
retry_request = MinimalRetry(timeout=1, retry_delay=1, backoff=1)
retry_request(self.connection.request)()
Nr )�
DEFAULT_DELAY�DEFAULT_TIMEOUT�DEFAULT_BACKOFF�max�retry_delay�timeout�backoff)�selfr r r r r r �__init__; s
zMinimalRetry.__init__c �$ dd� �t � �� ��fdd��}|S )Nc
_ �F z| |i |��W S t jy" } z
tt|�v rt|j� �|�d }~ww �N��ssl�SSLError�TRANSIENT_SSL_ERROR�strr
�args��functionr% �kwargs�excr r r �transform_ssl_error_ �
��z2MinimalRetry.__call__.<locals>.transform_ssl_errorc
s� �j }t�� t�jd� }d }t�� |k rhz�� g| �R i |��W S tya } z4|}t|t�rFt� d� |j
r;|j
nd}t�|� �j }n��
|�rVt�|� |�j9 }n� W Y d }~nd }~ww t�� |k s|�)N��secondsz*You are being rate limited, backing off...� )r r �nowr r � Exception�
isinstancer �_logger�debug�retry_after�time�sleep�should_retryr )r% r( �
current_delay�end�last_excr) r4 ��funcr r* r r �
retry_looph s*
���z)MinimalRetry.__call__.<locals>.retry_loopr �r r<