|
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