|
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> |
@@ -698,11 +699,8 @@ class TKqpProxyService : public TActorBootstrapped<TKqpProxyService> { |
698 | 699 | LocalSessions->AttachQueryText(sessionInfo, ev->Get()->GetQuery()); |
699 | 700 | } |
700 | 701 |
|
701 | | - if (!FeatureFlags.GetEnableResourcePools()) { |
702 | | - ev->Get()->SetPoolId(""); |
703 | | - } else if (!ev->Get()->GetPoolId()) { |
704 | | - // TODO: do not use default pool if there is no limits |
705 | | - ev->Get()->SetPoolId(NResourcePool::DEFAULT_POOL_ID); |
| 702 | + if (!TryFillPoolInfoFromCache(ev, requestId)) { |
| 703 | + return; |
706 | 704 | } |
707 | 705 |
|
708 | 706 | TActorId targetId; |
@@ -1354,6 +1352,7 @@ class TKqpProxyService : public TActorBootstrapped<TKqpProxyService> { |
1354 | 1352 | hFunc(TEvInterconnect::TEvNodeDisconnected, Handle); |
1355 | 1353 | hFunc(TEvKqp::TEvListSessionsRequest, Handle); |
1356 | 1354 | hFunc(TEvKqp::TEvListProxyNodesRequest, Handle); |
| 1355 | + hFunc(NWorkload::TEvUpdatePoolInfo, Handle); |
1357 | 1356 | default: |
1358 | 1357 | Y_ABORT("TKqpProxyService: unexpected event type: %" PRIx32 " event: %s", |
1359 | 1358 | ev->GetTypeRewrite(), ev->ToString().data()); |
@@ -1561,6 +1560,43 @@ class TKqpProxyService : public TActorBootstrapped<TKqpProxyService> { |
1561 | 1560 | } |
1562 | 1561 | } |
1563 | 1562 |
|
| 1563 | + bool TryFillPoolInfoFromCache(TEvKqp::TEvQueryRequest::TPtr& ev, ui64 requestId) { |
| 1564 | + if (!FeatureFlags.GetEnableResourcePools()) { |
| 1565 | + ev->Get()->SetPoolId(""); |
| 1566 | + return true; |
| 1567 | + } |
| 1568 | + |
| 1569 | + if (!ev->Get()->GetPoolId()) { |
| 1570 | + ev->Get()->SetPoolId(NResourcePool::DEFAULT_POOL_ID); |
| 1571 | + } |
| 1572 | + |
| 1573 | + const auto& poolId = ev->Get()->GetPoolId(); |
| 1574 | + const auto& poolInfo = ResourcePoolsCache.GetPoolInfo(ev->Get()->GetDatabase(), poolId); |
| 1575 | + if (!poolInfo) { |
| 1576 | + return true; |
| 1577 | + } |
| 1578 | + |
| 1579 | + const auto& securityObject = poolInfo->SecurityObject; |
| 1580 | + const auto& userToken = ev->Get()->GetUserToken(); |
| 1581 | + if (securityObject && userToken && !userToken->GetSerializedToken().empty()) { |
| 1582 | + if (!securityObject->CheckAccess(NACLib::EAccessRights::DescribeSchema, *userToken)) { |
| 1583 | + ReplyProcessError(Ydb::StatusIds::NOT_FOUND, TStringBuilder() << "Resource pool " << poolId << " not found or you don't have access permissions", requestId); |
| 1584 | + return false; |
| 1585 | + } |
| 1586 | + if (!securityObject->CheckAccess(NACLib::EAccessRights::SelectRow, *userToken)) { |
| 1587 | + ReplyProcessError(Ydb::StatusIds::UNAUTHORIZED, TStringBuilder() << "You don't have access permissions for resource pool " << poolId, requestId); |
| 1588 | + return false; |
| 1589 | + } |
| 1590 | + } |
| 1591 | + |
| 1592 | + const auto& poolConfig = poolInfo->Config; |
| 1593 | + if (!NWorkload::IsWorkloadServiceRequired(poolConfig)) { |
| 1594 | + ev->Get()->SetPoolConfig(poolConfig); |
| 1595 | + } |
| 1596 | + |
| 1597 | + return true; |
| 1598 | + } |
| 1599 | + |
1564 | 1600 | void UpdateYqlLogLevels() { |
1565 | 1601 | const auto& kqpYqlName = NKikimrServices::EServiceKikimr_Name(NKikimrServices::KQP_YQL); |
1566 | 1602 | for (auto &entry : LogConfig.GetEntry()) { |
@@ -1746,6 +1782,10 @@ class TKqpProxyService : public TActorBootstrapped<TKqpProxyService> { |
1746 | 1782 | Send(ev->Sender, result.release(), 0, ev->Cookie); |
1747 | 1783 | } |
1748 | 1784 |
|
| 1785 | + void Handle(NWorkload::TEvUpdatePoolInfo::TPtr& ev) { |
| 1786 | + ResourcePoolsCache.UpdatePoolInfo(ev->Get()->Database, ev->Get()->PoolId, ev->Get()->Config, ev->Get()->SecurityObject); |
| 1787 | + } |
| 1788 | + |
1749 | 1789 | private: |
1750 | 1790 | NKikimrConfig::TLogConfig LogConfig; |
1751 | 1791 | NKikimrConfig::TTableServiceConfig TableServiceConfig; |
@@ -1807,6 +1847,8 @@ class TKqpProxyService : public TActorBootstrapped<TKqpProxyService> { |
1807 | 1847 | std::deque<TDelayedEvent> DelayedEventsQueue; |
1808 | 1848 | bool IsLookupByRmScheduled = false; |
1809 | 1849 | TActorId KqpTempTablesAgentActor; |
| 1850 | + |
| 1851 | + TResourcePoolsCache ResourcePoolsCache; |
1810 | 1852 | }; |
1811 | 1853 |
|
1812 | 1854 | } // namespace |
|
0 commit comments