Skip to content

Commit

Permalink
Start tablets in object domain KIKIMR-20271 (ydb-platform#705)
Browse files Browse the repository at this point in the history
* Start tablets in object domain KIKIMR-20271
  • Loading branch information
pixcc authored and adameat committed Dec 29, 2023
1 parent f6a960d commit c352cb4
Show file tree
Hide file tree
Showing 39 changed files with 636 additions and 49 deletions.
6 changes: 6 additions & 0 deletions ydb/core/base/hive.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ namespace NKikimr {
EvRequestTabletOwners,
EvReassignOnDecommitGroup,
EvUpdateTabletsObject,
EvUpdateDomain,

// replies
EvBootTabletReply = EvBootTablet + 512,
Expand Down Expand Up @@ -80,6 +81,7 @@ namespace NKikimr {
EvInvalidateStoragePoolsReply,
EvReassignOnDecommitGroupReply,
EvUpdateTabletsObjectReply,
EvUpdateDomainReply,

EvEnd
};
Expand Down Expand Up @@ -862,6 +864,10 @@ namespace NKikimr {
Record.SetStatus(status);
}
};

struct TEvUpdateDomain : TEventPB<TEvUpdateDomain, NKikimrHive::TEvUpdateDomain, EvUpdateDomain> {};

struct TEvUpdateDomainReply : TEventPB<TEvUpdateDomainReply, NKikimrHive::TEvUpdateDomainReply, EvUpdateDomainReply> {};
};

IActor* CreateDefaultHive(const TActorId &tablet, TTabletStorageInfo *info);
Expand Down
3 changes: 3 additions & 0 deletions ydb/core/base/subdomain.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include <ydb/core/protos/subdomains.pb.h>

#include <util/generic/maybe.h>
#include <util/system/types.h>
#include <utility>

Expand Down Expand Up @@ -29,6 +30,8 @@ struct TSubDomainKey : public std::pair<ui64, ui64> {
};

static const TSubDomainKey InvalidSubDomainKey = TSubDomainKey();

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

template <>
Expand Down
22 changes: 22 additions & 0 deletions ydb/core/mind/hive/domain_info.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#include "domain_info.h"

namespace NKikimr {
namespace NHive {

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

switch (*ServerlessComputeResourcesMode) {
case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_DEDICATED:
return ENodeSelectionPolicy::PreferObjectDomain;
case NKikimrSubDomains::SERVERLESS_COMPUTE_RESOURCES_MODE_SHARED:
return ENodeSelectionPolicy::Default;
default:
return ENodeSelectionPolicy::Default;
}
}

} // NHive
} // NKikimr
12 changes: 10 additions & 2 deletions ydb/core/mind/hive/domain_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,18 @@
namespace NKikimr {
namespace NHive {

enum class ENodeSelectionPolicy : ui32 {
Default,
PreferObjectDomain,
};

struct TDomainInfo {
TString Path;
TTabletId HiveId = 0;
TMaybeServerlessComputeResourcesMode ServerlessComputeResourcesMode;

ENodeSelectionPolicy GetNodeSelectionPolicy() const;
};

}
}
} // NHive
} // NKikimr
5 changes: 4 additions & 1 deletion ydb/core/mind/hive/follower_group.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ struct TFollowerGroup {
bool RequireDifferentNodes = false; // do not run followers on same nodes as another followers of the same leader
bool FollowerCountPerDataCenter = false; // PER_AZ KIKIMR-10443

TFollowerGroup() = default;
explicit TFollowerGroup(const THive& hive)
: NodeFilter(hive)
{}

TFollowerGroup(const TFollowerGroup&) = delete;
TFollowerGroup(TFollowerGroup&&) = delete;
TFollowerGroup& operator =(const TFollowerGroup&) = delete;
Expand Down
25 changes: 24 additions & 1 deletion ydb/core/mind/hive/hive.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
#include "domain_info.h"
#include "hive.h"
#include "hive_impl.h"
#include "leader_tablet_info.h"

#include <ydb/core/util/tuples.h>

Expand Down Expand Up @@ -76,5 +79,25 @@ NMetrics::EResource GetDominantResourceType(const TResourceNormalizedValues& nor
}
return dominant;
}

TNodeFilter::TNodeFilter(const THive& hive)
: Hive(hive)
{}

TArrayRef<const TSubDomainKey> TNodeFilter::GetEffectiveAllowedDomains() const {
const auto* objectDomainInfo = Hive.FindDomain(ObjectDomain);

if (!objectDomainInfo) {
return {AllowedDomains.begin(), AllowedDomains.end()};
}

switch (objectDomainInfo->GetNodeSelectionPolicy()) {
case ENodeSelectionPolicy::Default:
return {AllowedDomains.begin(), AllowedDomains.end()};
case ENodeSelectionPolicy::PreferObjectDomain:
return {&ObjectDomain, 1};
}
}
}

} // NHive
} // NKikimr
7 changes: 7 additions & 0 deletions ydb/core/mind/hive/hive.h
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,13 @@ struct TNodeFilter {
TVector<TSubDomainKey> AllowedDomains;
TVector<TNodeId> AllowedNodes;
TVector<TDataCenterId> AllowedDataCenters;
TSubDomainKey ObjectDomain;

const THive& Hive;

explicit TNodeFilter(const THive& hive);

TArrayRef<const TSubDomainKey> GetEffectiveAllowedDomains() const;
};

} // NHive
Expand Down
12 changes: 12 additions & 0 deletions ydb/core/mind/hive/hive_domains.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,18 @@ void THive::Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev) {
}
}

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) {
domainInfo.ServerlessComputeResourcesMode = ev->Get()->Record.GetServerlessComputeResourcesMode();
} else {
domainInfo.ServerlessComputeResourcesMode.Clear();
}
Execute(CreateUpdateDomain(subdomainKey, std::move(ev)));
}

TString THive::GetDomainName(TSubDomainKey domain) {
auto itDomain = Domains.find(domain);
if (itDomain != Domains.end()) {
Expand Down
24 changes: 19 additions & 5 deletions ydb/core/mind/hive/hive_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,18 @@
#include <library/cpp/time_provider/time_provider.h>
#include <util/generic/array_ref.h>

template <>
inline IOutputStream& operator <<(IOutputStream& out, const TArrayRef<const NKikimrHive::TDataCentersGroup*>& vec) {
Y_DECLARE_OUT_SPEC(inline, TArrayRef<const NKikimrHive::TDataCentersGroup*>, out, vec) {
out << '[';
for (auto it = vec.begin(); it != vec.end(); ++it) {
if (it != vec.begin())
out << ';';
out << (*it)->ShortDebugString();
}
out << ']';
return out;
}

Y_DECLARE_OUT_SPEC(inline, TArrayRef<const NKikimr::TSubDomainKey>, out, vec) {
out << '[' << JoinSeq(',', vec) << ']';
}

namespace NKikimr {
Expand Down Expand Up @@ -1268,7 +1270,8 @@ THive::TBestNodeResult THive::FindBestNode(const TTabletInfo& tablet) {
<< " to run the tablet " << tablet.ToString()
<< " node domains " << nodeInfo.ServicedDomains
<< " tablet object domain " << tablet.GetLeader().ObjectDomain
<< " tablet allowed domains " << tablet.GetNodeFilter().AllowedDomains);
<< " tablet allowed domains " << tablet.GetNodeFilter().AllowedDomains
<< " tablet effective allowed domains " << tablet.GetNodeFilter().GetEffectiveAllowedDomains());
}
}
if (!selectedNodes.empty()) {
Expand All @@ -1284,6 +1287,7 @@ THive::TBestNodeResult THive::FindBestNode(const TTabletInfo& tablet) {
TNodeInfo* selectedNode = nullptr;
if (!selectedNodes.empty()) {
selectedNodes = SelectMaxPriorityNodes(std::move(selectedNodes), tablet);
BLOG_TRACE("[FBN] Tablet " << tablet.ToString() << " selected max priority nodes count " << selectedNodes.size());

switch (GetNodeSelectStrategy()) {
case NKikimrConfig::THiveConfig::HIVE_NODE_SELECT_STRATEGY_WEIGHTED_RANDOM:
Expand Down Expand Up @@ -1336,7 +1340,7 @@ THive::TBestNodeResult THive::FindBestNode(const TTabletInfo& tablet) {
}
nodesLeft -= debugState.NodesWithSomeoneFromOurFamily;
if (debugState.NodesWithoutDomain == nodesLeft) {
tablet.BootState = TStringBuilder() << "Can't find domain " << tablet.GetNodeFilter().AllowedDomains;
tablet.BootState = TStringBuilder() << "Can't find domain " << tablet.GetNodeFilter().GetEffectiveAllowedDomains();
return TBestNodeResult(true);
}
nodesLeft -= debugState.NodesWithoutDomain;
Expand Down Expand Up @@ -1486,6 +1490,14 @@ TDomainInfo* THive::FindDomain(TSubDomainKey key) {
return &it->second;
}

const TDomainInfo* THive::FindDomain(TSubDomainKey key) const {
auto it = Domains.find(key);
if (it == Domains.end()) {
return nullptr;
}
return &it->second;
}

void THive::DeleteTablet(TTabletId tabletId) {
auto it = Tablets.find(tabletId);
if (it != Tablets.end()) {
Expand Down Expand Up @@ -2813,6 +2825,7 @@ void THive::ProcessEvent(std::unique_ptr<IEventHandle> event) {
hFunc(TEvHive::TEvUpdateTabletsObject, Handle);
hFunc(TEvPrivate::TEvRefreshStorageInfo, Handle);
hFunc(TEvPrivate::TEvLogTabletMoves, Handle);
hFunc(TEvHive::TEvUpdateDomain, Handle);
}
}

Expand Down Expand Up @@ -2910,6 +2923,7 @@ STFUNC(THive::StateWork) {
fFunc(TEvHive::TEvUpdateTabletsObject::EventType, EnqueueIncomingEvent);
fFunc(TEvPrivate::TEvRefreshStorageInfo::EventType, EnqueueIncomingEvent);
fFunc(TEvPrivate::TEvLogTabletMoves::EventType, EnqueueIncomingEvent);
fFunc(TEvHive::TEvUpdateDomain::EventType, EnqueueIncomingEvent);
hFunc(TEvPrivate::TEvProcessIncomingEvent, Handle);
default:
if (!HandleDefaultEvents(ev, SelfId())) {
Expand Down
4 changes: 3 additions & 1 deletion ydb/core/mind/hive/hive_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,6 @@ class THive : public TActor<THive>, public TTabletExecutedFlat, public THiveShar
ITransaction* CreateDisconnectNode(THolder<TEvInterconnect::TEvNodeDisconnected> event);
ITransaction* CreateProcessPendingOperations();
ITransaction* CreateProcessBootQueue();
ITransaction* CreateUpdateDomain(TSubDomainKey subdomainKey);
ITransaction* CreateSeizeTablets(TEvHive::TEvSeizeTablets::TPtr event);
ITransaction* CreateSeizeTabletsReply(TEvHive::TEvSeizeTabletsReply::TPtr event);
ITransaction* CreateReleaseTablets(TEvHive::TEvReleaseTablets::TPtr event);
Expand All @@ -290,6 +289,7 @@ class THive : public TActor<THive>, public TTabletExecutedFlat, public THiveShar
ITransaction* CreateTabletOwnersReply(TEvHive::TEvTabletOwnersReply::TPtr event);
ITransaction* CreateRequestTabletOwners(TEvHive::TEvRequestTabletOwners::TPtr event);
ITransaction* CreateUpdateTabletsObject(TEvHive::TEvUpdateTabletsObject::TPtr event);
ITransaction* CreateUpdateDomain(TSubDomainKey subdomainKey, TEvHive::TEvUpdateDomain::TPtr event = {});

public:
TDomainsView DomainsView;
Expand Down Expand Up @@ -549,6 +549,7 @@ class THive : public TActor<THive>, public TTabletExecutedFlat, public THiveShar
void Handle(TEvPrivate::TEvRefreshStorageInfo::TPtr& ev);
void Handle(TEvPrivate::TEvLogTabletMoves::TPtr& ev);
void Handle(TEvPrivate::TEvProcessIncomingEvent::TPtr& ev);
void Handle(TEvHive::TEvUpdateDomain::TPtr& ev);

protected:
void RestartPipeTx(ui64 tabletId);
Expand Down Expand Up @@ -618,6 +619,7 @@ class THive : public TActor<THive>, public TTabletExecutedFlat, public THiveShar
TStoragePoolInfo& GetStoragePool(const TString& name);
TStoragePoolInfo* FindStoragePool(const TString& name);
TDomainInfo* FindDomain(TSubDomainKey key);
const TDomainInfo* FindDomain(TSubDomainKey key) const;
const TNodeLocation& GetNodeLocation(TNodeId nodeId) const;
void DeleteTablet(TTabletId tabletId);
void DeleteNode(TNodeId nodeId);
Expand Down
3 changes: 2 additions & 1 deletion ydb/core/mind/hive/hive_schema.h
Original file line number Diff line number Diff line change
Expand Up @@ -267,9 +267,10 @@ struct Schema : NIceDb::Schema {
struct Path : Column<3, NScheme::NTypeIds::Utf8> {};
struct Primary : Column<4, NScheme::NTypeIds::Bool> {};
struct HiveId : Column<5, NScheme::NTypeIds::Uint64> {};
struct ServerlessComputeResourcesMode : Column<6, NScheme::NTypeIds::Uint32> { using Type = NKikimrSubDomains::EServerlessComputeResourcesMode; };

using TKey = TableKey<SchemeshardId, PathId>;
using TColumns = TableColumns<SchemeshardId, PathId, Path, Primary, HiveId>;
using TColumns = TableColumns<SchemeshardId, PathId, Path, Primary, HiveId, ServerlessComputeResourcesMode>;
};

struct BlockedOwner : Table<18> {
Expand Down
Loading

0 comments on commit c352cb4

Please sign in to comment.