@@ -22,9 +22,8 @@ using namespace NActors;
22
22
23
23
class TPoolResolverActor : public TActorBootstrapped <TPoolResolverActor> {
24
24
public:
25
- TPoolResolverActor (TEvPlaceRequestIntoPool::TPtr event, bool defaultPoolExists, bool enableOnServerless )
25
+ TPoolResolverActor (TEvPlaceRequestIntoPool::TPtr event, bool defaultPoolExists)
26
26
: Event(std::move(event))
27
- , EnableOnServerless(enableOnServerless)
28
27
{
29
28
if (!Event->Get ()->PoolId ) {
30
29
Event->Get ()->PoolId = NResourcePool::DEFAULT_POOL_ID;
@@ -39,7 +38,7 @@ class TPoolResolverActor : public TActorBootstrapped<TPoolResolverActor> {
39
38
40
39
void StartPoolFetchRequest () const {
41
40
LOG_D (" Start pool fetching" );
42
- Register (CreatePoolFetcherActor (SelfId (), Event->Get ()->Database , Event->Get ()->PoolId , Event->Get ()->UserToken , EnableOnServerless ));
41
+ Register (CreatePoolFetcherActor (SelfId (), Event->Get ()->Database , Event->Get ()->PoolId , Event->Get ()->UserToken ));
43
42
}
44
43
45
44
void Handle (TEvPrivate::TEvFetchPoolResponse::TPtr& ev) {
@@ -116,20 +115,18 @@ class TPoolResolverActor : public TActorBootstrapped<TPoolResolverActor> {
116
115
117
116
private:
118
117
TEvPlaceRequestIntoPool::TPtr Event;
119
- const bool EnableOnServerless;
120
118
bool CanCreatePool = false ;
121
119
bool DefaultPoolCreated = false ;
122
120
};
123
121
124
122
125
123
class TPoolFetcherActor : public TSchemeActorBase <TPoolFetcherActor> {
126
124
public:
127
- TPoolFetcherActor (const TActorId& replyActorId, const TString& database, const TString& poolId, TIntrusiveConstPtr<NACLib::TUserToken> userToken, bool enableOnServerless )
125
+ TPoolFetcherActor (const TActorId& replyActorId, const TString& database, const TString& poolId, TIntrusiveConstPtr<NACLib::TUserToken> userToken)
128
126
: ReplyActorId(replyActorId)
129
127
, Database(database)
130
128
, PoolId(poolId)
131
129
, UserToken(userToken)
132
- , EnableOnServerless(enableOnServerless)
133
130
{}
134
131
135
132
void DoBootstrap () {
@@ -144,11 +141,6 @@ class TPoolFetcherActor : public TSchemeActorBase<TPoolFetcherActor> {
144
141
}
145
142
146
143
const auto & result = results[0 ];
147
- if (!EnableOnServerless && result.DomainInfo && result.DomainInfo ->IsServerless ()) {
148
- Reply (Ydb::StatusIds::UNSUPPORTED, " Resource pools are disabled for serverless domains. Please contact your system administrator to enable it" );
149
- return ;
150
- }
151
-
152
144
switch (result.Status ) {
153
145
case EStatus::Unknown:
154
146
case EStatus::PathNotTable:
@@ -238,7 +230,6 @@ class TPoolFetcherActor : public TSchemeActorBase<TPoolFetcherActor> {
238
230
const TString Database;
239
231
const TString PoolId;
240
232
const TIntrusiveConstPtr<NACLib::TUserToken> UserToken;
241
- const bool EnableOnServerless;
242
233
243
234
NResourcePool::TPoolSettings PoolConfig;
244
235
NKikimrProto::TPathID PathId;
@@ -451,18 +442,113 @@ class TPoolCreatorActor : public TSchemeActorBase<TPoolCreatorActor> {
451
442
TActorId SchemePipeActorId;
452
443
};
453
444
445
+
446
+ class TDatabaseFetcherActor : public TSchemeActorBase <TDatabaseFetcherActor> {
447
+ public:
448
+ TDatabaseFetcherActor (const TActorId& replyActorId, const TString& database)
449
+ : ReplyActorId(replyActorId)
450
+ , Database(database)
451
+ {}
452
+
453
+ void DoBootstrap () {
454
+ Become (&TDatabaseFetcherActor::StateFunc);
455
+ }
456
+
457
+ void Handle (TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev) {
458
+ const auto & results = ev->Get ()->Request ->ResultSet ;
459
+ if (results.size () != 1 ) {
460
+ Reply (Ydb::StatusIds::INTERNAL_ERROR, " Unexpected scheme cache response" );
461
+ return ;
462
+ }
463
+
464
+ const auto & result = results[0 ];
465
+ switch (result.Status ) {
466
+ case EStatus::Unknown:
467
+ case EStatus::PathNotTable:
468
+ case EStatus::PathNotPath:
469
+ case EStatus::RedirectLookupError:
470
+ case EStatus::AccessDenied:
471
+ case EStatus::RootUnknown:
472
+ case EStatus::PathErrorUnknown:
473
+ Reply (Ydb::StatusIds::NOT_FOUND, TStringBuilder () << " Database " << Database << " not found or you don't have access permissions" );
474
+ return ;
475
+ case EStatus::LookupError:
476
+ case EStatus::TableCreationNotComplete:
477
+ if (!ScheduleRetry (TStringBuilder () << " Retry error " << result.Status )) {
478
+ Reply (Ydb::StatusIds::UNAVAILABLE, TStringBuilder () << " Retry limit exceeded on scheme error: " << result.Status );
479
+ }
480
+ return ;
481
+ case EStatus::Ok:
482
+ Serverless = result.DomainInfo && result.DomainInfo ->IsServerless ();
483
+ Reply (Ydb::StatusIds::SUCCESS);
484
+ return ;
485
+ }
486
+ }
487
+
488
+ STFUNC (StateFunc) {
489
+ switch (ev->GetTypeRewrite ()) {
490
+ hFunc (TEvTxProxySchemeCache::TEvNavigateKeySetResult, Handle );
491
+ default :
492
+ StateFuncBase (ev);
493
+ }
494
+ }
495
+
496
+ protected:
497
+ void StartRequest () override {
498
+ LOG_D (" Start database fetching" );
499
+ auto event = NTableCreator::BuildSchemeCacheNavigateRequest ({{}}, Database, nullptr );
500
+ event->ResultSet [0 ].Operation = NSchemeCache::TSchemeCacheNavigate::OpPath;
501
+ Send (MakeSchemeCacheID (), new TEvTxProxySchemeCache::TEvNavigateKeySet (event.Release ()), IEventHandle::FlagTrackDelivery);
502
+ }
503
+
504
+ void OnFatalError (Ydb::StatusIds::StatusCode status, NYql::TIssue issue) override {
505
+ Reply (status, {std::move (issue)});
506
+ }
507
+
508
+ TString LogPrefix () const override {
509
+ return TStringBuilder () << " [TDatabaseFetcherActor] ActorId: " << SelfId () << " , Database: " << Database << " , " ;
510
+ }
511
+
512
+ private:
513
+ void Reply (Ydb::StatusIds::StatusCode status, const TString& message) {
514
+ Reply (status, {NYql::TIssue (message)});
515
+ }
516
+
517
+ void Reply (Ydb::StatusIds::StatusCode status, NYql::TIssues issues = {}) {
518
+ if (status == Ydb::StatusIds::SUCCESS) {
519
+ LOG_D (" Database info successfully fetched" );
520
+ } else {
521
+ LOG_W (" Failed to fetch database info, " << status << " , issues: " << issues.ToOneLineString ());
522
+ }
523
+
524
+ Issues.AddIssues (std::move (issues));
525
+ Send (ReplyActorId, new TEvPrivate::TEvFetchDatabaseResponse (status, Database, Serverless, std::move (Issues)));
526
+ PassAway ();
527
+ }
528
+
529
+ private:
530
+ const TActorId ReplyActorId;
531
+ const TString Database;
532
+
533
+ bool Serverless = false ;
534
+ };
535
+
454
536
} // anonymous namespace
455
537
456
- IActor* CreatePoolResolverActor (TEvPlaceRequestIntoPool::TPtr event, bool defaultPoolExists, bool enableOnServerless ) {
457
- return new TPoolResolverActor (std::move (event), defaultPoolExists, enableOnServerless );
538
+ IActor* CreatePoolResolverActor (TEvPlaceRequestIntoPool::TPtr event, bool defaultPoolExists) {
539
+ return new TPoolResolverActor (std::move (event), defaultPoolExists);
458
540
}
459
541
460
- IActor* CreatePoolFetcherActor (const TActorId& replyActorId, const TString& database, const TString& poolId, TIntrusiveConstPtr<NACLib::TUserToken> userToken, bool enableOnServerless ) {
461
- return new TPoolFetcherActor (replyActorId, database, poolId, userToken, enableOnServerless );
542
+ IActor* CreatePoolFetcherActor (const TActorId& replyActorId, const TString& database, const TString& poolId, TIntrusiveConstPtr<NACLib::TUserToken> userToken) {
543
+ return new TPoolFetcherActor (replyActorId, database, poolId, userToken);
462
544
}
463
545
464
546
IActor* CreatePoolCreatorActor (const TActorId& replyActorId, const TString& database, const TString& poolId, const NResourcePool::TPoolSettings& poolConfig, TIntrusiveConstPtr<NACLib::TUserToken> userToken, NACLibProto::TDiffACL diffAcl) {
465
547
return new TPoolCreatorActor (replyActorId, database, poolId, poolConfig, userToken, diffAcl);
466
548
}
467
549
550
+ IActor* CreateDatabaseFetcherActor (const TActorId& replyActorId, const TString& database) {
551
+ return new TDatabaseFetcherActor (replyActorId, database);
552
+ }
553
+
468
554
} // NKikimr::NKqp::NWorkload
0 commit comments