ó ątŚ_c@sœddlZddlZddlZddlmZddlmZddlmZejeƒZ d„Z de fd„ƒYZ de fd „ƒYZ dS( i’’’’N(tbucket(t throttling(tstandardc CsĆtjƒ}tjddd|jƒƒ}tjddd|ƒ}t|ƒ}tjdtj ƒƒ}t d|d |d |d |d|ƒ}|j j j d |jƒ|j j j d |jƒ|S(Ntstarting_max_rateit start_timetmax_rateitclocktretry_event_adaptert rate_adjustort rate_clockert token_buckettthrottling_detectors before-sends needs-retry(RtClockRtCubicCalculatort current_timet TokenBuckett RateClockerRtThrottlingErrorDetectortRetryEventAdaptertClientRateLimitertmetateventstregisterton_sending_requestton_receiving_response(tclientRRR R R tlimiter((sD/opt/awscli/lib/python2.7/site-packages/botocore/retries/adaptive.pytregister_retry_handler s$        RcBs)eZdZd„Zd„Zd„ZRS(g@cCsI||_||_||_||_||_t|_tjƒ|_ dS(N( t_rate_adjustort _rate_clockert _token_buckett_throttling_detectort_clocktFalset_enabledt threadingtLockt_lock(tselfRR R R R((sD/opt/awscli/lib/python2.7/site-packages/botocore/retries/adaptive.pyt__init__*s      cKs|jr|jjƒndS(N(R"Rtacquire(R&trequesttkwargs((sD/opt/awscli/lib/python2.7/site-packages/botocore/retries/adaptive.pyR4s c Ksā|jjƒ}|jjƒ}|jµ|jj|sUt}|jj |ƒ}ngt }|j sm|}nt ||j jƒ}|jj||ƒ}tjd|||j jƒt |_ t ||j|ƒ|j _WdQXdS(NsfThrottling response received, new send rate: %s measured rate: %s, token bucket capacity available: %s(RtrecordR RR%Rtis_throttling_errorR!Rtsuccess_receivedtTrueR"tminRRterror_receivedtloggertdebugtavailable_capacityt_MAX_RATE_ADJUST_SCALE(R&R*t measured_ratet timestampRtnew_ratet rate_to_use((sD/opt/awscli/lib/python2.7/site-packages/botocore/retries/adaptive.pyR9s$        (t__name__t __module__R4R'RR(((sD/opt/awscli/lib/python2.7/site-packages/botocore/retries/adaptive.pyR&s RcBsDeZdZdZdZeed„Zdd„Zed„ƒZRS(s7Tracks the rate at which a client is sending a request.gš™™™™™é?gą?cCsb||_d|_||_tj|jjƒƒ|_d|j|_d|_ t j ƒ|_ dS(Nii( R t_measured_ratet _smoothingtmathtfloorRt _last_buckett_TIME_BUCKET_RANGEt_time_bucket_scalet_countR#R$R%(R&Rt smoothingttime_bucket_range((sD/opt/awscli/lib/python2.7/site-packages/botocore/retries/adaptive.pyR'Xs    icCs¶|j§|jjƒ}tj||jƒ|j}|j|7_||jkr„|jt||jƒ}||j |j d|j |_ d|_||_n|j SWdQXdS(Nii( R%R RR=R>RARBR?tfloatR<R;(R&tamountttRt current_rate((sD/opt/awscli/lib/python2.7/site-packages/botocore/retries/adaptive.pyR+bs     cCs|jS(N(R;(R&((sD/opt/awscli/lib/python2.7/site-packages/botocore/retries/adaptive.pyR5ss( R9R:t__doc__t_DEFAULT_SMOOTHINGR@R'R+tpropertyR5(((sD/opt/awscli/lib/python2.7/site-packages/botocore/retries/adaptive.pyRQs (R=tloggingR#tbotocore.retriesRRRt getLoggerR9R1RtobjectRR(((sD/opt/awscli/lib/python2.7/site-packages/botocore/retries/adaptive.pyts    +