@@ -21,7 +21,7 @@ import * as grpc from "@grpc/grpc-js";
2121import EventEmitter from "events" ;
2222import { ICreateSessionResult , SessionEvent , TableService } from "./table-session-pool" ;
2323import { Endpoint } from "../discovery" ;
24- import { retryable } from "../retries_obsoleted" ;
24+ import { retryable , RetryParameters , RetryStrategy } from "../retries_obsoleted" ;
2525import { MissingStatus , MissingValue , SchemeError , YdbError } from "../errors" ;
2626import { ResponseMetadataKeys } from "../constants" ;
2727import { pessimizable } from "../utils" ;
@@ -171,15 +171,21 @@ export class PrepareQuerySettings extends OperationParamsSettings {
171171}
172172
173173export class ExecuteQuerySettings extends OperationParamsSettings {
174- keepInCache : boolean = false ;
174+ keepInCache ? : boolean = false ;
175175 collectStats ?: Ydb . Table . QueryStatsCollection . Mode ;
176176 onResponseMetadata ?: ( metadata : grpc . Metadata ) => void ;
177+ idempotent : boolean = false ;
177178
178179 withKeepInCache ( keepInCache : boolean ) {
179180 this . keepInCache = keepInCache ;
180181 return this ;
181182 }
182183
184+ withIdempotent ( idempotent : boolean ) {
185+ this . idempotent = idempotent ;
186+ return this ;
187+ }
188+
183189 withCollectStats ( collectStats : Ydb . Table . QueryStatsCollection . Mode ) {
184190 this . collectStats = collectStats ;
185191 return this ;
@@ -258,6 +264,8 @@ export class ExecuteScanQuerySettings {
258264 }
259265}
260266
267+ let executeQueryRetryer : RetryStrategy ;
268+
261269export class TableSession extends EventEmitter implements ICreateSessionResult {
262270 private beingDeleted = false ;
263271 private free = true ;
@@ -518,7 +526,13 @@ export class TableSession extends EventEmitter implements ICreateSessionResult {
518526 if ( keepInCache ) {
519527 request . queryCachePolicy = { keepInCache} ;
520528 }
521- const response = await this . api . executeDataQuery ( request ) ;
529+
530+ if ( ! executeQueryRetryer ) executeQueryRetryer = new RetryStrategy ( 'TableSession:executeQuery' , new RetryParameters ( ) , this . logger ) ;
531+
532+ const response =
533+ settings ?. idempotent
534+ ? await executeQueryRetryer . retry ( ( ) => this . api . executeDataQuery ( request ) )
535+ : await this . api . executeDataQuery ( request ) ;
522536 const payload = getOperationPayload ( this . processResponseMetadata ( request , response , settings ?. onResponseMetadata ) ) ;
523537 return ExecuteQueryResult . decode ( payload ) ;
524538 }
0 commit comments