123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406 |
- <?php
- namespace YdbPlatform\Ydb\Test;
- use YdbPlatform\Ydb\Auth\Implement\AnonymousAuthentication;
- use YdbPlatform\Ydb\Exception;
- use YdbPlatform\Ydb\Exceptions\Grpc\AbortedException;
- use YdbPlatform\Ydb\Exceptions\Grpc\AlreadyExistsException;
- use YdbPlatform\Ydb\Exceptions\Grpc\CanceledException;
- use YdbPlatform\Ydb\Exceptions\Grpc\DataLossException;
- use YdbPlatform\Ydb\Exceptions\Grpc\DeadlineExceededException;
- use YdbPlatform\Ydb\Exceptions\Grpc\FailedPreconditionException;
- use YdbPlatform\Ydb\Exceptions\Grpc\InternalException;
- use YdbPlatform\Ydb\Exceptions\Grpc\InvalidArgumentException;
- use YdbPlatform\Ydb\Exceptions\Grpc\NotFoundException;
- use YdbPlatform\Ydb\Exceptions\Grpc\OutOfRangeException;
- use YdbPlatform\Ydb\Exceptions\Grpc\ResourceExhaustedException;
- use YdbPlatform\Ydb\Exceptions\Grpc\UnavailableException;
- use YdbPlatform\Ydb\Exceptions\Grpc\UnimplementedException;
- use YdbPlatform\Ydb\Exceptions\Grpc\UnknownException;
- use YdbPlatform\Ydb\Exceptions\Ydb\BadRequestException;
- use YdbPlatform\Ydb\Exceptions\Ydb\InternalErrorException;
- use YdbPlatform\Ydb\Exceptions\Ydb\StatusCodeUnspecified;
- use YdbPlatform\Ydb\Exceptions\Ydb\UnauthorizedException;
- use YdbPlatform\Ydb\Logger\SimpleStdLogger;
- use YdbPlatform\Ydb\Retry\Backoff;
- use YdbPlatform\Ydb\Retry\RetryParams;
- use YdbPlatform\Ydb\Table;
- use YdbPlatform\Ydb\Ydb;
- use YdbPlatform\Ydb\Retry\Retry;
- class RetrySubclass extends Retry{
- public function canRetry(\Exception $e, bool $idempotent)
- {
- return parent::canRetry($e, $idempotent);
- }
- public function backoffType(string $e): Backoff
- {
- return parent::backoffType($e);
- }
- }
- class TableSubclass extends Table{
- public function deleteSession(string $exception): bool
- {
- return parent::deleteSession($exception);
- }
- }
- class RetryParamsTest extends \PHPUnit\Framework\TestCase
- {
- protected const FAST = 5;
- protected const SLOW = 20;
- protected const BACKOFF_TYPE = [
- 0 => "noBackoff",
- self::FAST => "fastBackoff",
- self::SLOW => "slowBackoff"
- ];
- protected $errsToCheck = [
- [
- "class" => DeadlineExceededException::class,
- "deleteSession" => true,
- "backoffTime" => self::FAST,
- "retry" => [
- "idempotent" => true,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => CanceledException::class,
- "deleteSession" => true,
- "backoffTime" => self::FAST,
- "retry" => [
- "idempotent" => true,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => UnknownException::class,
- "deleteSession" => true,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => InvalidArgumentException::class,
- "deleteSession" => true,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => NotFoundException::class,
- "deleteSession" => true,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => AlreadyExistsException::class,
- "deleteSession" => true,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => ResourceExhaustedException::class,
- "deleteSession" => false,
- "backoffTime" => self::SLOW,
- "retry" => [
- "idempotent" => true,
- "nonIdempotent" => true
- ]
- ],
- [
- "class" => FailedPreconditionException::class,
- "deleteSession" => true,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => AbortedException::class,
- "deleteSession" => true,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => true,
- "nonIdempotent" => true
- ]
- ],
- [
- "class" => OutOfRangeException::class,
- "deleteSession" => false,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => UnimplementedException::class,
- "deleteSession" => true,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => InternalException::class,
- "deleteSession" => true,
- "backoffTime" => self::FAST,
- "retry" => [
- "idempotent" => true,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => UnavailableException::class,
- "deleteSession" => true,
- "backoffTime" => self::FAST,
- "retry" => [
- "idempotent" => true,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => DataLossException::class,
- "deleteSession" => true,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => DataLossException::class,
- "deleteSession" => true,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => StatusCodeUnspecified::class,
- "deleteSession" => true,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => BadRequestException::class,
- "deleteSession" => false,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => UnauthorizedException::class,
- "deleteSession" => false,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => InternalErrorException::class,
- "deleteSession" => false,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\AbortedException::class,
- "deleteSession" => false,
- "backoffTime" => self::FAST,
- "retry" => [
- "idempotent" => true,
- "nonIdempotent" => true
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\UnavailableException::class,
- "deleteSession" => false,
- "backoffTime" => self::FAST,
- "retry" => [
- "idempotent" => true,
- "nonIdempotent" => true
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\OverloadedException::class,
- "deleteSession" => false,
- "backoffTime" => self::SLOW,
- "retry" => [
- "idempotent" => true,
- "nonIdempotent" => true
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\SchemeErrorException::class,
- "deleteSession" => false,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\GenericErrorException::class,
- "deleteSession" => false,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\TimeoutException::class,
- "deleteSession" => false,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\BadSessionException::class,
- "deleteSession" => true,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => true,
- "nonIdempotent" => true
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\PreconditionFailedException::class,
- "deleteSession" => false,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\AlreadyExistsException::class,
- "deleteSession" => false,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\NotFoundException::class,
- "deleteSession" => false,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\SessionExpiredException::class,
- "deleteSession" => true,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\CancelledException::class,
- "deleteSession" => false,
- "backoffTime" => self::FAST,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\UndeterminedException::class,
- "deleteSession" => false,
- "backoffTime" => self::FAST,
- "retry" => [
- "idempotent" => true,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\UnsupportedException::class,
- "deleteSession" => false,
- "backoffTime" => 0,
- "retry" => [
- "idempotent" => false,
- "nonIdempotent" => false
- ]
- ],
- [
- "class" => \YdbPlatform\Ydb\Exceptions\Ydb\SessionBusyException::class,
- "deleteSession" => true,
- "backoffTime" => self::FAST,
- "retry" => [
- "idempotent" => true,
- "nonIdempotent" => true
- ]
- ],
- ];
- public function testBackoffTypesAndDeleteSessionOnException(){
- $retryParams = new RetryParams(1000, new Backoff(6,self::FAST),
- new Backoff(6,self::SLOW));
- $logger = new SimpleStdLogger(7);
- $retry = (new RetrySubclass($logger))->withParams($retryParams);
- $table = new TableSubclass(new Ydb(["credentials"=>new AnonymousAuthentication()]), $logger, $retry);
- foreach ($this->errsToCheck as $error) {
- $exception = new $error["class"]();
- $resultDeleteSession = $table->deleteSession($error["class"]) ? "true" : "false";
- $wantDeleteSession = $error["deleteSession"] ? "true" : "false";
- self::assertEquals($wantDeleteSession, $resultDeleteSession,
- "{$error["class"]}: unexpected delete session status: $resultDeleteSession, want: $wantDeleteSession");
- $resultRetryIdempotent = $retry->canRetry($exception, true) ? "true" : "false";
- $wantRetryIdempotent = $error["retry"]["idempotent"] ? "true" : "false";
- self::assertEquals($wantRetryIdempotent, $resultRetryIdempotent,
- "{$error["class"]}: unexpected must retry idempotent operation status: $resultRetryIdempotent, want: $wantRetryIdempotent");
- $resultRetryNonIdempotent = $retry->canRetry($exception, false) ? "true" : "false";
- $wantRetryNonIdempotent = $error["retry"]["nonIdempotent"] ? "true" : "false";
- self::assertEquals($wantRetryNonIdempotent, $resultRetryNonIdempotent,
- "{$error["class"]}: unexpected must retry non-idempotent operation status: $resultDeleteSession, want: $wantDeleteSession");
- if($error["retry"]["idempotent"]){
- $resultBackoff = $retry->backoffType($error["class"])->getBackoffSlotMillis();
- $wantBackoff = $error["backoffTime"];
- self::assertEquals($wantBackoff, $resultBackoff,
- "{$error["class"]}: unexpected backoff type: ".
- self::BACKOFF_TYPE[$resultBackoff].", want: ".
- self::BACKOFF_TYPE[$wantBackoff]);
- }
- }
- }
- }
|