o .&a@srddlZddlZddlZddlmZddlmZddlmZeeZ ddZ Gddde Z Gd d d e Z dS) N)bucket) throttling)standardcCszt}tjd|d}tjd|d}t|}tjt d}t |||||d}|j j d|j|j j d|j|S) Nr)starting_max_rate start_time)max_rateclock)retry_event_adapter) rate_adjustor rate_clocker token_bucketthrottling_detectorr z before-sendz needs-retry)rClockrCubicCalculator current_time TokenBucket RateClockerrThrottlingErrorDetectorRetryEventAdapterClientRateLimitermetaeventsregisteron_sending_requeston_receiving_response)clientr r r r rlimiterr;/usr/lib/python3/dist-packages/botocore/retries/adaptive.pyregister_retry_handler s.r c@s(eZdZdZddZddZddZdS) rg@cCs2||_||_||_||_||_d|_t|_dS)NF) _rate_adjustor _rate_clocker _token_bucket_throttling_detector_clock_enabled threadingLock_lock)selfr r r rr rrr__init__*szClientRateLimiter.__init__cKs|jr |jdSdSN)r&r#acquire)r*requestkwargsrrrr4sz$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)r"recordr%rr)r$is_throttling_errorr!success_receivedr&minr#rerror_receivedloggerdebugavailable_capacity_MAX_RATE_ADJUST_SCALE)r*r/ measured_rate timestampnew_rate rate_to_userrrr9s(    "z'ClientRateLimiter.on_receiving_responseN)__name__ __module__ __qualname__r8r+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_countr'r(r))r*r smoothingtime_bucket_rangerrrr+Vs zRateClocker.__init__rcCs|jE|j}t||j|j}|j|7_||jkr>|jt||j}||j |j d|j |_ d|_||_|j WdS1sKwYdS)Nrr) r)r%rrBrCrFrGrDfloatrAr@)r*amounttr current_raterrrr0`s(  $zRateClocker.recordcCs|jSr,)r@)r*rrrr9qszRateClocker.measured_rateN)r) r=r>r?__doc___DEFAULT_SMOOTHINGrEr+r0propertyr9rrrrrOs r)rBloggingr'botocore.retriesrrr getLoggerr=r5r objectrrrrrrs    )