o
    Vfo                     @   s^   d dl Z d dlZd dlZd dlmZmZmZ e eZ	dd Z
G dd dZG dd dZdS )	    N)bucketstandard
throttlingc                 C   sz   t  }tjd| d}t jd|d}t|}tjt	 d}t
|||||d}| jjd|j | jjd|j |S )	Nr   )starting_max_rate
start_time   )max_rateclock)retry_event_adapter)rate_adjustorrate_clockertoken_bucketthrottling_detectorr	   zbefore-sendzneeds-retry)r   Clockr   CubicCalculatorcurrent_timeTokenBucketRateClockerr   ThrottlingErrorDetectorRetryEventAdapterClientRateLimitermetaeventsregisteron_sending_requeston_receiving_response)clientr	   r   r   r   r   limiter r   Z/home/ubuntu/oakencloud.com/venv/lib/python3.10/site-packages/botocore/retries/adaptive.pyregister_retry_handler
   s2   r    c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r   g       @c                 C   s2   || _ || _|| _|| _|| _d| _t | _d S )NF)	_rate_adjustor_rate_clocker_token_bucket_throttling_detector_clock_enabled	threadingLock_lock)selfr   r   r   r   r	   r   r   r   __init__)   s   zClientRateLimiter.__init__c                 K   s   | j r
| j  d S d S N)r&   r#   acquire)r*   requestkwargsr   r   r   r   9   s   z$ClientRateLimiter.on_sending_requestc                 K   s   | j  }| j }| jD | jjdi |s| j|}n!| j	s$|}nt
|| jj}| j||}td||| jj d| _	t
|| j| | j_W d    d S 1 sTw   Y  d S )NzfThrottling response received, new send rate: %s measured rate: %s, token bucket capacity available: %sTr   )r"   recordr%   r   r)   r$   is_throttling_errorr!   success_receivedr&   minr#   r   error_receivedloggerdebugavailable_capacity_MAX_RATE_ADJUST_SCALE)r*   r/   measured_rate	timestampnew_raterate_to_user   r   r   r   >   s0   



"z'ClientRateLimiter.on_receiving_responseN)__name__
__module____qualname__r8   r+   r   r   r   r   r   r   r   &   s
    r   c                   @   s<   e Zd ZdZdZdZeefddZdddZed	d
 Z	dS )r   z7Tracks the rate at which a client is sending a request.g?g      ?c                 C   sD   || _ d| _|| _t| j  | _d| j | _d| _	t
 | _d S )Nr   r   )r%   _measured_rate
_smoothingmathfloorr   _last_bucket_TIME_BUCKET_RANGE_time_bucket_scale_countr'   r(   r)   )r*   r	   	smoothingtime_bucket_ranger   r   r   r+   c   s   zRateClocker.__init__r   c                 C   s   | j E | j }t|| j | j }|  j|7  _|| jkr>| jt|| j  }|| j	 | j
d| j	   | _
d| _|| _| j
W  d    S 1 sKw   Y  d S )Nr   r   )r)   r%   r   rB   rC   rF   rG   rD   floatrA   r@   )r*   amounttr   current_rater   r   r   r0   q   s    

$zRateClocker.recordc                 C   s   | j S r,   )r@   )r*   r   r   r   r9      s   zRateClocker.measured_rateN)r   )
r=   r>   r?   __doc___DEFAULT_SMOOTHINGrE   r+   r0   propertyr9   r   r   r   r   r   \   s    

r   )loggingrB   r'   botocore.retriesr   r   r   	getLoggerr=   r5   r    r   r   r   r   r   r   <module>   s    
6