@@ -22,9 +22,8 @@ using namespace NActors;
2222
2323class TPoolResolverActor : public TActorBootstrapped <TPoolResolverActor> {
2424public:
25- TPoolResolverActor (TEvPlaceRequestIntoPool::TPtr event, bool defaultPoolExists, bool enableOnServerless )
25+ TPoolResolverActor (TEvPlaceRequestIntoPool::TPtr event, bool defaultPoolExists)
2626 : Event(std::move(event))
27- , EnableOnServerless(enableOnServerless)
2827 {
2928 if (!Event->Get ()->PoolId ) {
3029 Event->Get ()->PoolId = NResourcePool::DEFAULT_POOL_ID;
@@ -39,7 +38,7 @@ class TPoolResolverActor : public TActorBootstrapped<TPoolResolverActor> {
3938
4039 void StartPoolFetchRequest () const {
4140 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 ));
4342 }
4443
4544 void Handle (TEvPrivate::TEvFetchPoolResponse::TPtr& ev) {
@@ -116,20 +115,18 @@ class TPoolResolverActor : public TActorBootstrapped<TPoolResolverActor> {
116115
117116private:
118117 TEvPlaceRequestIntoPool::TPtr Event;
119- const bool EnableOnServerless;
120118 bool CanCreatePool = false ;
121119 bool DefaultPoolCreated = false ;
122120};
123121
124122
125123class TPoolFetcherActor : public TSchemeActorBase <TPoolFetcherActor> {
126124public:
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)
128126 : ReplyActorId(replyActorId)
129127 , Database(database)
130128 , PoolId(poolId)
131129 , UserToken(userToken)
132- , EnableOnServerless(enableOnServerless)
133130 {}
134131
135132 void DoBootstrap () {
@@ -144,11 +141,6 @@ class TPoolFetcherActor : public TSchemeActorBase<TPoolFetcherActor> {
144141 }
145142
146143 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-
152144 switch (result.Status ) {
153145 case EStatus::Unknown:
154146 case EStatus::PathNotTable:
@@ -238,7 +230,6 @@ class TPoolFetcherActor : public TSchemeActorBase<TPoolFetcherActor> {
238230 const TString Database;
239231 const TString PoolId;
240232 const TIntrusiveConstPtr<NACLib::TUserToken> UserToken;
241- const bool EnableOnServerless;
242233
243234 NResourcePool::TPoolSettings PoolConfig;
244235 NKikimrProto::TPathID PathId;
@@ -451,18 +442,113 @@ class TPoolCreatorActor : public TSchemeActorBase<TPoolCreatorActor> {
451442 TActorId SchemePipeActorId;
452443};
453444
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+
454536} // anonymous namespace
455537
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);
458540}
459541
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);
462544}
463545
464546IActor* CreatePoolCreatorActor (const TActorId& replyActorId, const TString& database, const TString& poolId, const NResourcePool::TPoolSettings& poolConfig, TIntrusiveConstPtr<NACLib::TUserToken> userToken, NACLibProto::TDiffACL diffAcl) {
465547 return new TPoolCreatorActor (replyActorId, database, poolId, poolConfig, userToken, diffAcl);
466548}
467549
550+ IActor* CreateDatabaseFetcherActor (const TActorId& replyActorId, const TString& database) {
551+ return new TDatabaseFetcherActor (replyActorId, database);
552+ }
553+
468554} // NKikimr::NKqp::NWorkload
0 commit comments