
    /Jfo                         d dl Z d dlZd dlZd dlmZmZmZ  e j        e          Z	d Z
 G d d          Z G d d          ZdS )    N)bucketstandard
throttlingc                    t          j                    }t          j        d|                                          }t          j        d|          }t          |          }t          j        t          j	                              }t          |||||          }| 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   limiters          \/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/botocore/retries/adaptive.pyregister_retry_handlerr!   
   s    LNNE.(:(:(<(<  M %q>>>Lu%%L":$688    #!!/  G K"   K%   N    c                   $    e Zd ZdZd Zd Zd ZdS )r   g       @c                     || _         || _        || _        || _        || _        d| _        t          j                    | _        d S )NF)	_rate_adjustor_rate_clocker_token_bucket_throttling_detector_clock_enabled	threadingLock_lock)selfr   r   r   r   r   s         r    __init__zClientRateLimiter.__init__)   sE     ,))$7!^%%


r"   c                 J    | j         r| j                                         d S d S N)r*   r'   acquire)r.   requestkwargss      r    r   z$ClientRateLimiter.on_sending_request9   s1    = 	)&&(((((	) 	)r"   c                 "   | j                                         }| j                                        }| j        5   | j        j        di |s| j                            |          }nm| j	        s|}nt          || j        j                  }| j                            ||          }t                              d||| j        j                   d| _	        t          || j        |z            | j        _        d d d            d S # 1 swxY w Y   d S )NzfThrottling response received, new send rate: %s measured rate: %s, token bucket capacity available: %sT )r&   recordr)   r   r-   r(   is_throttling_errorr%   success_receivedr*   minr'   r
   error_receivedloggerdebugavailable_capacity_MAX_RATE_ADJUST_SCALE)r.   r4   measured_rate	timestampnew_raterate_to_uses         r    r   z'ClientRateLimiter.on_receiving_response>   sn   *1133K,,..	Z 	 	@4,@JJ6JJ %.??	JJ} "/KK"%%t'9'B# #K  .==  $ !&9   !%*-$5E+ +D'-	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   B=DDDN)__name__
__module____qualname__r?   r/   r   r   r6   r"   r    r   r   &   sG         & & & ) ) )
    r"   r   c                   D    e Zd ZdZdZdZeefdZd	dZed             Z	dS )
r   z7Tracks the rate at which a client is sending a request.g?g      ?c                     || _         d| _        || _        t          j        | j                                                   | _        d| j        z  | _        d| _	        t          j                    | _        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_ranges       r    r/   zRateClocker.__init__c   sd     # Jt{'?'?'A'ABB"#d&="=^%%


r"   r	   c                    | j         5  | j                                        }t          j        || j        z            | j        z  }| xj        |z  c_        || j        k    rO| j        t          || j        z
            z  }|| j	        z  | j
        d| j	        z
  z  z   | _
        d| _        || _        | j
        cd d d            S # 1 swxY w Y   d S )Nr	   r   )r-   r)   r   rK   rL   rO   rP   rM   floatrJ   rI   )r.   amounttr   current_rates        r    r7   zRateClocker.recordq   s   Z 	' 	'((**A
1t6677)*  KK6!KK)))#{U6D<M3M-N-NN'3do'E'1t+>?'#  $*!&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	's   B.CC
Cc                     | j         S r1   )rI   )r.   s    r    r@   zRateClocker.measured_rate   s    ""r"   N)r	   )
rD   rE   rF   __doc___DEFAULT_SMOOTHINGrN   r/   r7   propertyr@   r6   r"   r    r   r   \   sq        AA
 %,	& & & &' ' ' '" # # X# # #r"   r   )loggingrK   r+   botocore.retriesr   r   r   	getLoggerrD   r<   r!   r   r   r6   r"   r    <module>r_      s          9 9 9 9 9 9 9 9 9 9		8	$	$  83 3 3 3 3 3 3 3l(# (# (# (# (# (# (# (# (# (#r"   