@@ -118,7 +118,7 @@ class TPoolResolverActor : public TActorBootstrapped<TPoolResolverActor> {
118
118
119
119
class TPoolFetcherActor : public TSchemeActorBase <TPoolFetcherActor> {
120
120
public:
121
- TPoolFetcherActor (const NActors:: TActorId& replyActorId, const TString& database, const TString& poolId, TIntrusiveConstPtr<NACLib::TUserToken> userToken, bool enableOnServerless)
121
+ TPoolFetcherActor (const TActorId& replyActorId, const TString& database, const TString& poolId, TIntrusiveConstPtr<NACLib::TUserToken> userToken, bool enableOnServerless)
122
122
: ReplyActorId(replyActorId)
123
123
, Database(database)
124
124
, PoolId(poolId)
@@ -294,19 +294,16 @@ class TPoolCreatorActor : public TSchemeActorBase<TPoolCreatorActor> {
294
294
return ;
295
295
}
296
296
297
- PipeClientClosedByUs = true ;
298
- SchemePipeActorId = {};
299
- NTabletPipe::CloseClient (SelfId (), SchemePipeActorId);
300
-
297
+ ClosePipeClient ();
301
298
ScheduleRetry (TStringBuilder () << " Tablet to pipe not connected: " << NKikimrProto::EReplyStatus_Name (ev->Get ()->Status ));
302
299
}
303
300
304
- void HandleClientDestroyed () {
305
- SchemePipeActorId = {};
306
- if (!PipeClientClosedByUs) {
301
+ void Handle (TEvTabletPipe::TEvClientDestroyed::TPtr& ev) {
302
+ const TActorId clientId = ev->Get ()->ClientId ;
303
+ if (!ClosedSchemePipeActors.contains (clientId)) {
304
+ ClosePipeClient ();
307
305
ScheduleRetry (" Tablet to pipe destroyed" );
308
306
}
309
- PipeClientClosedByUs = false ;
310
307
}
311
308
312
309
void HandleNotifyTxCompletionResult () {
@@ -317,7 +314,7 @@ class TPoolCreatorActor : public TSchemeActorBase<TPoolCreatorActor> {
317
314
switch (ev->GetTypeRewrite ()) {
318
315
hFunc (TEvTxUserProxy::TEvProposeTransactionStatus, Handle )
319
316
hFunc (TEvTabletPipe::TEvClientConnected, Handle )
320
- sFunc (TEvTabletPipe::TEvClientDestroyed, HandleClientDestroyed )
317
+ hFunc (TEvTabletPipe::TEvClientDestroyed, Handle )
321
318
sFunc (NSchemeShard::TEvSchemeShard::TEvNotifyTxCompletionResult, HandleNotifyTxCompletionResult)
322
319
IgnoreFunc (NSchemeShard::TEvSchemeShard::TEvNotifyTxCompletionRegistered)
323
320
@@ -358,11 +355,10 @@ class TPoolCreatorActor : public TSchemeActorBase<TPoolCreatorActor> {
358
355
void SubscribeOnTransactionOrRetry (NTxProxy::TResultStatus::EStatus status, const NKikimrTxUserProxy::TEvProposeTransactionStatus& response) {
359
356
const ui64 txId = status == NTxProxy::TResultStatus::ExecInProgress ? response.GetTxId () : response.GetPathCreateTxId ();
360
357
if (txId == 0 ) {
361
- ScheduleRetry (response, " Unable to subscribe to concurrent transaction" );
358
+ ScheduleRetry (response, " Unable to subscribe to concurrent transaction" , true );
362
359
return ;
363
360
}
364
361
365
- PipeClientClosedByUs = false ;
366
362
SchemePipeActorId = Register (NTabletPipe::CreateClient (SelfId (), response.GetSchemeShardTabletId ()));
367
363
368
364
auto request = MakeHolder<NSchemeShard::TEvSchemeShard::TEvNotifyTxCompletion>();
@@ -371,11 +367,16 @@ class TPoolCreatorActor : public TSchemeActorBase<TPoolCreatorActor> {
371
367
LOG_D (" Subscribe on create pool tx: " << txId);
372
368
}
373
369
374
- void ScheduleRetry (const NKikimrTxUserProxy::TEvProposeTransactionStatus& response, const TString& message, bool longDelay = false ) {
375
- if (SchemePipeActorId){
376
- PipeClientClosedByUs = true ;
370
+ void ClosePipeClient () {
371
+ if (SchemePipeActorId) {
372
+ ClosedSchemePipeActors.insert (SchemePipeActorId);
373
+ SchemePipeActorId = {};
377
374
NTabletPipe::CloseClient (SelfId (), SchemePipeActorId);
378
375
}
376
+ }
377
+
378
+ void ScheduleRetry (const NKikimrTxUserProxy::TEvProposeTransactionStatus& response, const TString& message, bool longDelay = false ) {
379
+ ClosePipeClient ();
379
380
380
381
auto ssStatus = static_cast <NKikimrScheme::EStatus>(response.GetSchemeShardStatus ());
381
382
if (!TBase::ScheduleRetry (ExtractIssues (response, TStringBuilder () << message << " , status: " << ssStatus), longDelay)) {
@@ -384,11 +385,7 @@ class TPoolCreatorActor : public TSchemeActorBase<TPoolCreatorActor> {
384
385
}
385
386
386
387
void ScheduleRetry (const TString& message, bool longDelay = false ) {
387
- if (SchemePipeActorId){
388
- PipeClientClosedByUs = true ;
389
- NTabletPipe::CloseClient (SelfId (), SchemePipeActorId);
390
- }
391
-
388
+ ClosePipeClient ();
392
389
if (!TBase::ScheduleRetry (message, longDelay)) {
393
390
Reply (Ydb::StatusIds::UNAVAILABLE, TStringBuilder () << " Retry limit exceeded on error: " << message);
394
391
}
@@ -423,9 +420,7 @@ class TPoolCreatorActor : public TSchemeActorBase<TPoolCreatorActor> {
423
420
LOG_W (" Failed to create pool, " << status << " , issues: " << issues.ToOneLineString ());
424
421
}
425
422
426
- if (SchemePipeActorId) {
427
- NTabletPipe::CloseClient (SelfId (), SchemePipeActorId);
428
- }
423
+ ClosePipeClient ();
429
424
430
425
Issues.AddIssues (std::move (issues));
431
426
Send (ReplyActorId, new TEvPrivate::TEvCreatePoolResponse (status, std::move (Issues)));
@@ -446,8 +441,8 @@ class TPoolCreatorActor : public TSchemeActorBase<TPoolCreatorActor> {
446
441
const NACLibProto::TDiffACL DiffAcl;
447
442
NResourcePool::TPoolSettings PoolConfig;
448
443
449
- NActors:: TActorId SchemePipeActorId ;
450
- bool PipeClientClosedByUs = false ;
444
+ std::unordered_set< TActorId> ClosedSchemePipeActors ;
445
+ TActorId SchemePipeActorId ;
451
446
};
452
447
453
448
} // anonymous namespace
0 commit comments