Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ydb/core/base/subdomain.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ struct TSubDomainKey : public std::pair<ui64, ui64> {

static const TSubDomainKey InvalidSubDomainKey = TSubDomainKey();

using TMaybeServerlessComputeResourcesMode = TMaybe<NKikimrSubDomains::EServerlessComputeResourcesMode, NMaybe::TPolicyUndefinedFail>;
using TMaybeServerlessComputeResourcesMode = TMaybeFail<NKikimrSubDomains::EServerlessComputeResourcesMode>;
}

template <>
Expand Down
10 changes: 7 additions & 3 deletions ydb/core/discovery/discovery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -499,10 +499,14 @@ class TDiscoverer: public TActorBootstrapped<TDiscoverer> {
return false;
}

switch (domainInfo->ServerlessComputeResourcesMode) {
case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED:
if (domainInfo->ServerlessComputeResourcesMode.Empty()) {
return true;
}

switch (*domainInfo->ServerlessComputeResourcesMode) {
case NKikimrSubDomains::EServerlessComputeResourcesModeExclusive:
return false;
case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED:
case NKikimrSubDomains::EServerlessComputeResourcesModeShared:
return true;
default:
return true;
Expand Down
6 changes: 3 additions & 3 deletions ydb/core/mind/hive/domain_info.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ namespace NKikimr {
namespace NHive {

ENodeSelectionPolicy TDomainInfo::GetNodeSelectionPolicy() const {
if (!ServerlessComputeResourcesMode) {
if (ServerlessComputeResourcesMode.Empty()) {
return ENodeSelectionPolicy::Default;
}

switch (*ServerlessComputeResourcesMode) {
case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED:
case NKikimrSubDomains::EServerlessComputeResourcesModeExclusive:
return ENodeSelectionPolicy::PreferObjectDomain;
case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED:
case NKikimrSubDomains::EServerlessComputeResourcesModeShared:
return ENodeSelectionPolicy::Default;
default:
return ENodeSelectionPolicy::Default;
Expand Down
13 changes: 3 additions & 10 deletions ydb/core/mind/hive/hive_domains.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,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();
Expand All @@ -75,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 "<empty-subdomain-key>";
}
return TStringBuilder() << domain;
SeenDomain(domain);
return Domains.at(domain).Path;
}

} // NHive
Expand Down
7 changes: 3 additions & 4 deletions ydb/core/mind/hive/hive_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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::EServerlessComputeResourcesModeExclusive);
runtime.SendToPipe(hiveTablet, sender, ev.Release());
TAutoPtr<IEventHandle> handle;
TEvHive::TEvUpdateDomainReply* response = runtime.GrabEdgeEventRethrow<TEvHive::TEvUpdateDomainReply>(handle);
Expand All @@ -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<IEventHandle> handle;
TEvHive::TEvUpdateDomainReply* response = runtime.GrabEdgeEventRethrow<TEvHive::TEvUpdateDomainReply>(handle);
Expand Down Expand Up @@ -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_DEDICATED);
ev->Record.SetServerlessComputeResourcesMode(NKikimrSubDomains::EServerlessComputeResourcesModeExclusive);
runtime.SendToPipe(hiveTablet, sender, ev.Release());
TAutoPtr<IEventHandle> handle;
TEvHive::TEvUpdateDomainReply* response = runtime.GrabEdgeEventRethrow<TEvHive::TEvUpdateDomainReply>(handle);
Expand All @@ -6203,7 +6203,6 @@ 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);
runtime.SendToPipe(hiveTablet, sender, ev.Release());
TAutoPtr<IEventHandle> handle;
TEvHive::TEvUpdateDomainReply* response = runtime.GrabEdgeEventRethrow<TEvHive::TEvUpdateDomainReply>(handle);
Expand Down
8 changes: 4 additions & 4 deletions ydb/core/protos/subdomains.proto
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -103,7 +104,6 @@ message TDomainDescription {
optional NLoginProto.TSecurityState SecurityState = 20;

optional TAuditSettings AuditSettings = 21;
optional fixed64 SharedHive = 22;
}

message TSchemeQuotas {
Expand All @@ -116,7 +116,7 @@ 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
EServerlessComputeResourcesModeUnspecified = 0;
EServerlessComputeResourcesModeShared = 1; // Using nodes that serve shared resources domain
EServerlessComputeResourcesModeExclusive = 2; // Using nodes that serve self domain
}
8 changes: 6 additions & 2 deletions ydb/core/testlib/tablet_helpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<TEvHive::TEvUpdateDomainReply>();
response->Record.SetTxId(ev->Get()->Record.GetTxId());
response->Record.SetOrigin(TabletID());
Expand Down
9 changes: 6 additions & 3 deletions ydb/core/tx/scheme_cache/scheme_cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <ydb/core/base/events.h>
#include <ydb/core/scheme/scheme_pathid.h>
#include <ydb/core/base/tx_processing.h>
#include <ydb/core/base/subdomain.h>
#include <ydb/core/protos/flat_scheme_op.pb.h>
#include <ydb/core/protos/flat_tx_scheme.pb.h>
#include <ydb/core/protos/subdomains.pb.h>
Expand Down Expand Up @@ -55,13 +56,16 @@ struct TDomainInfo : public TAtomicRefCount<TDomainInfo> {
: 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 {
Expand All @@ -84,8 +88,7 @@ struct TDomainInfo : public TAtomicRefCount<TDomainInfo> {
TPathId ResourcesDomainKey;
NKikimrSubDomains::TProcessingParams Params;
TCoordinators Coordinators;
NKikimrSubDomains::EServerlessComputeResourcesMode ServerlessComputeResourcesMode =
NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED;
TMaybeServerlessComputeResourcesMode ServerlessComputeResourcesMode;

TString ToString() const;

Expand Down
8 changes: 8 additions & 0 deletions ydb/core/tx/schemeshard/schemeshard__init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1535,6 +1535,10 @@ struct TSchemeShard::TTxInit : public TTransactionBase<TSchemeShard> {
domainInfo->SetServerlessComputeResourcesMode(
rowset.GetValue<Schema::SubDomains::ServerlessComputeResourcesMode>()
);
} else if (Self->IsServerlessDomain(domainInfo) || Self->IsServerlessDomainGlobal(pathId, domainInfo)) {
domainInfo->SetServerlessComputeResourcesMode(
NKikimrSubDomains::EServerlessComputeResourcesModeShared
);
}
}

Expand Down Expand Up @@ -1603,6 +1607,10 @@ struct TSchemeShard::TTxInit : public TTransactionBase<TSchemeShard> {
alter->SetServerlessComputeResourcesMode(
rowset.GetValue<Schema::SubDomainsAlterData::ServerlessComputeResourcesMode>()
);
} else if (Self->IsServerlessDomain(alter) || Self->IsServerlessDomainGlobal(pathId, alter)) {
alter->SetServerlessComputeResourcesMode(
NKikimrSubDomains::EServerlessComputeResourcesModeShared
);
}

subdomainInfo->SetAlter(alter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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_DEDICATED:
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");
Expand Down Expand Up @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ class TCreateExtSubDomain: public TSubOperation {
}

alter->SetSharedHive(sharedHive);
alter->SetServerlessComputeResourcesMode(NKikimrSubDomains::EServerlessComputeResourcesModeShared);
}

if (settings.HasDeclaredSchemeQuotas()) {
Expand Down
5 changes: 5 additions & 0 deletions ydb/core/tx/schemeshard/schemeshard_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
34 changes: 24 additions & 10 deletions ydb/core/tx/schemeshard/ut_serverless/ut_serverless.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -285,10 +285,24 @@ 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::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(
R"(
Expand Down Expand Up @@ -324,7 +338,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(EServerlessComputeResourcesModeShared),
NLs::ExtractTenantSchemeshard(&tenantSchemeShard)});

UNIT_ASSERT(tenantSchemeShard != 0
Expand All @@ -333,7 +347,7 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) {

TestDescribeResult(DescribePath(runtime, tenantSchemeShard, "/MyRoot/ServerLess0"),
{NLs::PathExist,
NLs::ServerlessComputeResourcesMode(SERVERLESS_COMPUTE_RESOURCES_MODE_UNSPECIFIED)});
NLs::ServerlessComputeResourcesMode(EServerlessComputeResourcesModeShared)});

auto checkServerlessComputeResourcesMode = [&](EServerlessComputeResourcesMode serverlessComputeResourcesMode) {
TString alterData = Sprintf(
Expand All @@ -353,8 +367,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(EServerlessComputeResourcesModeExclusive);
checkServerlessComputeResourcesMode(EServerlessComputeResourcesModeShared);
}

Y_UNIT_TEST(TestServerlessComputeResourcesModeValidation) {
Expand Down Expand Up @@ -421,19 +435,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" }}
);
}

Expand Down Expand Up @@ -501,7 +515,7 @@ Y_UNIT_TEST_SUITE(TSchemeShardServerLess) {

TestAlterExtSubDomain(runtime, ++txId, "/MyRoot",
R"(
ServerlessComputeResourcesMode: SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED
ServerlessComputeResourcesMode: EServerlessComputeResourcesModeExclusive
Name: "ServerLess0"
)",
{{ TEvSchemeShard::EStatus::StatusPreconditionFailed, "Unsupported: feature flag EnableServerlessExclusiveDynamicNodes is off" }}
Expand Down
Loading