|
11 | 11 | #include <ydb/core/cms/console/console.h> |
12 | 12 | #include <ydb/core/kqp/counters/kqp_counters.h> |
13 | 13 | #include <ydb/core/kqp/common/events/script_executions.h> |
| 14 | +#include <ydb/core/kqp/common/events/workload_service.h> |
14 | 15 | #include <ydb/core/kqp/common/kqp_lwtrace_probes.h> |
15 | 16 | #include <ydb/core/kqp/common/kqp_timeouts.h> |
16 | 17 | #include <ydb/core/kqp/compile_service/kqp_compile_service.h> |
@@ -691,11 +692,8 @@ class TKqpProxyService : public TActorBootstrapped<TKqpProxyService> { |
691 | 692 | LocalSessions->AttachQueryText(sessionInfo, ev->Get()->GetQuery()); |
692 | 693 | } |
693 | 694 |
|
694 | | - if (!FeatureFlags.GetEnableResourcePools()) { |
695 | | - ev->Get()->SetPoolId(""); |
696 | | - } else if (!ev->Get()->GetPoolId()) { |
697 | | - // TODO: do not use default pool if there is no limits |
698 | | - ev->Get()->SetPoolId(NResourcePool::DEFAULT_POOL_ID); |
| 695 | + if (!TryFillPoolInfoFromCache(ev, requestId)) { |
| 696 | + return; |
699 | 697 | } |
700 | 698 |
|
701 | 699 | TActorId targetId; |
@@ -1348,6 +1346,7 @@ class TKqpProxyService : public TActorBootstrapped<TKqpProxyService> { |
1348 | 1346 | hFunc(TEvInterconnect::TEvNodeDisconnected, Handle); |
1349 | 1347 | hFunc(TEvKqp::TEvListSessionsRequest, Handle); |
1350 | 1348 | hFunc(TEvKqp::TEvListProxyNodesRequest, Handle); |
| 1349 | + hFunc(NWorkload::TEvUpdatePoolInfo, Handle); |
1351 | 1350 | default: |
1352 | 1351 | Y_ABORT("TKqpProxyService: unexpected event type: %" PRIx32 " event: %s", |
1353 | 1352 | ev->GetTypeRewrite(), ev->ToString().data()); |
@@ -1570,6 +1569,43 @@ class TKqpProxyService : public TActorBootstrapped<TKqpProxyService> { |
1570 | 1569 | } |
1571 | 1570 | } |
1572 | 1571 |
|
| 1572 | + bool TryFillPoolInfoFromCache(TEvKqp::TEvQueryRequest::TPtr& ev, ui64 requestId) { |
| 1573 | + if (!FeatureFlags.GetEnableResourcePools()) { |
| 1574 | + ev->Get()->SetPoolId(""); |
| 1575 | + return true; |
| 1576 | + } |
| 1577 | + |
| 1578 | + if (!ev->Get()->GetPoolId()) { |
| 1579 | + ev->Get()->SetPoolId(NResourcePool::DEFAULT_POOL_ID); |
| 1580 | + } |
| 1581 | + |
| 1582 | + const auto& poolId = ev->Get()->GetPoolId(); |
| 1583 | + const auto& poolInfo = ResourcePoolsCache.GetPoolInfo(ev->Get()->GetDatabase(), poolId); |
| 1584 | + if (!poolInfo) { |
| 1585 | + return true; |
| 1586 | + } |
| 1587 | + |
| 1588 | + const auto& securityObject = poolInfo->SecurityObject; |
| 1589 | + const auto& userToken = ev->Get()->GetUserToken(); |
| 1590 | + if (securityObject && userToken && !userToken->GetSerializedToken().empty()) { |
| 1591 | + if (!securityObject->CheckAccess(NACLib::EAccessRights::DescribeSchema, *userToken)) { |
| 1592 | + ReplyProcessError(Ydb::StatusIds::NOT_FOUND, TStringBuilder() << "Resource pool " << poolId << " not found or you don't have access permissions", requestId); |
| 1593 | + return false; |
| 1594 | + } |
| 1595 | + if (!securityObject->CheckAccess(NACLib::EAccessRights::SelectRow, *userToken)) { |
| 1596 | + ReplyProcessError(Ydb::StatusIds::UNAUTHORIZED, TStringBuilder() << "You don't have access permissions for resource pool " << poolId, requestId); |
| 1597 | + return false; |
| 1598 | + } |
| 1599 | + } |
| 1600 | + |
| 1601 | + const auto& poolConfig = poolInfo->Config; |
| 1602 | + if (!NWorkload::IsWorkloadServiceRequired(poolConfig)) { |
| 1603 | + ev->Get()->SetPoolConfig(poolConfig); |
| 1604 | + } |
| 1605 | + |
| 1606 | + return true; |
| 1607 | + } |
| 1608 | + |
1573 | 1609 | void UpdateYqlLogLevels() { |
1574 | 1610 | const auto& kqpYqlName = NKikimrServices::EServiceKikimr_Name(NKikimrServices::KQP_YQL); |
1575 | 1611 | for (auto &entry : LogConfig.GetEntry()) { |
@@ -1755,6 +1791,10 @@ class TKqpProxyService : public TActorBootstrapped<TKqpProxyService> { |
1755 | 1791 | Send(ev->Sender, result.release(), 0, ev->Cookie); |
1756 | 1792 | } |
1757 | 1793 |
|
| 1794 | + void Handle(NWorkload::TEvUpdatePoolInfo::TPtr& ev) { |
| 1795 | + ResourcePoolsCache.UpdatePoolInfo(ev->Get()->Database, ev->Get()->PoolId, ev->Get()->Config, ev->Get()->SecurityObject); |
| 1796 | + } |
| 1797 | + |
1758 | 1798 | private: |
1759 | 1799 | NKikimrConfig::TLogConfig LogConfig; |
1760 | 1800 | NKikimrConfig::TTableServiceConfig TableServiceConfig; |
@@ -1816,6 +1856,8 @@ class TKqpProxyService : public TActorBootstrapped<TKqpProxyService> { |
1816 | 1856 | std::deque<TDelayedEvent> DelayedEventsQueue; |
1817 | 1857 | bool IsLookupByRmScheduled = false; |
1818 | 1858 | TActorId KqpTempTablesAgentActor; |
| 1859 | + |
| 1860 | + TResourcePoolsCache ResourcePoolsCache; |
1819 | 1861 | }; |
1820 | 1862 |
|
1821 | 1863 | } // namespace |
|
0 commit comments