o ?cp@s^ddlZddlZddlZddlmZmZmZeeZ ddZ GdddZ GdddZ dS) N)bucketstandard throttlingcCszt}tjd|d}tjd|d}t|}tjt d}t |||||d}|j j d|j|j j d|j|S) Nr)Zstarting_max_rate start_time)max_rateclock)Zretry_event_adapter) rate_adjustor rate_clocker token_bucketthrottling_detectorrz before-sendz needs-retry)rZClockrZCubicCalculator current_timeZ TokenBucket RateClockerrZThrottlingErrorDetectorZRetryEventAdapterClientRateLimitermetaeventsregisteron_sending_requeston_receiving_response)clientrr r r r Zlimiterrt/private/var/folders/cw/wlscbxl13mj6wd668h7l9g9sllkg5j/T/pip-target-b31awkwq/lib/python/botocore/retries/adaptive.pyregister_retry_handler s2rc@s(eZdZdZddZddZddZdS) rg@cCs2||_||_||_||_||_d|_t|_dS)NF) _rate_adjustor _rate_clocker _token_bucket_throttling_detector_clock_enabled threadingLock_lock)selfr r r r rrrr__init__*szClientRateLimiter.__init__cKs|jr |jdSdSN)rracquire)r"requestkwargsrrrr:sz$ClientRateLimiter.on_sending_requestcKs|j}|j}|jD|jjdi|s|j|}n!|j s$|}nt ||j j }|j ||}td|||j jd|_ t ||j||j _ WddS1sTwYdS)NzfThrottling response received, new send rate: %s measured rate: %s, token bucket capacity available: %sTr)rrecordrr r!rZis_throttling_errorrZsuccess_receivedrminrrerror_receivedloggerdebugZavailable_capacity_MAX_RATE_ADJUST_SCALE)r"r' measured_rate timestampZnew_rateZ rate_to_userrrr?s0    "z'ClientRateLimiter.on_receiving_responseN)__name__ __module__ __qualname__r-r#rrrrrrr&s  rc@s<eZdZdZdZdZeefddZd ddZed d Z d S) rz7Tracks the rate at which a client is sending a request.g?g?cCsD||_d|_||_t|j|_d|j|_d|_ t |_ dS)Nrr) r_measured_rate _smoothingmathfloorr _last_bucket_TIME_BUCKET_RANGE_time_bucket_scale_countrr r!)r"rZ smoothingZtime_bucket_rangerrrr#ds zRateClocker.__init__rcCs|jE|j}t||j|j}|j|7_||jkr>|jt||j}||j |j d|j |_ d|_||_|j WdS1sKwYdS)Nrr) r!rr r5r6r9r:r7floatr4r3)r"amounttrZ current_raterrrr(rs   $zRateClocker.recordcCs|jSr$)r3)r"rrrr.szRateClocker.measured_rateN)r) r0r1r2__doc__Z_DEFAULT_SMOOTHINGr8r#r(propertyr.rrrrr]s r) loggingr5rZbotocore.retriesrrr getLoggerr0r+rrrrrrrs 7