
                         L    S r SSKrSSKrSSKJr   " S S5      r " S S5      rg)zEThis module implements token buckets used for client side throttling.    N)CapacityNotAvailableErrorc                   &    \ rS rSrS rS rS rSrg)Clock   c                     g N selfs    *lib/third_party/botocore/retries/bucket.py__init__Clock.__init__	   s        c                 0    [         R                  " U5        g r   )timesleepr   amounts     r   r   Clock.sleep   s    

6r   c                 ,    [         R                   " 5       $ r   )r   r
   s    r   current_timeClock.current_time   s    yy{r   r	   N)__name__
__module____qualname____firstlineno__r   r   r   __static_attributes__r	   r   r   r   r      s    r   r   c                       \ rS rSrSr\4S jr\S 5       r\R                  S 5       r\S 5       r	\S 5       r
SS jrS	 rS
 rS rSrg)TokenBucket   g      ?c                     S U l         S U l        SU l        X l        S U l        X0l        [        R                  " 5       U l        [        R                  " U R                  5      U l
        Xl        g )Nr   )
_fill_rate_max_capacity_current_capacity_clock_last_timestamp	_min_rate	threadingLock_lock	Condition_new_fill_rate_conditionmax_rate)r   r-   clockmin_rates       r   r   TokenBucket.__init__   sU    !!"#!^^%
(1(;(;DJJ(G% r   c                     U R                   $ r   )r"   r
   s    r   r-   TokenBucket.max_rate!   s    r   c                 J   U R                      U R                  5         [        XR                  5      U l        US:  a  Xl        OSU l        [        U R                  U R
                  5      U l        U R                   R                  5         S S S 5        g ! , (       d  f       g = f)N   )	r,   _refillmaxr'   r"   r#   minr$   notify)r   values     r   r-   r2   %   s{    ** LLN!%8DOz%*"%&" &)&&(:(:&D" ))002# +**s   A>B
B"c                     U R                   $ r   )r#   r
   s    r   max_capacityTokenBucket.max_capacity:   s    !!!r   c                     U R                   $ r   )r$   r
   s    r   available_capacityTokenBucket.available_capacity>   s    %%%r   c                 n    U R                      U R                  XS9sSSS5        $ ! , (       d  f       g= f)a"  Acquire token or return amount of time until next token available.

If block is True, then this method will block until there's sufficient
capacity to acquire the desired amount.

If block is False, then this method will return True is capacity
was successfully acquired, False otherwise.

)r   blockN)r,   _acquire)r   r   rA   s      r   acquireTokenBucket.acquireB   s'     **===< +**s   &
4c                 p   U R                  5         XR                  ::  a  U =R                  U-  sl        gU(       d
  [        5       eU R                  U5      nUS:  aD  U R                  R                  U5        U R                  5         U R                  U5      nUS:  a  MD  U =R                  U-  sl        g)NTr   )r5   r$   r   _sleep_amountr,   wait)r   r   rA   sleep_amounts       r   rB   TokenBucket._acquireO   s    +++""f,"/11--f5L" --22<@#11&9 " ""f,"r   c                 8    XR                   -
  U R                  -  $ r   )r$   r"   r   s     r   rF   TokenBucket._sleep_amountf   s    ///4??BBr   c                     U R                   R                  5       nU R                  c  Xl        g U R                  nXR                  -
  U R                  -  n[        U R                  X#-   5      nX@l        Xl        g r   )r%   r   r&   r$   r"   r7   r#   )r   	timestampcurrent_capacityfill_amountnew_capacitys        r   r5   TokenBucket._refilli   sn    KK,,.	'#, 11 #7#774??J4--/?/MN!-(r   )	r%   r$   r"   r&   r*   r#   r'   r,   r-   N)r4   T)r   r   r   r   	_MIN_RATEr   propertyr-   setterr;   r>   rC   rB   rF   r5   r   r	   r   r   r   r      sx    I1: 	!   __3 3( " " & &=.C	)r   r   )__doc__r(   r   botocore.exceptionsr   r   r   r	   r   r   <module>rW      s'    K   9 _) _)r   