From 97d4965d116b3e48614ba30820d5f0e2c1a3ec96 Mon Sep 17 00:00:00 2001 From: Ilia Shakhov Date: Wed, 17 Jan 2024 13:09:14 +0000 Subject: [PATCH 1/7] Rename values of ServerlessComputeResourcesMode enum KIKIMR-20642 --- ydb/core/discovery/discovery.cpp | 6 +- ydb/core/mind/hive/domain_info.cpp | 4 +- ydb/core/mind/hive/hive_ut.cpp | 109 +----------------- ydb/core/protos/subdomains.proto | 3 +- ...emeshard__operation_alter_extsubdomain.cpp | 10 +- .../ut_serverless/ut_serverless.cpp | 17 +-- .../ut_serverless_reboots.cpp | 16 +-- ydb/tests/functional/serverless/conftest.py | 10 +- .../functional/serverless/test_serverless.py | 38 +++--- 9 files changed, 49 insertions(+), 164 deletions(-) diff --git a/ydb/core/discovery/discovery.cpp b/ydb/core/discovery/discovery.cpp index ae0d86ac15e0..aa3aee5221dc 100644 --- a/ydb/core/discovery/discovery.cpp +++ b/ydb/core/discovery/discovery.cpp @@ -500,11 +500,9 @@ class TDiscoverer: public TActorBootstrapped { } switch (domainInfo->ServerlessComputeResourcesMode) { - case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED: + case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE: return false; - case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED: - return true; - default: + case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED: return true; } } diff --git a/ydb/core/mind/hive/domain_info.cpp b/ydb/core/mind/hive/domain_info.cpp index 27f0e6747cc7..13e27ebaaf65 100644 --- a/ydb/core/mind/hive/domain_info.cpp +++ b/ydb/core/mind/hive/domain_info.cpp @@ -9,10 +9,8 @@ ENodeSelectionPolicy TDomainInfo::GetNodeSelectionPolicy() const { } switch (*ServerlessComputeResourcesMode) { - case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED: + case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE: return ENodeSelectionPolicy::PreferObjectDomain; - case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED: - return ENodeSelectionPolicy::Default; default: return ENodeSelectionPolicy::Default; } diff --git a/ydb/core/mind/hive/hive_ut.cpp b/ydb/core/mind/hive/hive_ut.cpp index b28ee8db4b96..47c9722aabea 100644 --- a/ydb/core/mind/hive/hive_ut.cpp +++ b/ydb/core/mind/hive/hive_ut.cpp @@ -6015,7 +6015,7 @@ Y_UNIT_TEST_SUITE(THiveTest) { UNIT_ASSERT(foundTablet); } - Y_UNIT_TEST(TestServerlessComputeResourcesMode) { + Y_UNIT_TEST(TestDomainNodeSelectionPolicy) { TTestBasicRuntime runtime(2, false); Setup(runtime, true); @@ -6071,7 +6071,7 @@ Y_UNIT_TEST_SUITE(THiveTest) { ev->Record.SetTxId(++txId); ev->Record.MutableDomainKey()->SetSchemeShard(subdomainKey.GetSchemeShard()); ev->Record.MutableDomainKey()->SetPathId(subdomainKey.GetPathId()); - ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED); + ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE); runtime.SendToPipe(hiveTablet, sender, ev.Release()); TAutoPtr handle; TEvHive::TEvUpdateDomainReply* response = runtime.GrabEdgeEventRethrow(handle); @@ -6096,7 +6096,7 @@ Y_UNIT_TEST_SUITE(THiveTest) { ev->Record.SetTxId(++txId); ev->Record.MutableDomainKey()->SetSchemeShard(subdomainKey.GetSchemeShard()); ev->Record.MutableDomainKey()->SetPathId(subdomainKey.GetPathId()); - ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED); + ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED); runtime.SendToPipe(hiveTablet, sender, ev.Release()); TAutoPtr handle; TEvHive::TEvUpdateDomainReply* response = runtime.GrabEdgeEventRethrow(handle); @@ -6120,109 +6120,6 @@ Y_UNIT_TEST_SUITE(THiveTest) { runtime.SimulateSleep(TDuration::Seconds(1)); MakeSureTabletIsDown(runtime, dummyTabletId, 0); // can't start because there are no allowed domain nodes } - - Y_UNIT_TEST(TestResetServerlessComputeResourcesMode) { - TTestBasicRuntime runtime(2, false); - Setup(runtime, true); - - const ui64 hiveTablet = MakeDefaultHiveID(0); - const ui64 testerTablet = MakeDefaultHiveID(1); - const TActorId hiveActor = CreateTestBootstrapper(runtime, CreateTestTabletInfo(hiveTablet, TTabletTypes::Hive), &CreateDefaultHive); - runtime.EnableScheduleForActor(hiveActor); - CreateTestBootstrapper(runtime, CreateTestTabletInfo(TTestTxConfig::SchemeShard, TTabletTypes::SchemeShard), &CreateFlatTxSchemeShard); - MakeSureTabletIsUp(runtime, hiveTablet, 0); // root hive good - MakeSureTabletIsUp(runtime, TTestTxConfig::SchemeShard, 0); // root ss good - - TActorId sender = runtime.AllocateEdgeActor(0); - InitSchemeRoot(runtime, sender); - - // Create subdomain - ui32 txId = 100; - TSubDomainKey subdomainKey; - do { - auto modifyScheme = MakeHolder(); - modifyScheme->Record.SetTxId(++txId); - auto* transaction = modifyScheme->Record.AddTransaction(); - transaction->SetWorkingDir("/dc-1"); - transaction->SetOperationType(NKikimrSchemeOp::ESchemeOpCreateExtSubDomain); - auto* subdomain = transaction->MutableSubDomain(); - subdomain->SetName("tenant1"); - runtime.SendToPipe(TTestTxConfig::SchemeShard, sender, modifyScheme.Release()); - TAutoPtr handle; - auto reply = runtime.GrabEdgeEventRethrow(handle, TDuration::MilliSeconds(100)); - if (reply) { - subdomainKey = TSubDomainKey(reply->Record.GetSchemeshardId(), reply->Record.GetPathId()); - UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), NKikimrScheme::EStatus::StatusAccepted); - break; - } - } while (true); - - // Start local for subdomain - SendKillLocal(runtime, 1); - CreateLocalForTenant(runtime, 1, "/dc-1/tenant1"); - - THolder createTablet = MakeHolder(testerTablet, 1, TTabletTypes::Dummy, BINDED_CHANNELS); - createTablet->Record.AddAllowedDomains(); - createTablet->Record.MutableAllowedDomains(0)->SetSchemeShard(TTestTxConfig::SchemeShard); - createTablet->Record.MutableAllowedDomains(0)->SetPathId(1); - createTablet->Record.MutableObjectDomain()->SetSchemeShard(subdomainKey.GetSchemeShard()); - createTablet->Record.MutableObjectDomain()->SetPathId(subdomainKey.GetPathId()); - ui64 dummyTabletId = SendCreateTestTablet(runtime, hiveTablet, testerTablet, std::move(createTablet), 0, true); - - MakeSureTabletIsUp(runtime, dummyTabletId, 0); - AssertTabletStartedOnNode(runtime, dummyTabletId, 0); // started in allowed domain - - { - auto ev = MakeHolder(); - ev->Record.SetTxId(++txId); - ev->Record.MutableDomainKey()->SetSchemeShard(subdomainKey.GetSchemeShard()); - ev->Record.MutableDomainKey()->SetPathId(subdomainKey.GetPathId()); - ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED); - runtime.SendToPipe(hiveTablet, sender, ev.Release()); - TAutoPtr handle; - TEvHive::TEvUpdateDomainReply* response = runtime.GrabEdgeEventRethrow(handle); - UNIT_ASSERT_VALUES_EQUAL(response->Record.GetTxId(), txId); - UNIT_ASSERT_VALUES_EQUAL(response->Record.GetOrigin(), hiveTablet); - } - - // restart to kick tablet - SendKillLocal(runtime, 0); - { - TDispatchOptions options; - options.FinalEvents.emplace_back(TEvLocal::EvStopTablet); - runtime.DispatchEvents(options); - } - CreateLocal(runtime, 0); - - MakeSureTabletIsUp(runtime, dummyTabletId, 0); - AssertTabletStartedOnNode(runtime, dummyTabletId, 1); // started in object domain - - // reset ServerlessComputeResourcesMode - { - auto ev = MakeHolder(); - ev->Record.SetTxId(++txId); - ev->Record.MutableDomainKey()->SetSchemeShard(subdomainKey.GetSchemeShard()); - ev->Record.MutableDomainKey()->SetPathId(subdomainKey.GetPathId()); - ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED); - runtime.SendToPipe(hiveTablet, sender, ev.Release()); - TAutoPtr handle; - TEvHive::TEvUpdateDomainReply* response = runtime.GrabEdgeEventRethrow(handle); - UNIT_ASSERT_VALUES_EQUAL(response->Record.GetTxId(), txId); - UNIT_ASSERT_VALUES_EQUAL(response->Record.GetOrigin(), hiveTablet); - } - - // restart to kick tablet - SendKillLocal(runtime, 1); - { - TDispatchOptions options; - options.FinalEvents.emplace_back(TEvLocal::EvStopTablet); - runtime.DispatchEvents(options); - } - CreateLocalForTenant(runtime, 1, "/dc-1/tenant1"); - - MakeSureTabletIsUp(runtime, dummyTabletId, 0); - AssertTabletStartedOnNode(runtime, dummyTabletId, 0); // started in allowed domain - } } } diff --git a/ydb/core/protos/subdomains.proto b/ydb/core/protos/subdomains.proto index e740544f8565..9c26cf2726b7 100644 --- a/ydb/core/protos/subdomains.proto +++ b/ydb/core/protos/subdomains.proto @@ -117,6 +117,5 @@ message TSchemeQuota { enum EServerlessComputeResourcesMode { SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED = 0; - SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED = 1; // using nodes that serve resources domain - SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED = 2; // using nodes that serve self domain + SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE = 1; } diff --git a/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp b/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp index c8d287c3a492..f25b3b9b21e3 100644 --- a/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp +++ b/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp @@ -274,9 +274,7 @@ VerifyParams(TParamsDelta* delta, const TPathId pathId, const TSubDomainInfo::TP switch (input.GetServerlessComputeResourcesMode()) { case EServerlessComputeResourcesMode::SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED: - return paramError("can not set ServerlessComputeResourcesMode to SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED"); - case EServerlessComputeResourcesMode::SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED: - case EServerlessComputeResourcesMode::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED: + case EServerlessComputeResourcesMode::SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE: break; // ok default: return paramError("unknown ServerlessComputeResourcesMode"); @@ -287,7 +285,11 @@ VerifyParams(TParamsDelta* delta, const TPathId pathId, const TSubDomainInfo::TP return paramError("ServerlessComputeResourcesMode can be changed only for serverless"); } - serverlessComputeResourcesModeChanged = current->GetServerlessComputeResourcesMode() != input.GetServerlessComputeResourcesMode(); + if (input.GetServerlessComputeResourcesMode()) { + serverlessComputeResourcesModeChanged = current->GetServerlessComputeResourcesMode() != input.GetServerlessComputeResourcesMode(); + } else { + serverlessComputeResourcesModeChanged = current->GetServerlessComputeResourcesMode().Defined(); + } } delta->CoordinatorsAdded = coordinatorsAdded; diff --git a/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp b/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp index 11b4e2f79222..58848306905a 100644 --- a/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp +++ b/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp @@ -353,8 +353,8 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { env.TestServerlessComputeResourcesModeInHive(runtime, "/MyRoot/ServerLess0", serverlessComputeResourcesMode, sharedHive); }; - checkServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED); - checkServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED); + checkServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE); + checkServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED); } Y_UNIT_TEST(TestServerlessComputeResourcesModeValidation) { @@ -421,20 +421,11 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { // Try to change ServerlessComputeResourcesMode not on serverless database TestAlterExtSubDomain(runtime, ++txId, "/MyRoot", R"( - ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED + ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE Name: "SharedDB" )", {{ TEvSchemeShard::EStatus::StatusInvalidParameter, "only for serverless" }} ); - - // Try to set ServerlessComputeResourcesMode to SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED - TestAlterExtSubDomain(runtime, ++txId, "/MyRoot", - R"( - ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED - Name: "ServerLess0" - )", - {{ TEvSchemeShard::EStatus::StatusInvalidParameter, "SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED" }} - ); } @@ -501,7 +492,7 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { TestAlterExtSubDomain(runtime, ++txId, "/MyRoot", R"( - ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED + ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE Name: "ServerLess0" )", {{ TEvSchemeShard::EStatus::StatusPreconditionFailed, "Unsupported: feature flag EnableServerlessExclusiveDynamicNodes is off" }} diff --git a/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp b/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp index 6238d4488acd..c2655b5c2655 100644 --- a/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp +++ b/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp @@ -118,7 +118,7 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLessReboots) { TestAlterExtSubDomain(runtime, ++t.TxId, "/MyRoot", R"( - ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED + ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE Name: "ServerLess0" )" ); @@ -127,16 +127,16 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLessReboots) { { TInactiveZone inactive(activeZone); TestDescribeResult(DescribePath(runtime, "/MyRoot/ServerLess0"), - {NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED)}); + {NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE)}); t.TestEnv->TestServerlessComputeResourcesModeInHive(runtime, "/MyRoot/ServerLess0", - SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED, sharedHive); + SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE, sharedHive); TestTenantSchemeShardSync(t, runtime, tenantSchemeShard, "/MyRoot/ServerLess0", - ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED)); + ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE)); } TestAlterExtSubDomain(runtime, ++t.TxId, "/MyRoot", R"( - ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED + ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED Name: "ServerLess0" )" ); @@ -145,11 +145,11 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLessReboots) { { TInactiveZone inactive(activeZone); TestDescribeResult(DescribePath(runtime, "/MyRoot/ServerLess0"), - {NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED)}); + {NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED)}); t.TestEnv->TestServerlessComputeResourcesModeInHive(runtime, "/MyRoot/ServerLess0", - SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED, sharedHive); + SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED, sharedHive); TestTenantSchemeShardSync(t, runtime, tenantSchemeShard, "/MyRoot/ServerLess0", - ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED)); + ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED)); } }); } diff --git a/ydb/tests/functional/serverless/conftest.py b/ydb/tests/functional/serverless/conftest.py index 314f5f0f433d..4e901a7066f1 100644 --- a/ydb/tests/functional/serverless/conftest.py +++ b/ydb/tests/functional/serverless/conftest.py @@ -119,8 +119,8 @@ def ydb_disk_quoted_serverless_db(ydb_cluster, ydb_root, ydb_hostel_db, ydb_safe @contextlib.contextmanager -def ydb_serverless_db_with_nodes_ctx(ydb_cluster, database, hostel_db, timeout_seconds=100): - logger.info("setup ydb_serverless_db_with_nodes %s using hostel %s", database, hostel_db) +def ydb_serverless_db_with_exclusive_nodes_ctx(ydb_cluster, database, hostel_db, timeout_seconds=100): + logger.info("setup ydb_serverless_db_with_exclusive_nodes %s using hostel %s", database, hostel_db) ydb_cluster.remove_database( database, @@ -144,7 +144,7 @@ def ydb_serverless_db_with_nodes_ctx(ydb_cluster, database, hostel_db, timeout_s try: yield database finally: - logger.info("destroy ydb_serverless_db_with_nodes for %s", database) + logger.info("destroy ydb_serverless_db_with_exclusive_nodes for %s", database) ydb_cluster.remove_database( database, timeout_seconds=timeout_seconds @@ -154,8 +154,8 @@ def ydb_serverless_db_with_nodes_ctx(ydb_cluster, database, hostel_db, timeout_s @pytest.fixture(scope='module') -def ydb_serverless_db_with_nodes(ydb_cluster, ydb_root, ydb_hostel_db): +def ydb_serverless_db_with_exclusive_nodes(ydb_cluster, ydb_root, ydb_hostel_db): database_name = os.path.join(ydb_root, "serverless_with_nodes") - with ydb_serverless_db_with_nodes_ctx(ydb_cluster, database_name, ydb_hostel_db): + with ydb_serverless_db_with_exclusive_nodes_ctx(ydb_cluster, database_name, ydb_hostel_db): yield database_name diff --git a/ydb/tests/functional/serverless/test_serverless.py b/ydb/tests/functional/serverless/test_serverless.py index 2659b5db7a62..c3e63cafd250 100644 --- a/ydb/tests/functional/serverless/test_serverless.py +++ b/ydb/tests/functional/serverless/test_serverless.py @@ -508,7 +508,7 @@ def alter_database_serverless_compute_resources_mode(cluster, database_path, ser ydbcli_db_schema_exec(cluster, alter_proto) -def test_discovery_dedicated_nodes(ydb_hostel_db, ydb_serverless_db_with_nodes, ydb_endpoint, ydb_cluster): +def test_discovery_exclusive_nodes(ydb_hostel_db, ydb_serverless_db_with_exclusive_nodes, ydb_endpoint, ydb_cluster): def list_endpoints(database): logger.debug("List endpoints of %s", database) @@ -524,10 +524,10 @@ def list_endpoints(database): alter_database_serverless_compute_resources_mode( ydb_cluster, - ydb_serverless_db_with_nodes, - "SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED" + ydb_serverless_db_with_exclusive_nodes, + "SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED" ) - serverless_db_shared_endpoints = list_endpoints(ydb_serverless_db_with_nodes) + serverless_db_shared_endpoints = list_endpoints(ydb_serverless_db_with_exclusive_nodes) hostel_db_endpoints = list_endpoints(ydb_hostel_db) assert_that(hostel_db_endpoints, not_none()) @@ -536,23 +536,23 @@ def list_endpoints(database): alter_database_serverless_compute_resources_mode( ydb_cluster, - ydb_serverless_db_with_nodes, - "SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED" + ydb_serverless_db_with_exclusive_nodes, + "SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE" ) - serverless_db_dedicated_endpoints = list_endpoints(ydb_serverless_db_with_nodes) + serverless_db_dedicated_endpoints = list_endpoints(ydb_serverless_db_with_exclusive_nodes) assert_that(serverless_db_dedicated_endpoints, not_none()) assert_that(serverless_db_dedicated_endpoints, only_contains(not_(is_in(serverless_db_shared_endpoints)))) -def test_create_table_using_dedicated_nodes(ydb_hostel_db, ydb_serverless_db_with_nodes, ydb_endpoint, ydb_cluster): +def test_create_table_using_exclusive_nodes(ydb_serverless_db_with_exclusive_nodes, ydb_endpoint, ydb_cluster): alter_database_serverless_compute_resources_mode( ydb_cluster, - ydb_serverless_db_with_nodes, - "SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED" + ydb_serverless_db_with_exclusive_nodes, + "SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE" ) - database = ydb_serverless_db_with_nodes + database = ydb_serverless_db_with_exclusive_nodes driver_config = ydb.DriverConfig(ydb_endpoint, database) driver = ydb.Driver(driver_config) driver.wait(120) @@ -579,20 +579,20 @@ def drop_table(session, path): path ) - table_path = os.path.join(dir_path, "create_table_with_dedicated_nodes_table") + table_path = os.path.join(dir_path, "create_table_with_exclusive_nodes_table") pool.retry_operation_sync(create_table, None, table_path) pool.retry_operation_sync(write_some_data, None, table_path) pool.retry_operation_sync(drop_table, None, table_path) -def test_seamless_migration_to_dedicated_nodes(ydb_hostel_db, ydb_serverless_db_with_nodes, ydb_endpoint, ydb_cluster): +def test_seamless_migration_to_exclusive_nodes(ydb_serverless_db_with_exclusive_nodes, ydb_endpoint, ydb_cluster): alter_database_serverless_compute_resources_mode( ydb_cluster, - ydb_serverless_db_with_nodes, - "SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED" + ydb_serverless_db_with_exclusive_nodes, + "SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED" ) - database = ydb_serverless_db_with_nodes + database = ydb_serverless_db_with_exclusive_nodes driver_config = ydb.DriverConfig(ydb_endpoint, database) driver = ydb.Driver(driver_config) driver.wait(120) @@ -613,8 +613,8 @@ def test_seamless_migration_to_dedicated_nodes(ydb_hostel_db, ydb_serverless_db_ alter_database_serverless_compute_resources_mode( ydb_cluster, - ydb_serverless_db_with_nodes, - "SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED" + ydb_serverless_db_with_exclusive_nodes, + "SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE" ) # Old session keeps work fine with old connections to shared nodes @@ -628,7 +628,7 @@ def test_seamless_migration_to_dedicated_nodes(ydb_hostel_db, ydb_serverless_db_ newDriver.wait(120) session._driver = newDriver - # Old session works fine with new connections to dedicated nodes + # Old session works fine with new connections to exclusive nodes session.transaction().execute( f"UPSERT INTO `{path}` (id) VALUES (7), (8), (9);", commit_tx=True From 95b4ea23bdf958ecae70c2c3c547e95393d11cc9 Mon Sep 17 00:00:00 2001 From: Ilia Shakhov Date: Thu, 18 Jan 2024 12:55:29 +0000 Subject: [PATCH 2/7] Add shared compute resources mode as default for serverless KIKIMR-20642 --- ydb/core/discovery/discovery.cpp | 4 +- ydb/core/mind/hive/domain_info.cpp | 2 + ydb/core/mind/hive/hive_domains.cpp | 3 + ydb/core/mind/hive/hive_ut.cpp | 104 +++++++++++++++++- ydb/core/protos/subdomains.proto | 3 +- ydb/core/tx/schemeshard/schemeshard__init.cpp | 8 ++ ...emeshard__operation_alter_extsubdomain.cpp | 8 +- .../ut_serverless/ut_serverless.cpp | 20 +++- .../ut_serverless_reboots.cpp | 12 +- .../functional/serverless/test_serverless.py | 4 +- 10 files changed, 147 insertions(+), 21 deletions(-) diff --git a/ydb/core/discovery/discovery.cpp b/ydb/core/discovery/discovery.cpp index aa3aee5221dc..23453f727826 100644 --- a/ydb/core/discovery/discovery.cpp +++ b/ydb/core/discovery/discovery.cpp @@ -502,7 +502,9 @@ class TDiscoverer: public TActorBootstrapped { switch (domainInfo->ServerlessComputeResourcesMode) { case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE: return false; - case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED: + case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED: + return true; + default: return true; } } diff --git a/ydb/core/mind/hive/domain_info.cpp b/ydb/core/mind/hive/domain_info.cpp index 13e27ebaaf65..c78cc62f73b5 100644 --- a/ydb/core/mind/hive/domain_info.cpp +++ b/ydb/core/mind/hive/domain_info.cpp @@ -11,6 +11,8 @@ ENodeSelectionPolicy TDomainInfo::GetNodeSelectionPolicy() const { switch (*ServerlessComputeResourcesMode) { case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE: return ENodeSelectionPolicy::PreferObjectDomain; + case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED: + return ENodeSelectionPolicy::Default; default: return ENodeSelectionPolicy::Default; } diff --git a/ydb/core/mind/hive/hive_domains.cpp b/ydb/core/mind/hive/hive_domains.cpp index 0f5536f18a4d..12a2c0e9c698 100644 --- a/ydb/core/mind/hive/hive_domains.cpp +++ b/ydb/core/mind/hive/hive_domains.cpp @@ -51,6 +51,9 @@ void THive::Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev) { Domains[key].Path = path; if (entry.DomainInfo) { Domains[key].HiveId = entry.DomainInfo->Params.GetHive(); + if (entry.DomainInfo->ServerlessComputeResourcesMode && Domains[key].ServerlessComputeResourcesMode.Empty()) { + Domains[key].ServerlessComputeResourcesMode = entry.DomainInfo->ServerlessComputeResourcesMode; + } } BLOG_D("Received NavigateKeySetResult for domain " << entry.TableId << " with path " << path); Execute(CreateUpdateDomain(key)); diff --git a/ydb/core/mind/hive/hive_ut.cpp b/ydb/core/mind/hive/hive_ut.cpp index 47c9722aabea..572b8e8f5ef0 100644 --- a/ydb/core/mind/hive/hive_ut.cpp +++ b/ydb/core/mind/hive/hive_ut.cpp @@ -6096,7 +6096,7 @@ Y_UNIT_TEST_SUITE(THiveTest) { ev->Record.SetTxId(++txId); ev->Record.MutableDomainKey()->SetSchemeShard(subdomainKey.GetSchemeShard()); ev->Record.MutableDomainKey()->SetPathId(subdomainKey.GetPathId()); - ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED); + ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED); runtime.SendToPipe(hiveTablet, sender, ev.Release()); TAutoPtr handle; TEvHive::TEvUpdateDomainReply* response = runtime.GrabEdgeEventRethrow(handle); @@ -6120,6 +6120,108 @@ Y_UNIT_TEST_SUITE(THiveTest) { runtime.SimulateSleep(TDuration::Seconds(1)); MakeSureTabletIsDown(runtime, dummyTabletId, 0); // can't start because there are no allowed domain nodes } + + Y_UNIT_TEST(TestResetServerlessComputeResourcesMode) { + TTestBasicRuntime runtime(2, false); + Setup(runtime, true); + + const ui64 hiveTablet = MakeDefaultHiveID(0); + const ui64 testerTablet = MakeDefaultHiveID(1); + const TActorId hiveActor = CreateTestBootstrapper(runtime, CreateTestTabletInfo(hiveTablet, TTabletTypes::Hive), &CreateDefaultHive); + runtime.EnableScheduleForActor(hiveActor); + CreateTestBootstrapper(runtime, CreateTestTabletInfo(TTestTxConfig::SchemeShard, TTabletTypes::SchemeShard), &CreateFlatTxSchemeShard); + MakeSureTabletIsUp(runtime, hiveTablet, 0); // root hive good + MakeSureTabletIsUp(runtime, TTestTxConfig::SchemeShard, 0); // root ss good + + TActorId sender = runtime.AllocateEdgeActor(0); + InitSchemeRoot(runtime, sender); + + // Create subdomain + ui32 txId = 100; + TSubDomainKey subdomainKey; + do { + auto modifyScheme = MakeHolder(); + modifyScheme->Record.SetTxId(++txId); + auto* transaction = modifyScheme->Record.AddTransaction(); + transaction->SetWorkingDir("/dc-1"); + transaction->SetOperationType(NKikimrSchemeOp::ESchemeOpCreateExtSubDomain); + auto* subdomain = transaction->MutableSubDomain(); + subdomain->SetName("tenant1"); + runtime.SendToPipe(TTestTxConfig::SchemeShard, sender, modifyScheme.Release()); + TAutoPtr handle; + auto reply = runtime.GrabEdgeEventRethrow(handle, TDuration::MilliSeconds(100)); + if (reply) { + subdomainKey = TSubDomainKey(reply->Record.GetSchemeshardId(), reply->Record.GetPathId()); + UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetStatus(), NKikimrScheme::EStatus::StatusAccepted); + break; + } + } while (true); + + // Start local for subdomain + SendKillLocal(runtime, 1); + CreateLocalForTenant(runtime, 1, "/dc-1/tenant1"); + + THolder createTablet = MakeHolder(testerTablet, 1, TTabletTypes::Dummy, BINDED_CHANNELS); + createTablet->Record.AddAllowedDomains(); + createTablet->Record.MutableAllowedDomains(0)->SetSchemeShard(TTestTxConfig::SchemeShard); + createTablet->Record.MutableAllowedDomains(0)->SetPathId(1); + createTablet->Record.MutableObjectDomain()->SetSchemeShard(subdomainKey.GetSchemeShard()); + createTablet->Record.MutableObjectDomain()->SetPathId(subdomainKey.GetPathId()); + ui64 dummyTabletId = SendCreateTestTablet(runtime, hiveTablet, testerTablet, std::move(createTablet), 0, true); + + MakeSureTabletIsUp(runtime, dummyTabletId, 0); + AssertTabletStartedOnNode(runtime, dummyTabletId, 0); // started in allowed domain + + { + auto ev = MakeHolder(); + ev->Record.SetTxId(++txId); + ev->Record.MutableDomainKey()->SetSchemeShard(subdomainKey.GetSchemeShard()); + ev->Record.MutableDomainKey()->SetPathId(subdomainKey.GetPathId()); + ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE); + runtime.SendToPipe(hiveTablet, sender, ev.Release()); + TAutoPtr handle; + TEvHive::TEvUpdateDomainReply* response = runtime.GrabEdgeEventRethrow(handle); + UNIT_ASSERT_VALUES_EQUAL(response->Record.GetTxId(), txId); + UNIT_ASSERT_VALUES_EQUAL(response->Record.GetOrigin(), hiveTablet); + } + + // restart to kick tablet + SendKillLocal(runtime, 0); + { + TDispatchOptions options; + options.FinalEvents.emplace_back(TEvLocal::EvStopTablet); + runtime.DispatchEvents(options); + } + CreateLocal(runtime, 0); + + MakeSureTabletIsUp(runtime, dummyTabletId, 0); + AssertTabletStartedOnNode(runtime, dummyTabletId, 1); // started in object domain + + // reset ServerlessComputeResourcesMode + { + auto ev = MakeHolder(); + ev->Record.SetTxId(++txId); + ev->Record.MutableDomainKey()->SetSchemeShard(subdomainKey.GetSchemeShard()); + ev->Record.MutableDomainKey()->SetPathId(subdomainKey.GetPathId()); + runtime.SendToPipe(hiveTablet, sender, ev.Release()); + TAutoPtr handle; + TEvHive::TEvUpdateDomainReply* response = runtime.GrabEdgeEventRethrow(handle); + UNIT_ASSERT_VALUES_EQUAL(response->Record.GetTxId(), txId); + UNIT_ASSERT_VALUES_EQUAL(response->Record.GetOrigin(), hiveTablet); + } + + // restart to kick tablet + SendKillLocal(runtime, 1); + { + TDispatchOptions options; + options.FinalEvents.emplace_back(TEvLocal::EvStopTablet); + runtime.DispatchEvents(options); + } + CreateLocalForTenant(runtime, 1, "/dc-1/tenant1"); + + MakeSureTabletIsUp(runtime, dummyTabletId, 0); + AssertTabletStartedOnNode(runtime, dummyTabletId, 0); // started in allowed domain + } } } diff --git a/ydb/core/protos/subdomains.proto b/ydb/core/protos/subdomains.proto index 9c26cf2726b7..c22308cdb538 100644 --- a/ydb/core/protos/subdomains.proto +++ b/ydb/core/protos/subdomains.proto @@ -117,5 +117,6 @@ message TSchemeQuota { enum EServerlessComputeResourcesMode { SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED = 0; - SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE = 1; + SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED = 1; // using nodes that serve shared resources domain + SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE = 2; // using nodes that serve self domain } diff --git a/ydb/core/tx/schemeshard/schemeshard__init.cpp b/ydb/core/tx/schemeshard/schemeshard__init.cpp index f0ca056958b6..832c0e3c7a90 100644 --- a/ydb/core/tx/schemeshard/schemeshard__init.cpp +++ b/ydb/core/tx/schemeshard/schemeshard__init.cpp @@ -1535,6 +1535,10 @@ struct TSchemeShard::TTxInit : public TTransactionBase { domainInfo->SetServerlessComputeResourcesMode( rowset.GetValue() ); + } else if (pathId != domainInfo->GetResourcesDomainId()) { + domainInfo->SetServerlessComputeResourcesMode( + NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED + ); } } @@ -1603,6 +1607,10 @@ struct TSchemeShard::TTxInit : public TTransactionBase { alter->SetServerlessComputeResourcesMode( rowset.GetValue() ); + } else if (pathId != alter->GetResourcesDomainId()) { + alter->SetServerlessComputeResourcesMode( + NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED + ); } subdomainInfo->SetAlter(alter); diff --git a/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp b/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp index f25b3b9b21e3..a4506ca3b7bb 100644 --- a/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp +++ b/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp @@ -274,7 +274,9 @@ VerifyParams(TParamsDelta* delta, const TPathId pathId, const TSubDomainInfo::TP switch (input.GetServerlessComputeResourcesMode()) { case EServerlessComputeResourcesMode::SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED: + return paramError("can not set ServerlessComputeResourcesMode to SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED"); case EServerlessComputeResourcesMode::SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE: + case EServerlessComputeResourcesMode::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED: break; // ok default: return paramError("unknown ServerlessComputeResourcesMode"); @@ -285,11 +287,7 @@ VerifyParams(TParamsDelta* delta, const TPathId pathId, const TSubDomainInfo::TP return paramError("ServerlessComputeResourcesMode can be changed only for serverless"); } - if (input.GetServerlessComputeResourcesMode()) { - serverlessComputeResourcesModeChanged = current->GetServerlessComputeResourcesMode() != input.GetServerlessComputeResourcesMode(); - } else { - serverlessComputeResourcesModeChanged = current->GetServerlessComputeResourcesMode().Defined(); - } + serverlessComputeResourcesModeChanged = current->GetServerlessComputeResourcesMode() != input.GetServerlessComputeResourcesMode(); } delta->CoordinatorsAdded = coordinatorsAdded; diff --git a/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp b/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp index 58848306905a..3e4b73b82ba7 100644 --- a/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp +++ b/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp @@ -288,7 +288,8 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { TestDescribeResult(DescribePath(runtime, "/MyRoot/SharedDB"), {NLs::PathExist, NLs::IsExternalSubDomain("SharedDB"), - NLs::ExtractDomainHive(&sharedHive)}); + NLs::ExtractDomainHive(&sharedHive), + NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED)}); TString createData = Sprintf( R"( @@ -324,7 +325,7 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { TestDescribeResult(DescribePath(runtime, "/MyRoot/ServerLess0"), {NLs::PathExist, NLs::IsExternalSubDomain("ServerLess0"), - NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED), + NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED), NLs::ExtractTenantSchemeshard(&tenantSchemeShard)}); UNIT_ASSERT(tenantSchemeShard != 0 @@ -333,7 +334,7 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { TestDescribeResult(DescribePath(runtime, tenantSchemeShard, "/MyRoot/ServerLess0"), {NLs::PathExist, - NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED)}); + NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED)}); auto checkServerlessComputeResourcesMode = [&](EServerlessComputeResourcesMode serverlessComputeResourcesMode) { TString alterData = Sprintf( @@ -354,7 +355,7 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { }; checkServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE); - checkServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED); + checkServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED); } Y_UNIT_TEST(TestServerlessComputeResourcesModeValidation) { @@ -421,11 +422,20 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { // Try to change ServerlessComputeResourcesMode not on serverless database TestAlterExtSubDomain(runtime, ++txId, "/MyRoot", R"( - ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE + ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED Name: "SharedDB" )", {{ TEvSchemeShard::EStatus::StatusInvalidParameter, "only for serverless" }} ); + + // Try to set ServerlessComputeResourcesMode to SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED + TestAlterExtSubDomain(runtime, ++txId, "/MyRoot", + R"( + ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED + Name: "ServerLess0" + )", + {{ TEvSchemeShard::EStatus::StatusInvalidParameter, "SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED" }} + ); } diff --git a/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp b/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp index c2655b5c2655..79a0e1665f4d 100644 --- a/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp +++ b/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp @@ -109,11 +109,11 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLessReboots) { TestDescribeResult(DescribePath(runtime, "/MyRoot/ServerLess0"), {NLs::PathExist, NLs::IsExternalSubDomain("ServerLess0"), - NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED), + NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED), NLs::ExtractTenantSchemeshard(&tenantSchemeShard)}); TestDescribeResult(DescribePath(runtime, tenantSchemeShard, "/MyRoot/ServerLess0"), {NLs::PathExist, - NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED)}); + NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED)}); } TestAlterExtSubDomain(runtime, ++t.TxId, "/MyRoot", @@ -136,7 +136,7 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLessReboots) { TestAlterExtSubDomain(runtime, ++t.TxId, "/MyRoot", R"( - ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED + ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED Name: "ServerLess0" )" ); @@ -145,11 +145,11 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLessReboots) { { TInactiveZone inactive(activeZone); TestDescribeResult(DescribePath(runtime, "/MyRoot/ServerLess0"), - {NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED)}); + {NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED)}); t.TestEnv->TestServerlessComputeResourcesModeInHive(runtime, "/MyRoot/ServerLess0", - SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED, sharedHive); + SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED, sharedHive); TestTenantSchemeShardSync(t, runtime, tenantSchemeShard, "/MyRoot/ServerLess0", - ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED)); + ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED)); } }); } diff --git a/ydb/tests/functional/serverless/test_serverless.py b/ydb/tests/functional/serverless/test_serverless.py index c3e63cafd250..8038d16df295 100644 --- a/ydb/tests/functional/serverless/test_serverless.py +++ b/ydb/tests/functional/serverless/test_serverless.py @@ -525,7 +525,7 @@ def list_endpoints(database): alter_database_serverless_compute_resources_mode( ydb_cluster, ydb_serverless_db_with_exclusive_nodes, - "SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED" + "SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED" ) serverless_db_shared_endpoints = list_endpoints(ydb_serverless_db_with_exclusive_nodes) hostel_db_endpoints = list_endpoints(ydb_hostel_db) @@ -589,7 +589,7 @@ def test_seamless_migration_to_exclusive_nodes(ydb_serverless_db_with_exclusive_ alter_database_serverless_compute_resources_mode( ydb_cluster, ydb_serverless_db_with_exclusive_nodes, - "SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED" + "SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED" ) database = ydb_serverless_db_with_exclusive_nodes From eb97e591065a319cdbe29658a66ccba18e73327d Mon Sep 17 00:00:00 2001 From: Ilia Shakhov Date: Thu, 18 Jan 2024 15:32:59 +0000 Subject: [PATCH 3/7] Add maybe to scheme cache KIKIMR-20642 --- ydb/core/base/subdomain.h | 2 +- ydb/core/discovery/discovery.cpp | 6 +++++- ydb/core/mind/hive/domain_info.cpp | 2 +- ydb/core/mind/hive/hive_domains.cpp | 4 ++-- ydb/core/testlib/tablet_helpers.cpp | 8 ++++++-- ydb/core/tx/scheme_cache/scheme_cache.h | 9 ++++++--- .../schemeshard__operation_alter_extsubdomain.cpp | 2 +- 7 files changed, 22 insertions(+), 11 deletions(-) diff --git a/ydb/core/base/subdomain.h b/ydb/core/base/subdomain.h index 3849bd8ca816..e7c1bcc3e304 100644 --- a/ydb/core/base/subdomain.h +++ b/ydb/core/base/subdomain.h @@ -31,7 +31,7 @@ struct TSubDomainKey : public std::pair { static const TSubDomainKey InvalidSubDomainKey = TSubDomainKey(); -using TMaybeServerlessComputeResourcesMode = TMaybe; +using TMaybeServerlessComputeResourcesMode = TMaybeFail; } template <> diff --git a/ydb/core/discovery/discovery.cpp b/ydb/core/discovery/discovery.cpp index 23453f727826..b1c4e5a3e3e2 100644 --- a/ydb/core/discovery/discovery.cpp +++ b/ydb/core/discovery/discovery.cpp @@ -499,7 +499,11 @@ class TDiscoverer: public TActorBootstrapped { return false; } - switch (domainInfo->ServerlessComputeResourcesMode) { + if (domainInfo->ServerlessComputeResourcesMode.Empty()) { + return true; + } + + switch (*domainInfo->ServerlessComputeResourcesMode) { case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE: return false; case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED: diff --git a/ydb/core/mind/hive/domain_info.cpp b/ydb/core/mind/hive/domain_info.cpp index c78cc62f73b5..33b1e70b89c8 100644 --- a/ydb/core/mind/hive/domain_info.cpp +++ b/ydb/core/mind/hive/domain_info.cpp @@ -4,7 +4,7 @@ namespace NKikimr { namespace NHive { ENodeSelectionPolicy TDomainInfo::GetNodeSelectionPolicy() const { - if (!ServerlessComputeResourcesMode) { + if (ServerlessComputeResourcesMode.Empty()) { return ENodeSelectionPolicy::Default; } diff --git a/ydb/core/mind/hive/hive_domains.cpp b/ydb/core/mind/hive/hive_domains.cpp index 12a2c0e9c698..89812d87f052 100644 --- a/ydb/core/mind/hive/hive_domains.cpp +++ b/ydb/core/mind/hive/hive_domains.cpp @@ -51,7 +51,7 @@ void THive::Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev) { Domains[key].Path = path; if (entry.DomainInfo) { Domains[key].HiveId = entry.DomainInfo->Params.GetHive(); - if (entry.DomainInfo->ServerlessComputeResourcesMode && Domains[key].ServerlessComputeResourcesMode.Empty()) { + if (Domains[key].ServerlessComputeResourcesMode.Empty()) { Domains[key].ServerlessComputeResourcesMode = entry.DomainInfo->ServerlessComputeResourcesMode; } } @@ -69,7 +69,7 @@ void THive::Handle(TEvHive::TEvUpdateDomain::TPtr& ev) { BLOG_D("Handle TEvHive::TEvUpdateDomain(" << ev->Get()->Record.ShortDebugString() << ")"); const TSubDomainKey subdomainKey(ev->Get()->Record.GetDomainKey()); TDomainInfo& domainInfo = Domains[subdomainKey]; - if (ev->Get()->Record.GetServerlessComputeResourcesMode() != NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED) { + if (ev->Get()->Record.HasServerlessComputeResourcesMode()) { domainInfo.ServerlessComputeResourcesMode = ev->Get()->Record.GetServerlessComputeResourcesMode(); } else { domainInfo.ServerlessComputeResourcesMode.Clear(); diff --git a/ydb/core/testlib/tablet_helpers.cpp b/ydb/core/testlib/tablet_helpers.cpp index 5d62205c0c6f..61cd38d945a4 100644 --- a/ydb/core/testlib/tablet_helpers.cpp +++ b/ydb/core/testlib/tablet_helpers.cpp @@ -1447,8 +1447,12 @@ namespace NKikimr { const TSubDomainKey subdomainKey(ev->Get()->Record.GetDomainKey()); NHive::TDomainInfo& domainInfo = State->Domains[subdomainKey]; - domainInfo.ServerlessComputeResourcesMode = ev->Get()->Record.GetServerlessComputeResourcesMode(); - + if (ev->Get()->Record.HasServerlessComputeResourcesMode()) { + domainInfo.ServerlessComputeResourcesMode = ev->Get()->Record.GetServerlessComputeResourcesMode(); + } else { + domainInfo.ServerlessComputeResourcesMode.Clear(); + } + auto response = std::make_unique(); response->Record.SetTxId(ev->Get()->Record.GetTxId()); response->Record.SetOrigin(TabletID()); diff --git a/ydb/core/tx/scheme_cache/scheme_cache.h b/ydb/core/tx/scheme_cache/scheme_cache.h index 18b456aaad41..5ccea3f421a1 100644 --- a/ydb/core/tx/scheme_cache/scheme_cache.h +++ b/ydb/core/tx/scheme_cache/scheme_cache.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -55,13 +56,16 @@ struct TDomainInfo : public TAtomicRefCount { : DomainKey(GetDomainKey(descr.GetDomainKey())) , Params(descr.GetProcessingParams()) , Coordinators(descr.GetProcessingParams()) - , ServerlessComputeResourcesMode(descr.GetServerlessComputeResourcesMode()) { if (descr.HasResourcesDomainKey()) { ResourcesDomainKey = GetDomainKey(descr.GetResourcesDomainKey()); } else { ResourcesDomainKey = DomainKey; } + + if (descr.HasServerlessComputeResourcesMode()) { + ServerlessComputeResourcesMode = descr.GetServerlessComputeResourcesMode(); + } } inline ui64 GetVersion() const { @@ -84,8 +88,7 @@ struct TDomainInfo : public TAtomicRefCount { TPathId ResourcesDomainKey; NKikimrSubDomains::TProcessingParams Params; TCoordinators Coordinators; - NKikimrSubDomains::EServerlessComputeResourcesMode ServerlessComputeResourcesMode = - NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED; + TMaybeServerlessComputeResourcesMode ServerlessComputeResourcesMode; TString ToString() const; diff --git a/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp b/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp index a4506ca3b7bb..f2a03e553108 100644 --- a/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp +++ b/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp @@ -769,7 +769,7 @@ class TSyncHive: public TSubOperationState { event->Record.MutableDomainKey()->SetSchemeShard(pathId.OwnerId); event->Record.MutableDomainKey()->SetPathId(pathId.LocalPathId); const auto& serverlessComputeResourcesMode = subDomain->GetServerlessComputeResourcesMode(); - if (serverlessComputeResourcesMode) { + if (serverlessComputeResourcesMode.Defined()) { event->Record.SetServerlessComputeResourcesMode(*serverlessComputeResourcesMode); } From 614c6b2d573b619eb17ba7044742a9764c239ee6 Mon Sep 17 00:00:00 2001 From: Ilia Shakhov Date: Thu, 18 Jan 2024 16:01:45 +0000 Subject: [PATCH 4/7] Make enum values consistent with other enums in describe KIKIMR-20642 --- ydb/core/discovery/discovery.cpp | 6 +++--- ydb/core/mind/hive/domain_info.cpp | 4 ++-- ydb/core/mind/hive/hive_ut.cpp | 8 ++++---- ydb/core/protos/subdomains.proto | 6 +++--- ydb/core/tx/schemeshard/schemeshard__init.cpp | 4 ++-- ...emeshard__operation_alter_extsubdomain.cpp | 8 ++++---- .../ut_serverless/ut_serverless.cpp | 20 +++++++++---------- .../ut_serverless_reboots.cpp | 20 +++++++++---------- .../functional/serverless/test_serverless.py | 10 +++++----- 9 files changed, 43 insertions(+), 43 deletions(-) diff --git a/ydb/core/discovery/discovery.cpp b/ydb/core/discovery/discovery.cpp index b1c4e5a3e3e2..4bffc082bce6 100644 --- a/ydb/core/discovery/discovery.cpp +++ b/ydb/core/discovery/discovery.cpp @@ -502,11 +502,11 @@ class TDiscoverer: public TActorBootstrapped { if (domainInfo->ServerlessComputeResourcesMode.Empty()) { return true; } - + switch (*domainInfo->ServerlessComputeResourcesMode) { - case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE: + case NKikimrSubDomains::EServerlessComputeResourcesModeExclusive: return false; - case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED: + case NKikimrSubDomains::EServerlessComputeResourcesModeShared: return true; default: return true; diff --git a/ydb/core/mind/hive/domain_info.cpp b/ydb/core/mind/hive/domain_info.cpp index 33b1e70b89c8..5c47ee219cb7 100644 --- a/ydb/core/mind/hive/domain_info.cpp +++ b/ydb/core/mind/hive/domain_info.cpp @@ -9,9 +9,9 @@ ENodeSelectionPolicy TDomainInfo::GetNodeSelectionPolicy() const { } switch (*ServerlessComputeResourcesMode) { - case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE: + case NKikimrSubDomains::EServerlessComputeResourcesModeExclusive: return ENodeSelectionPolicy::PreferObjectDomain; - case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED: + case NKikimrSubDomains::EServerlessComputeResourcesModeShared: return ENodeSelectionPolicy::Default; default: return ENodeSelectionPolicy::Default; diff --git a/ydb/core/mind/hive/hive_ut.cpp b/ydb/core/mind/hive/hive_ut.cpp index 572b8e8f5ef0..b45e174fd9c3 100644 --- a/ydb/core/mind/hive/hive_ut.cpp +++ b/ydb/core/mind/hive/hive_ut.cpp @@ -6015,7 +6015,7 @@ Y_UNIT_TEST_SUITE(THiveTest) { UNIT_ASSERT(foundTablet); } - Y_UNIT_TEST(TestDomainNodeSelectionPolicy) { + Y_UNIT_TEST(TestServerlessComputeResourcesMode) { TTestBasicRuntime runtime(2, false); Setup(runtime, true); @@ -6071,7 +6071,7 @@ Y_UNIT_TEST_SUITE(THiveTest) { ev->Record.SetTxId(++txId); ev->Record.MutableDomainKey()->SetSchemeShard(subdomainKey.GetSchemeShard()); ev->Record.MutableDomainKey()->SetPathId(subdomainKey.GetPathId()); - ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE); + ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::EServerlessComputeResourcesModeExclusive); runtime.SendToPipe(hiveTablet, sender, ev.Release()); TAutoPtr handle; TEvHive::TEvUpdateDomainReply* response = runtime.GrabEdgeEventRethrow(handle); @@ -6096,7 +6096,7 @@ Y_UNIT_TEST_SUITE(THiveTest) { ev->Record.SetTxId(++txId); ev->Record.MutableDomainKey()->SetSchemeShard(subdomainKey.GetSchemeShard()); ev->Record.MutableDomainKey()->SetPathId(subdomainKey.GetPathId()); - ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED); + ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::EServerlessComputeResourcesModeShared); runtime.SendToPipe(hiveTablet, sender, ev.Release()); TAutoPtr handle; TEvHive::TEvUpdateDomainReply* response = runtime.GrabEdgeEventRethrow(handle); @@ -6177,7 +6177,7 @@ Y_UNIT_TEST_SUITE(THiveTest) { ev->Record.SetTxId(++txId); ev->Record.MutableDomainKey()->SetSchemeShard(subdomainKey.GetSchemeShard()); ev->Record.MutableDomainKey()->SetPathId(subdomainKey.GetPathId()); - ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE); + ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::EServerlessComputeResourcesModeExclusive); runtime.SendToPipe(hiveTablet, sender, ev.Release()); TAutoPtr handle; TEvHive::TEvUpdateDomainReply* response = runtime.GrabEdgeEventRethrow(handle); diff --git a/ydb/core/protos/subdomains.proto b/ydb/core/protos/subdomains.proto index c22308cdb538..f6a2843307ed 100644 --- a/ydb/core/protos/subdomains.proto +++ b/ydb/core/protos/subdomains.proto @@ -116,7 +116,7 @@ message TSchemeQuota { } enum EServerlessComputeResourcesMode { - SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED = 0; - SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED = 1; // using nodes that serve shared resources domain - SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE = 2; // using nodes that serve self domain + EServerlessComputeResourcesModeUnspecified = 0; + EServerlessComputeResourcesModeShared = 1; // Using nodes that serve shared resources domain + EServerlessComputeResourcesModeExclusive = 2; // Using nodes that serve self domain } diff --git a/ydb/core/tx/schemeshard/schemeshard__init.cpp b/ydb/core/tx/schemeshard/schemeshard__init.cpp index 832c0e3c7a90..fbbb02f2c3a4 100644 --- a/ydb/core/tx/schemeshard/schemeshard__init.cpp +++ b/ydb/core/tx/schemeshard/schemeshard__init.cpp @@ -1537,7 +1537,7 @@ struct TSchemeShard::TTxInit : public TTransactionBase { ); } else if (pathId != domainInfo->GetResourcesDomainId()) { domainInfo->SetServerlessComputeResourcesMode( - NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED + NKikimrSubDomains::EServerlessComputeResourcesModeShared ); } } @@ -1609,7 +1609,7 @@ struct TSchemeShard::TTxInit : public TTransactionBase { ); } else if (pathId != alter->GetResourcesDomainId()) { alter->SetServerlessComputeResourcesMode( - NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED + NKikimrSubDomains::EServerlessComputeResourcesModeShared ); } diff --git a/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp b/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp index f2a03e553108..eabfe8042b64 100644 --- a/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp +++ b/ydb/core/tx/schemeshard/schemeshard__operation_alter_extsubdomain.cpp @@ -273,10 +273,10 @@ VerifyParams(TParamsDelta* delta, const TPathId pathId, const TSubDomainInfo::TP } switch (input.GetServerlessComputeResourcesMode()) { - case EServerlessComputeResourcesMode::SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED: - return paramError("can not set ServerlessComputeResourcesMode to SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED"); - case EServerlessComputeResourcesMode::SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE: - case EServerlessComputeResourcesMode::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED: + case EServerlessComputeResourcesMode::EServerlessComputeResourcesModeUnspecified: + return paramError("can not set ServerlessComputeResourcesMode to EServerlessComputeResourcesModeUnspecified"); + case EServerlessComputeResourcesMode::EServerlessComputeResourcesModeExclusive: + case EServerlessComputeResourcesMode::EServerlessComputeResourcesModeShared: break; // ok default: return paramError("unknown ServerlessComputeResourcesMode"); diff --git a/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp b/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp index 3e4b73b82ba7..5a5578434b7f 100644 --- a/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp +++ b/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp @@ -289,7 +289,7 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { {NLs::PathExist, NLs::IsExternalSubDomain("SharedDB"), NLs::ExtractDomainHive(&sharedHive), - NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED)}); + NLs::ServerlessComputeResourcesMode(EServerlessComputeResourcesModeUnspecified)}); TString createData = Sprintf( R"( @@ -325,7 +325,7 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { TestDescribeResult(DescribePath(runtime, "/MyRoot/ServerLess0"), {NLs::PathExist, NLs::IsExternalSubDomain("ServerLess0"), - NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED), + NLs::ServerlessComputeResourcesMode(EServerlessComputeResourcesModeShared), NLs::ExtractTenantSchemeshard(&tenantSchemeShard)}); UNIT_ASSERT(tenantSchemeShard != 0 @@ -334,7 +334,7 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { TestDescribeResult(DescribePath(runtime, tenantSchemeShard, "/MyRoot/ServerLess0"), {NLs::PathExist, - NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED)}); + NLs::ServerlessComputeResourcesMode(EServerlessComputeResourcesModeShared)}); auto checkServerlessComputeResourcesMode = [&](EServerlessComputeResourcesMode serverlessComputeResourcesMode) { TString alterData = Sprintf( @@ -354,8 +354,8 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { env.TestServerlessComputeResourcesModeInHive(runtime, "/MyRoot/ServerLess0", serverlessComputeResourcesMode, sharedHive); }; - checkServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE); - checkServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED); + checkServerlessComputeResourcesMode(EServerlessComputeResourcesModeExclusive); + checkServerlessComputeResourcesMode(EServerlessComputeResourcesModeShared); } Y_UNIT_TEST(TestServerlessComputeResourcesModeValidation) { @@ -422,19 +422,19 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { // Try to change ServerlessComputeResourcesMode not on serverless database TestAlterExtSubDomain(runtime, ++txId, "/MyRoot", R"( - ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED + ServerlessComputeResourcesMode: EServerlessComputeResourcesModeShared Name: "SharedDB" )", {{ TEvSchemeShard::EStatus::StatusInvalidParameter, "only for serverless" }} ); - // Try to set ServerlessComputeResourcesMode to SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED + // Try to set ServerlessComputeResourcesMode to EServerlessComputeResourcesModeUnspecified TestAlterExtSubDomain(runtime, ++txId, "/MyRoot", R"( - ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED + ServerlessComputeResourcesMode: EServerlessComputeResourcesModeUnspecified Name: "ServerLess0" )", - {{ TEvSchemeShard::EStatus::StatusInvalidParameter, "SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED" }} + {{ TEvSchemeShard::EStatus::StatusInvalidParameter, "EServerlessComputeResourcesModeUnspecified" }} ); } @@ -502,7 +502,7 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { TestAlterExtSubDomain(runtime, ++txId, "/MyRoot", R"( - ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE + ServerlessComputeResourcesMode: EServerlessComputeResourcesModeExclusive Name: "ServerLess0" )", {{ TEvSchemeShard::EStatus::StatusPreconditionFailed, "Unsupported: feature flag EnableServerlessExclusiveDynamicNodes is off" }} diff --git a/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp b/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp index 79a0e1665f4d..542e7d4985b3 100644 --- a/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp +++ b/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp @@ -109,16 +109,16 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLessReboots) { TestDescribeResult(DescribePath(runtime, "/MyRoot/ServerLess0"), {NLs::PathExist, NLs::IsExternalSubDomain("ServerLess0"), - NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED), + NLs::ServerlessComputeResourcesMode(EServerlessComputeResourcesModeShared), NLs::ExtractTenantSchemeshard(&tenantSchemeShard)}); TestDescribeResult(DescribePath(runtime, tenantSchemeShard, "/MyRoot/ServerLess0"), {NLs::PathExist, - NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED)}); + NLs::ServerlessComputeResourcesMode(EServerlessComputeResourcesModeShared)}); } TestAlterExtSubDomain(runtime, ++t.TxId, "/MyRoot", R"( - ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE + ServerlessComputeResourcesMode: EServerlessComputeResourcesModeExclusive Name: "ServerLess0" )" ); @@ -127,16 +127,16 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLessReboots) { { TInactiveZone inactive(activeZone); TestDescribeResult(DescribePath(runtime, "/MyRoot/ServerLess0"), - {NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE)}); + {NLs::ServerlessComputeResourcesMode(EServerlessComputeResourcesModeExclusive)}); t.TestEnv->TestServerlessComputeResourcesModeInHive(runtime, "/MyRoot/ServerLess0", - SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE, sharedHive); + EServerlessComputeResourcesModeExclusive, sharedHive); TestTenantSchemeShardSync(t, runtime, tenantSchemeShard, "/MyRoot/ServerLess0", - ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE)); + ServerlessComputeResourcesMode(EServerlessComputeResourcesModeExclusive)); } TestAlterExtSubDomain(runtime, ++t.TxId, "/MyRoot", R"( - ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED + ServerlessComputeResourcesMode: EServerlessComputeResourcesModeShared Name: "ServerLess0" )" ); @@ -145,11 +145,11 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLessReboots) { { TInactiveZone inactive(activeZone); TestDescribeResult(DescribePath(runtime, "/MyRoot/ServerLess0"), - {NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED)}); + {NLs::ServerlessComputeResourcesMode(EServerlessComputeResourcesModeShared)}); t.TestEnv->TestServerlessComputeResourcesModeInHive(runtime, "/MyRoot/ServerLess0", - SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED, sharedHive); + EServerlessComputeResourcesModeShared, sharedHive); TestTenantSchemeShardSync(t, runtime, tenantSchemeShard, "/MyRoot/ServerLess0", - ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED)); + ServerlessComputeResourcesMode(EServerlessComputeResourcesModeShared)); } }); } diff --git a/ydb/tests/functional/serverless/test_serverless.py b/ydb/tests/functional/serverless/test_serverless.py index 8038d16df295..c81404989d60 100644 --- a/ydb/tests/functional/serverless/test_serverless.py +++ b/ydb/tests/functional/serverless/test_serverless.py @@ -525,7 +525,7 @@ def list_endpoints(database): alter_database_serverless_compute_resources_mode( ydb_cluster, ydb_serverless_db_with_exclusive_nodes, - "SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED" + "EServerlessComputeResourcesModeShared" ) serverless_db_shared_endpoints = list_endpoints(ydb_serverless_db_with_exclusive_nodes) hostel_db_endpoints = list_endpoints(ydb_hostel_db) @@ -537,7 +537,7 @@ def list_endpoints(database): alter_database_serverless_compute_resources_mode( ydb_cluster, ydb_serverless_db_with_exclusive_nodes, - "SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE" + "EServerlessComputeResourcesModeExclusive" ) serverless_db_dedicated_endpoints = list_endpoints(ydb_serverless_db_with_exclusive_nodes) @@ -549,7 +549,7 @@ def test_create_table_using_exclusive_nodes(ydb_serverless_db_with_exclusive_nod alter_database_serverless_compute_resources_mode( ydb_cluster, ydb_serverless_db_with_exclusive_nodes, - "SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE" + "EServerlessComputeResourcesModeExclusive" ) database = ydb_serverless_db_with_exclusive_nodes @@ -589,7 +589,7 @@ def test_seamless_migration_to_exclusive_nodes(ydb_serverless_db_with_exclusive_ alter_database_serverless_compute_resources_mode( ydb_cluster, ydb_serverless_db_with_exclusive_nodes, - "SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED" + "EServerlessComputeResourcesModeShared" ) database = ydb_serverless_db_with_exclusive_nodes @@ -614,7 +614,7 @@ def test_seamless_migration_to_exclusive_nodes(ydb_serverless_db_with_exclusive_ alter_database_serverless_compute_resources_mode( ydb_cluster, ydb_serverless_db_with_exclusive_nodes, - "SERVERLESS_COMPUTE_RESOURCES_MODE_EXCLUSIVE" + "EServerlessComputeResourcesModeExclusive" ) # Old session keeps work fine with old connections to shared nodes From f0b51685902ffddf96c9df9865acce425e502912 Mon Sep 17 00:00:00 2001 From: Ilia Shakhov Date: Thu, 18 Jan 2024 16:09:38 +0000 Subject: [PATCH 5/7] Rename all occurrences of 'dedicated' in python serverless test KIKIMR-20642 --- ydb/tests/functional/serverless/test_serverless.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ydb/tests/functional/serverless/test_serverless.py b/ydb/tests/functional/serverless/test_serverless.py index c81404989d60..da0b9109532b 100644 --- a/ydb/tests/functional/serverless/test_serverless.py +++ b/ydb/tests/functional/serverless/test_serverless.py @@ -539,10 +539,10 @@ def list_endpoints(database): ydb_serverless_db_with_exclusive_nodes, "EServerlessComputeResourcesModeExclusive" ) - serverless_db_dedicated_endpoints = list_endpoints(ydb_serverless_db_with_exclusive_nodes) + serverless_db_exclusive_endpoints = list_endpoints(ydb_serverless_db_with_exclusive_nodes) - assert_that(serverless_db_dedicated_endpoints, not_none()) - assert_that(serverless_db_dedicated_endpoints, only_contains(not_(is_in(serverless_db_shared_endpoints)))) + assert_that(serverless_db_exclusive_endpoints, not_none()) + assert_that(serverless_db_exclusive_endpoints, only_contains(not_(is_in(serverless_db_shared_endpoints)))) def test_create_table_using_exclusive_nodes(ydb_serverless_db_with_exclusive_nodes, ydb_endpoint, ydb_cluster): From d142f422584d63fa9b852440f34b8232c1c301b2 Mon Sep 17 00:00:00 2001 From: Ilia Shakhov Date: Fri, 19 Jan 2024 00:07:14 +0000 Subject: [PATCH 6/7] Add default serverless compute resources mode to CreateExtSubDomain KIKIMR-20642 --- ydb/core/protos/subdomains.proto | 2 +- ydb/core/tx/schemeshard/schemeshard__init.cpp | 4 +- ...meshard__operation_create_extsubdomain.cpp | 1 + ydb/core/tx/schemeshard/schemeshard_impl.h | 5 + .../ut_serverless/ut_serverless.cpp | 13 ++ .../ut_serverless_reboots.cpp | 138 +++++++++++------- ydb/tests/functional/serverless/conftest.py | 2 +- 7 files changed, 105 insertions(+), 60 deletions(-) diff --git a/ydb/core/protos/subdomains.proto b/ydb/core/protos/subdomains.proto index f6a2843307ed..79585c33ce6c 100644 --- a/ydb/core/protos/subdomains.proto +++ b/ydb/core/protos/subdomains.proto @@ -88,6 +88,7 @@ message TDomainDescription { optional uint64 ShardsLimit = 9; optional TDomainKey ResourcesDomainKey = 10; + optional fixed64 SharedHive = 22; optional EServerlessComputeResourcesMode ServerlessComputeResourcesMode = 23; optional TDiskSpaceUsage DiskSpaceUsage = 11; // TODO: temp for SLYDB-95 @@ -103,7 +104,6 @@ message TDomainDescription { optional NLoginProto.TSecurityState SecurityState = 20; optional TAuditSettings AuditSettings = 21; - optional fixed64 SharedHive = 22; } message TSchemeQuotas { diff --git a/ydb/core/tx/schemeshard/schemeshard__init.cpp b/ydb/core/tx/schemeshard/schemeshard__init.cpp index fbbb02f2c3a4..5592f5587819 100644 --- a/ydb/core/tx/schemeshard/schemeshard__init.cpp +++ b/ydb/core/tx/schemeshard/schemeshard__init.cpp @@ -1535,7 +1535,7 @@ struct TSchemeShard::TTxInit : public TTransactionBase { domainInfo->SetServerlessComputeResourcesMode( rowset.GetValue() ); - } else if (pathId != domainInfo->GetResourcesDomainId()) { + } else if (Self->IsServerlessDomain(domainInfo) || Self->IsServerlessDomainGlobal(pathId, domainInfo)) { domainInfo->SetServerlessComputeResourcesMode( NKikimrSubDomains::EServerlessComputeResourcesModeShared ); @@ -1607,7 +1607,7 @@ struct TSchemeShard::TTxInit : public TTransactionBase { alter->SetServerlessComputeResourcesMode( rowset.GetValue() ); - } else if (pathId != alter->GetResourcesDomainId()) { + } else if (Self->IsServerlessDomain(alter) || Self->IsServerlessDomainGlobal(pathId, alter)) { alter->SetServerlessComputeResourcesMode( NKikimrSubDomains::EServerlessComputeResourcesModeShared ); diff --git a/ydb/core/tx/schemeshard/schemeshard__operation_create_extsubdomain.cpp b/ydb/core/tx/schemeshard/schemeshard__operation_create_extsubdomain.cpp index 3bb61ca5b364..34270aad280d 100644 --- a/ydb/core/tx/schemeshard/schemeshard__operation_create_extsubdomain.cpp +++ b/ydb/core/tx/schemeshard/schemeshard__operation_create_extsubdomain.cpp @@ -217,6 +217,7 @@ class TCreateExtSubDomain: public TSubOperation { } alter->SetSharedHive(sharedHive); + alter->SetServerlessComputeResourcesMode(NKikimrSubDomains::EServerlessComputeResourcesModeShared); } if (settings.HasDeclaredSchemeQuotas()) { diff --git a/ydb/core/tx/schemeshard/schemeshard_impl.h b/ydb/core/tx/schemeshard/schemeshard_impl.h index 5d058ee89c3e..e7f9c4e3150c 100644 --- a/ydb/core/tx/schemeshard/schemeshard_impl.h +++ b/ydb/core/tx/schemeshard/schemeshard_impl.h @@ -333,6 +333,11 @@ class TSchemeShard return IsServerlessDomain(domain.DomainInfo()); } + bool IsServerlessDomainGlobal(TPathId domainPathId, TSubDomainInfo::TConstPtr domainInfo) const { + const auto& resourcesDomainId = domainInfo->GetResourcesDomainId(); + return IsDomainSchemeShard && resourcesDomainId && resourcesDomainId != domainPathId; + } + TPathId MakeLocalId(const TLocalPathId& localPathId) const { return TPathId(TabletID(), localPathId); } diff --git a/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp b/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp index 5a5578434b7f..1dd78d91a150 100644 --- a/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp +++ b/ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp @@ -285,10 +285,23 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) { env.TestWaitNotification(runtime, txId); ui64 sharedHive = 0; + ui64 sharedDbSchemeShard = 0; TestDescribeResult(DescribePath(runtime, "/MyRoot/SharedDB"), {NLs::PathExist, NLs::IsExternalSubDomain("SharedDB"), NLs::ExtractDomainHive(&sharedHive), + NLs::ExtractTenantSchemeshard(&sharedDbSchemeShard), + NLs::ServerlessComputeResourcesMode(EServerlessComputeResourcesModeUnspecified)}); + + UNIT_ASSERT(sharedHive != 0 + && sharedHive != (ui64)-1 + && sharedHive != TTestTxConfig::Hive); + UNIT_ASSERT(sharedDbSchemeShard != 0 + && sharedDbSchemeShard != (ui64)-1 + && sharedDbSchemeShard != TTestTxConfig::SchemeShard); + + TestDescribeResult(DescribePath(runtime, sharedDbSchemeShard, "/MyRoot/SharedDB"), + {NLs::PathExist, NLs::ServerlessComputeResourcesMode(EServerlessComputeResourcesModeUnspecified)}); TString createData = Sprintf( diff --git a/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp b/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp index 542e7d4985b3..317144fa2529 100644 --- a/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp +++ b/ydb/core/tx/schemeshard/ut_serverless_reboots/ut_serverless_reboots.cpp @@ -45,72 +45,98 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLessReboots) { t.Run([&](TTestActorRuntime& runtime, bool& activeZone) { ui64 sharedHive = 0; ui64 tenantSchemeShard = 0; + + TestCreateExtSubDomain(runtime, ++t.TxId, "/MyRoot", + R"(Name: "SharedDB")" + ); + t.TestEnv->TestWaitNotification(runtime, t.TxId); + + TestAlterExtSubDomain(runtime, ++t.TxId, "/MyRoot", + R"( + StoragePools { + Name: "pool-1" + Kind: "pool-kind-1" + } + StoragePools { + Name: "pool-2" + Kind: "pool-kind-2" + } + PlanResolution: 50 + Coordinators: 1 + Mediators: 1 + TimeCastBucketsPerMediator: 2 + ExternalSchemeShard: true + ExternalHive: true + Name: "SharedDB" + )" + ); + t.TestEnv->TestWaitNotification(runtime, t.TxId); + { TInactiveZone inactive(activeZone); - TestCreateExtSubDomain(runtime, ++t.TxId, "/MyRoot", - R"(Name: "SharedDB")" - ); - t.TestEnv->TestWaitNotification(runtime, t.TxId); - - TestAlterExtSubDomain(runtime, ++t.TxId, "/MyRoot", - R"( - StoragePools { - Name: "pool-1" - Kind: "pool-kind-1" - } - StoragePools { - Name: "pool-2" - Kind: "pool-kind-2" - } - PlanResolution: 50 - Coordinators: 1 - Mediators: 1 - TimeCastBucketsPerMediator: 2 - ExternalSchemeShard: true - ExternalHive: true - Name: "SharedDB" - )" - ); - t.TestEnv->TestWaitNotification(runtime, t.TxId); + ui64 sharedDbSchemeShard = 0; TestDescribeResult(DescribePath(runtime, "/MyRoot/SharedDB"), - {NLs::ExtractDomainHive(&sharedHive)}); - - TString createData = Sprintf( - R"( - ResourcesDomainKey { - SchemeShard: %lu - PathId: 3 - } - Name: "ServerLess0" - )", - TTestTxConfig::SchemeShard - ); - TestCreateExtSubDomain(runtime, ++t.TxId, "/MyRoot", createData); - t.TestEnv->TestWaitNotification(runtime, t.TxId); - - TestAlterExtSubDomain(runtime, ++t.TxId, "/MyRoot", - R"( - PlanResolution: 50 - Coordinators: 1 - Mediators: 1 - TimeCastBucketsPerMediator: 2 - ExternalSchemeShard: true - ExternalHive: false - StoragePools { - Name: "pool-1" - Kind: "pool-kind-1" - } - Name: "ServerLess0" - )" - ); - t.TestEnv->TestWaitNotification(runtime, t.TxId); + {NLs::PathExist, + NLs::ExtractTenantSchemeshard(&sharedDbSchemeShard), + NLs::ExtractDomainHive(&sharedHive), + NLs::ServerlessComputeResourcesMode(EServerlessComputeResourcesModeUnspecified)}); + + UNIT_ASSERT(sharedHive != 0 + && sharedHive != (ui64)-1 + && sharedHive != TTestTxConfig::Hive); + + UNIT_ASSERT(sharedDbSchemeShard != 0 + && sharedDbSchemeShard != (ui64)-1 + && sharedDbSchemeShard != TTestTxConfig::SchemeShard); + + TestDescribeResult(DescribePath(runtime, sharedDbSchemeShard, "/MyRoot/SharedDB"), + {NLs::PathExist, + NLs::ServerlessComputeResourcesMode(EServerlessComputeResourcesModeUnspecified)}); + } + TString createData = Sprintf( + R"( + ResourcesDomainKey { + SchemeShard: %lu + PathId: 3 + } + Name: "ServerLess0" + )", + TTestTxConfig::SchemeShard + ); + TestCreateExtSubDomain(runtime, ++t.TxId, "/MyRoot", createData); + t.TestEnv->TestWaitNotification(runtime, t.TxId); + + TestAlterExtSubDomain(runtime, ++t.TxId, "/MyRoot", + R"( + PlanResolution: 50 + Coordinators: 1 + Mediators: 1 + TimeCastBucketsPerMediator: 2 + ExternalSchemeShard: true + ExternalHive: false + StoragePools { + Name: "pool-1" + Kind: "pool-kind-1" + } + Name: "ServerLess0" + )" + ); + t.TestEnv->TestWaitNotification(runtime, t.TxId); + + { + TInactiveZone inactive(activeZone); TestDescribeResult(DescribePath(runtime, "/MyRoot/ServerLess0"), {NLs::PathExist, NLs::IsExternalSubDomain("ServerLess0"), NLs::ServerlessComputeResourcesMode(EServerlessComputeResourcesModeShared), NLs::ExtractTenantSchemeshard(&tenantSchemeShard)}); + + UNIT_ASSERT(tenantSchemeShard != 0 + && tenantSchemeShard != (ui64)-1 + && tenantSchemeShard != TTestTxConfig::SchemeShard); + TestDescribeResult(DescribePath(runtime, tenantSchemeShard, "/MyRoot/ServerLess0"), {NLs::PathExist, NLs::ServerlessComputeResourcesMode(EServerlessComputeResourcesModeShared)}); diff --git a/ydb/tests/functional/serverless/conftest.py b/ydb/tests/functional/serverless/conftest.py index 4e901a7066f1..d46197139f48 100644 --- a/ydb/tests/functional/serverless/conftest.py +++ b/ydb/tests/functional/serverless/conftest.py @@ -155,7 +155,7 @@ def ydb_serverless_db_with_exclusive_nodes_ctx(ydb_cluster, database, hostel_db, @pytest.fixture(scope='module') def ydb_serverless_db_with_exclusive_nodes(ydb_cluster, ydb_root, ydb_hostel_db): - database_name = os.path.join(ydb_root, "serverless_with_nodes") + database_name = os.path.join(ydb_root, "serverless_with_exclusive_nodes") with ydb_serverless_db_with_exclusive_nodes_ctx(ydb_cluster, database_name, ydb_hostel_db): yield database_name From 5744566322a1574f7b3d0055008cf897dc224116 Mon Sep 17 00:00:00 2001 From: Ilia Shakhov Date: Fri, 19 Jan 2024 03:19:09 +0000 Subject: [PATCH 7/7] Fix GetDomainName KIKIMR-20642 --- ydb/core/mind/hive/hive_domains.cpp | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/ydb/core/mind/hive/hive_domains.cpp b/ydb/core/mind/hive/hive_domains.cpp index 89812d87f052..39933537cf3b 100644 --- a/ydb/core/mind/hive/hive_domains.cpp +++ b/ydb/core/mind/hive/hive_domains.cpp @@ -51,9 +51,6 @@ void THive::Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev) { Domains[key].Path = path; if (entry.DomainInfo) { Domains[key].HiveId = entry.DomainInfo->Params.GetHive(); - if (Domains[key].ServerlessComputeResourcesMode.Empty()) { - Domains[key].ServerlessComputeResourcesMode = entry.DomainInfo->ServerlessComputeResourcesMode; - } } BLOG_D("Received NavigateKeySetResult for domain " << entry.TableId << " with path " << path); Execute(CreateUpdateDomain(key)); @@ -78,18 +75,11 @@ void THive::Handle(TEvHive::TEvUpdateDomain::TPtr& ev) { } TString THive::GetDomainName(TSubDomainKey domain) { - auto itDomain = Domains.find(domain); - if (itDomain != Domains.end()) { - if (!itDomain->second.Path.empty()) { - return itDomain->second.Path; - } - } else { - SeenDomain(domain); - } if (domain == TSubDomainKey()) { return ""; } - return TStringBuilder() << domain; + SeenDomain(domain); + return Domains.at(domain).Path; } } // NHive