"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]); } } } }