Skip to content

Commit f837701

Browse files
authored
YQ-3597 disable metadata objects on serverless (#8922)
1 parent 1f29b7c commit f837701

15 files changed

+482
-6
lines changed

ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp

+143
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <ydb/core/kqp/gateway/behaviour/resource_pool_classifier/fetcher.h>
22
#include <ydb/core/kqp/ut/common/kqp_ut_common.h>
33
#include <ydb/core/kqp/ut/common/columnshard.h>
4+
#include <ydb/core/kqp/workload_service/ut/common/kqp_workload_service_ut_common.h>
45
#include <ydb/core/tx/columnshard/hooks/testing/controller.h>
56
#include <ydb/core/formats/arrow/arrow_helpers.h>
67
#include <ydb/core/tx/tx_proxy/proxy.h>
@@ -6225,6 +6226,57 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
62256226
"Path does not exist");
62266227
}
62276228

6229+
Y_UNIT_TEST(DisableResourcePoolsOnServerless) {
6230+
auto ydb = NWorkload::TYdbSetupSettings()
6231+
.CreateSampleTenants(true)
6232+
.EnableResourcePoolsOnServerless(false)
6233+
.Create();
6234+
6235+
auto checkDisabled = [](const auto& result) {
6236+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::GENERIC_ERROR, result.GetIssues().ToString());
6237+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Resource pools are disabled for serverless domains. Please contact your system administrator to enable it");
6238+
};
6239+
6240+
auto checkNotFound = [](const auto& result) {
6241+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::GENERIC_ERROR, result.GetIssues().ToString());
6242+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Path does not exist");
6243+
};
6244+
6245+
const auto& createSql = R"(
6246+
CREATE RESOURCE POOL MyResourcePool WITH (
6247+
CONCURRENT_QUERY_LIMIT=20,
6248+
QUEUE_SIZE=1000
6249+
);)";
6250+
6251+
const auto& alterSql = R"(
6252+
ALTER RESOURCE POOL MyResourcePool
6253+
SET (CONCURRENT_QUERY_LIMIT = 30, QUEUE_SIZE = 100),
6254+
RESET (QUERY_MEMORY_LIMIT_PERCENT_PER_NODE);
6255+
)";
6256+
6257+
const auto& dropSql = "DROP RESOURCE POOL MyResourcePool;";
6258+
6259+
auto settings = NWorkload::TQueryRunnerSettings().PoolId("");
6260+
6261+
// Dedicated, enabled
6262+
settings.Database(ydb->GetSettings().GetDedicatedTenantName()).NodeIndex(1);
6263+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSql, settings));
6264+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(alterSql, settings));
6265+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSql, settings));
6266+
6267+
// Shared, enabled
6268+
settings.Database(ydb->GetSettings().GetSharedTenantName()).NodeIndex(2);
6269+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSql, settings));
6270+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(alterSql, settings));
6271+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSql, settings));
6272+
6273+
// Serverless, disabled
6274+
settings.Database(ydb->GetSettings().GetServerlessTenantName()).NodeIndex(2);
6275+
checkDisabled(ydb->ExecuteQuery(createSql, settings));
6276+
checkNotFound(ydb->ExecuteQuery(alterSql, settings));
6277+
checkNotFound(ydb->ExecuteQuery(dropSql, settings));
6278+
}
6279+
62286280
Y_UNIT_TEST(ResourcePoolsValidation) {
62296281
NKikimrConfig::TAppConfig config;
62306282
config.MutableFeatureFlags()->SetEnableResourcePools(true);
@@ -6494,6 +6546,57 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
64946546
"Classifier with name MyResourcePoolClassifier not found in database /Root");
64956547
}
64966548

6549+
Y_UNIT_TEST(DisableResourcePoolClassifiersOnServerless) {
6550+
auto ydb = NWorkload::TYdbSetupSettings()
6551+
.CreateSampleTenants(true)
6552+
.EnableResourcePoolsOnServerless(false)
6553+
.Create();
6554+
6555+
auto checkDisabled = [](const auto& result) {
6556+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::GENERIC_ERROR, result.GetIssues().ToString());
6557+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Resource pool classifiers are disabled for serverless domains. Please contact your system administrator to enable it");
6558+
};
6559+
6560+
auto checkNotFound = [](const auto& result) {
6561+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::GENERIC_ERROR, result.GetIssues().ToString());
6562+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Classifier with name MyResourcePoolClassifier not found in database");
6563+
};
6564+
6565+
const auto& createSql = R"(
6566+
CREATE RESOURCE POOL CLASSIFIER MyResourcePoolClassifier WITH (
6567+
RANK=20,
6568+
RESOURCE_POOL="test_pool"
6569+
);)";
6570+
6571+
const auto& alterSql = R"(
6572+
ALTER RESOURCE POOL CLASSIFIER MyResourcePoolClassifier
6573+
SET (RANK = 1, MEMBERNAME = "test@user"),
6574+
RESET (RESOURCE_POOL);
6575+
)";
6576+
6577+
const auto& dropSql = "DROP RESOURCE POOL CLASSIFIER MyResourcePoolClassifier;";
6578+
6579+
auto settings = NWorkload::TQueryRunnerSettings().PoolId("");
6580+
6581+
// Dedicated, enabled
6582+
settings.Database(ydb->GetSettings().GetDedicatedTenantName()).NodeIndex(1);
6583+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSql, settings));
6584+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(alterSql, settings));
6585+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSql, settings));
6586+
6587+
// Shared, enabled
6588+
settings.Database(ydb->GetSettings().GetSharedTenantName()).NodeIndex(2);
6589+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSql, settings));
6590+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(alterSql, settings));
6591+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSql, settings));
6592+
6593+
// Serverless, disabled
6594+
settings.Database(ydb->GetSettings().GetServerlessTenantName()).NodeIndex(2);
6595+
checkDisabled(ydb->ExecuteQuery(createSql, settings));
6596+
checkDisabled(ydb->ExecuteQuery(alterSql, settings));
6597+
checkNotFound(ydb->ExecuteQuery(dropSql, settings));
6598+
}
6599+
64976600
Y_UNIT_TEST(ResourcePoolClassifiersValidation) {
64986601
NKikimrConfig::TAppConfig config;
64996602
config.MutableFeatureFlags()->SetEnableResourcePools(true);
@@ -6782,6 +6885,46 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
67826885
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::GENERIC_ERROR, result.GetIssues().ToString());
67836886
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Classifier with name MyResourcePoolClassifier not found in database /Root");
67846887
}
6888+
6889+
Y_UNIT_TEST(DisableMetadataObjectsOnServerless) {
6890+
auto ydb = NWorkload::TYdbSetupSettings()
6891+
.CreateSampleTenants(true)
6892+
.EnableMetadataObjectsOnServerless(false)
6893+
.Create();
6894+
6895+
auto checkDisabled = [](const auto& result) {
6896+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::GENERIC_ERROR, result.GetIssues().ToString());
6897+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Objects SECRET are disabled for serverless domains. Please contact your system administrator to enable it");
6898+
};
6899+
6900+
const auto& createSql = "CREATE OBJECT MySecretObject (TYPE SECRET) WITH (value=\"qwerty\");";
6901+
const auto& alterSql = "ALTER OBJECT MySecretObject (TYPE SECRET) SET value = \"abcde\";";
6902+
const auto& upsertSql = "UPSERT OBJECT MySecretObject (TYPE SECRET) WITH value = \"edcba\";";
6903+
const auto& dropSql = "DROP OBJECT MySecretObject (TYPE SECRET);";
6904+
6905+
auto settings = NWorkload::TQueryRunnerSettings().PoolId("");
6906+
6907+
// Dedicated, enabled
6908+
settings.Database(ydb->GetSettings().GetDedicatedTenantName()).NodeIndex(1);
6909+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSql, settings));
6910+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(alterSql, settings));
6911+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(upsertSql, settings));
6912+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSql, settings));
6913+
6914+
// Shared, enabled
6915+
settings.Database(ydb->GetSettings().GetSharedTenantName()).NodeIndex(2);
6916+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(createSql, settings));
6917+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(alterSql, settings));
6918+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(upsertSql, settings));
6919+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSql, settings));
6920+
6921+
// Serverless, disabled
6922+
settings.Database(ydb->GetSettings().GetServerlessTenantName()).NodeIndex(2);
6923+
checkDisabled(ydb->ExecuteQuery(createSql, settings));
6924+
checkDisabled(ydb->ExecuteQuery(alterSql, settings));
6925+
checkDisabled(ydb->ExecuteQuery(upsertSql, settings));
6926+
NWorkload::TSampleQueries::CheckSuccess(ydb->ExecuteQuery(dropSql, settings));
6927+
}
67856928
}
67866929

67876930
Y_UNIT_TEST_SUITE(KqpOlapScheme) {

ydb/core/kqp/ut/scheme/ya.make

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ PEERDIR(
2222
library/cpp/threading/local_executor
2323
ydb/core/kqp
2424
ydb/core/kqp/ut/common
25+
ydb/core/kqp/workload_service/ut/common
2526
ydb/core/tx/columnshard/hooks/testing
2627
ydb/library/yql/sql/pg
2728
ydb/library/yql/parser/pg_wrapper

ydb/core/kqp/workload_service/ut/common/kqp_workload_service_ut_common.cpp

+59-5
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,8 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
230230
TAppConfig GetAppConfig() const {
231231
TAppConfig appConfig;
232232
appConfig.MutableFeatureFlags()->SetEnableResourcePools(Settings_.EnableResourcePools_);
233+
appConfig.MutableFeatureFlags()->SetEnableResourcePoolsOnServerless(Settings_.EnableResourcePoolsOnServerless_);
234+
appConfig.MutableFeatureFlags()->SetEnableMetadataObjectsOnServerless(Settings_.EnableMetadataObjectsOnServerless_);
233235
appConfig.MutableFeatureFlags()->SetEnableResourcePoolsCounters(true);
234236

235237
return appConfig;
@@ -238,7 +240,7 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
238240
void SetLoggerSettings(TServerSettings& serverSettings) const {
239241
auto loggerInitializer = [](TTestActorRuntime& runtime) {
240242
runtime.SetLogPriority(NKikimrServices::KQP_WORKLOAD_SERVICE, NLog::EPriority::PRI_TRACE);
241-
runtime.SetLogPriority(NKikimrServices::KQP_SESSION, NLog::EPriority::PRI_DEBUG);
243+
runtime.SetLogPriority(NKikimrServices::KQP_SESSION, NLog::EPriority::PRI_TRACE);
242244
};
243245

244246
serverSettings.SetLoggerInitializer(loggerInitializer);
@@ -255,16 +257,50 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
255257
.SetAppConfig(appConfig)
256258
.SetFeatureFlags(appConfig.GetFeatureFlags());
257259

260+
if (Settings_.CreateSampleTenants_) {
261+
serverSettings
262+
.SetDynamicNodeCount(2)
263+
.AddStoragePoolType(Settings_.GetDedicatedTenantName())
264+
.AddStoragePoolType(Settings_.GetSharedTenantName());
265+
}
266+
258267
SetLoggerSettings(serverSettings);
259268

260269
return serverSettings;
261270
}
262271

272+
void SetupResourcesTenant(Ydb::Cms::CreateDatabaseRequest& request, Ydb::Cms::StorageUnits* storage, const TString& name) {
273+
request.set_path(name);
274+
storage->set_unit_kind(name);
275+
storage->set_count(1);
276+
}
277+
278+
void CreateTenants() {
279+
{ // Dedicated
280+
Ydb::Cms::CreateDatabaseRequest request;
281+
SetupResourcesTenant(request, request.mutable_resources()->add_storage_units(), Settings_.GetDedicatedTenantName());
282+
Tenants_->CreateTenant(std::move(request));
283+
}
284+
285+
{ // Shared
286+
Ydb::Cms::CreateDatabaseRequest request;
287+
SetupResourcesTenant(request, request.mutable_shared_resources()->add_storage_units(), Settings_.GetSharedTenantName());
288+
Tenants_->CreateTenant(std::move(request));
289+
}
290+
291+
{ // Serverless
292+
Ydb::Cms::CreateDatabaseRequest request;
293+
request.set_path(Settings_.GetServerlessTenantName());
294+
request.mutable_serverless_resources()->set_shared_database_path(Settings_.GetSharedTenantName());
295+
Tenants_->CreateTenant(std::move(request));
296+
}
297+
}
298+
263299
void InitializeServer() {
264300
ui32 grpcPort = PortManager_.GetPort();
265301
TServerSettings serverSettings = GetServerSettings(grpcPort);
266302

267-
Server_ = std::make_unique<TServer>(serverSettings);
303+
Server_ = MakeIntrusive<TServer>(serverSettings);
268304
Server_->EnableGRpc(grpcPort);
269305
GetRuntime()->SetDispatchTimeout(FUTURE_WAIT_TIMEOUT);
270306

@@ -277,10 +313,15 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
277313

278314
TableClient_ = std::make_unique<NYdb::NTable::TTableClient>(*YdbDriver_, NYdb::NTable::TClientSettings().AuthToken("user@" BUILTIN_SYSTEM_DOMAIN));
279315
TableClientSession_ = std::make_unique<NYdb::NTable::TSession>(TableClient_->CreateSession().GetValueSync().GetSession());
316+
317+
Tenants_ = std::make_unique<TTenants>(Server_);
318+
if (Settings_.CreateSampleTenants_) {
319+
CreateTenants();
320+
}
280321
}
281322

282323
void CreateSamplePool() const {
283-
if (!Settings_.EnableResourcePools_) {
324+
if (!Settings_.EnableResourcePools_ || Settings_.CreateSampleTenants_) {
284325
return;
285326
}
286327

@@ -483,7 +524,7 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
483524
request->SetQuery(query);
484525
request->SetType(NKikimrKqp::QUERY_TYPE_SQL_GENERIC_QUERY);
485526
request->SetAction(NKikimrKqp::QUERY_ACTION_EXECUTE);
486-
request->SetDatabase(Settings_.DomainName_);
527+
request->SetDatabase(settings.Database_ ? settings.Database_ : Settings_.DomainName_);
487528
request->SetPoolId(*settings.PoolId_);
488529

489530
return event;
@@ -525,9 +566,10 @@ class TWorkloadServiceYdbSetup : public IYdbSetup {
525566
const TYdbSetupSettings Settings_;
526567

527568
TPortManager PortManager_;
528-
std::unique_ptr<TServer> Server_;
569+
TServer::TPtr Server_;
529570
std::unique_ptr<TClient> Client_;
530571
std::unique_ptr<TDriver> YdbDriver_;
572+
std::unique_ptr<TTenants> Tenants_;
531573

532574
std::unique_ptr<NYdb::NTable::TTableClient> TableClient_;
533575
std::unique_ptr<NYdb::NTable::TSession> TableClientSession_;
@@ -586,6 +628,18 @@ TIntrusivePtr<IYdbSetup> TYdbSetupSettings::Create() const {
586628
return MakeIntrusive<TWorkloadServiceYdbSetup>(*this);
587629
}
588630

631+
TString TYdbSetupSettings::GetDedicatedTenantName() const {
632+
return TStringBuilder() << CanonizePath(DomainName_) << "/test-dedicated";
633+
}
634+
635+
TString TYdbSetupSettings::GetSharedTenantName() const {
636+
return TStringBuilder() << CanonizePath(DomainName_) << "/test-shared";
637+
}
638+
639+
TString TYdbSetupSettings::GetServerlessTenantName() const {
640+
return TStringBuilder() << CanonizePath(DomainName_) << "/test-serverless";
641+
}
642+
589643
//// IYdbSetup
590644

591645
void IYdbSetup::WaitFor(TDuration timeout, TString description, std::function<bool(TString&)> callback) {

ydb/core/kqp/workload_service/ut/common/kqp_workload_service_ut_common.h

+14
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ struct TQueryRunnerSettings {
2626
FLUENT_SETTING_DEFAULT(ui32, NodeIndex, 0);
2727
FLUENT_SETTING_DEFAULT(std::optional<TString>, PoolId, std::nullopt);
2828
FLUENT_SETTING_DEFAULT(TString, UserSID, "user@" BUILTIN_SYSTEM_DOMAIN);
29+
FLUENT_SETTING_DEFAULT(TString, Database, "");
2930

3031
// Runner settings
3132
FLUENT_SETTING_DEFAULT(bool, HangUpDuringExecution, false);
@@ -66,7 +67,10 @@ struct TYdbSetupSettings {
6667
// Cluster settings
6768
FLUENT_SETTING_DEFAULT(ui32, NodeCount, 1);
6869
FLUENT_SETTING_DEFAULT(TString, DomainName, "Root");
70+
FLUENT_SETTING_DEFAULT(bool, CreateSampleTenants, false);
6971
FLUENT_SETTING_DEFAULT(bool, EnableResourcePools, true);
72+
FLUENT_SETTING_DEFAULT(bool, EnableResourcePoolsOnServerless, false);
73+
FLUENT_SETTING_DEFAULT(bool, EnableMetadataObjectsOnServerless, true);
7074

7175
// Default pool settings
7276
FLUENT_SETTING_DEFAULT(TString, PoolId, "sample_pool_id");
@@ -78,6 +82,10 @@ struct TYdbSetupSettings {
7882

7983
NResourcePool::TPoolSettings GetDefaultPoolSettings() const;
8084
TIntrusivePtr<IYdbSetup> Create() const;
85+
86+
TString GetDedicatedTenantName() const;
87+
TString GetSharedTenantName() const;
88+
TString GetServerlessTenantName() const;
8189
};
8290

8391
class IYdbSetup : public TThrRefBase {
@@ -127,6 +135,12 @@ struct TSampleQueries {
127135
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Request timeout exceeded, cancelling after");
128136
}
129137

138+
template <typename TResult>
139+
static void CheckNotFound(const TResult& result, const TString& poolId) {
140+
UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), NYdb::EStatus::NOT_FOUND, result.GetIssues().ToString());
141+
UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), TStringBuilder() << "Resource pool " << poolId << " not found or you don't have access permissions");
142+
}
143+
130144
struct TSelect42 {
131145
static constexpr char Query[] = "SELECT 42;";
132146

0 commit comments

Comments
 (0)