diff options
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/Retry/QuotaManager.php')
-rw-r--r-- | vendor/aws/aws-sdk-php/src/Retry/QuotaManager.php | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/Retry/QuotaManager.php b/vendor/aws/aws-sdk-php/src/Retry/QuotaManager.php new file mode 100644 index 0000000..02e9fcd --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Retry/QuotaManager.php @@ -0,0 +1,86 @@ +<?php +namespace Aws\Retry; + +use Aws\Exception\AwsException; +use Aws\ResultInterface; + +/** + * @internal + */ +class QuotaManager +{ + private $availableCapacity; + private $capacityAmount; + private $initialRetryTokens; + private $maxCapacity; + private $noRetryIncrement; + private $retryCost; + private $timeoutRetryCost; + + public function __construct($config = []) + { + $this->initialRetryTokens = isset($config['initial_retry_tokens']) + ? $config['initial_retry_tokens'] + : 500; + $this->noRetryIncrement = isset($config['no_retry_increment']) + ? $config['no_retry_increment'] + : 1; + $this->retryCost = isset($config['retry_cost']) + ? $config['retry_cost'] + : 5; + $this->timeoutRetryCost = isset($config['timeout_retry_cost']) + ? $config['timeout_retry_cost'] + : 10; + $this->maxCapacity = $this->initialRetryTokens; + $this->availableCapacity = $this->initialRetryTokens; + } + + public function hasRetryQuota($result) + { + if ($result instanceof AwsException && $result->isConnectionError()) { + $this->capacityAmount = $this->timeoutRetryCost; + } else { + $this->capacityAmount = $this->retryCost; + } + + if ($this->capacityAmount > $this->availableCapacity) { + return false; + } + + $this->availableCapacity -= $this->capacityAmount; + return true; + } + + public function releaseToQuota($result) + { + if ($result instanceof AwsException) { + $statusCode = (int) $result->getStatusCode(); + } elseif ($result instanceof ResultInterface) { + $statusCode = isset($result['@metadata']['statusCode']) + ? (int) $result['@metadata']['statusCode'] + : null; + } + + if (!empty($statusCode) && $statusCode >= 200 && $statusCode < 300) { + if (isset($this->capacityAmount)) { + $amount = $this->capacityAmount; + $this->availableCapacity += $amount; + unset($this->capacityAmount); + } else { + $amount = $this->noRetryIncrement; + $this->availableCapacity += $amount; + } + $this->availableCapacity = min( + $this->availableCapacity, + $this->maxCapacity + ); + } + + return (isset($amount) ? $amount : 0); + } + + public function getAvailableCapacity() + { + return $this->availableCapacity; + } +} |