
    o                         S SK r S SKrS SKrS SKJrJrJr  \ R                  " \5      r	S r
 " S S5      r " S S5      rg)    N)bucketstandard
throttlingc                    [         R                  " 5       n[        R                  " SUR	                  5       S9n[         R
                  " SUS9n[        U5      n[        R                  " [        R                  " 5       S9n[        UUUUUS9nU R                  R                  R                  SUR                  5        U R                  R                  R                  SUR                  5        U$ )	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          ,lib/third_party/botocore/retries/adaptive.pyregister_retry_handlerr!   
   s    LLNE..(:(:(<M %%q>Lu%L"::$668  #!!/G KK"" KK%% N    c                   *    \ rS rSrSrS rS rS rSrg)r   &   g       @c                     Xl         X l        X0l        X@l        XPl        SU l        [        R                  " 5       U l        g )NF)	_rate_adjustor_rate_clocker_token_bucket_throttling_detector_clock_enabled	threadingLock_lock)selfr   r   r   r   r   s         r    __init__ClientRateLimiter.__init__)   s6     ,))$7!^^%
r"   c                 \    U R                   (       a  U R                  R                  5         g g N)r+   r(   acquire)r/   requestkwargss      r    r   $ClientRateLimiter.on_sending_request9   s     ==&&( r"   c                    U R                   R                  5       nU R                  R                  5       nU R                     U R
                  R                  " S0 UD6(       d  U R                  R                  U5      nOU R                  (       d  UnO[        X R                  R                  5      nU R                  R                  XS5      n[        R                  SUUU R                  R                   5        SU l	        [        X@R"                  U-  5      U R                  l        S S S 5        g ! , (       d  f       g = f)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/   r6   measured_rate	timestampnew_raterate_to_uses         r    r   'ClientRateLimiter.on_receiving_response>   s    **113KK,,.	ZZ,,@@J6J..??	J}}"/K"%%'9'9'B'B#K  ..== $ !&&99 !%*-55E+D'- ZZs   C&D00
D>)r*   r+   r.   r&   r'   r)   r(   N)	__name__
__module____qualname____firstlineno__rB   r0   r   r   __static_attributes__r9   r"   r    r   r   &   s     & )
r"   r   c                   H    \ rS rSrSrSrSr\\4S jrS
S jr\	S 5       r
Srg	)r   \   z7Tracks the rate at which a client is sending a request.g?g      ?c                     Xl         SU l        X l        [        R                  " U R                   R                  5       5      U l        SU R                  -  U l        SU l	        [        R                  " 5       U l        g )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    r0   RateClocker.__init__c   s\     # JJt{{'?'?'AB"#d&=&="=^^%
r"   c                    U R                      U R                  R                  5       n[        R                  " X R
                  -  5      U R
                  -  nU =R                  U-  sl        X0R                  :  aa  U R                  [        X0R                  -
  5      -  nX@R                  -  U R                  SU R                  -
  -  -   U l
        SU l        X0l        U R                  sS S S 5        $ ! , (       d  f       g = f)Nr	   r   )r.   r*   r   rR   rS   rV   rW   rT   floatrQ   rP   )r/   amounttr   current_rates        r    r:   RateClocker.recordq   s    ZZ((*A

16667))*  KK6!K)))#{{U6<M<M3M-NN'3oo'E''1t+>?'#  $*!&& ZZs   CC11
C?c                     U R                   $ r3   )rP   )r/   s    r    rC   RateClocker.measured_rate   s    """r"   )r*   rW   rT   r.   rP   rQ   rV   N)r	   )rH   rI   rJ   rK   __doc___DEFAULT_SMOOTHINGrU   r0   r:   propertyrC   rL   r9   r"   r    r   r   \   s7    A
 %,	&'" # #r"   r   )loggingrR   r,   botocore.retriesr   r   r   	getLoggerrH   r?   r!   r   r   r9   r"   r    <module>ri      s>       9 9			8	$83 3l(# (#r"   