aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralexvru <alexvru@ydb.tech>2023-08-08 18:28:56 +0300
committeralexvru <alexvru@ydb.tech>2023-08-08 19:29:08 +0300
commit3875d4ea30a3307f4ce47d4a01c131f00c100468 (patch)
treed74a210f6e4ed382c060b95110ad4ab9dd1a7368
parent3fde6ea974a169d992c9f63a7bcc07e0903760cd (diff)
downloadydb-3875d4ea30a3307f4ce47d4a01c131f00c100468.tar.gz
Support static node list change subscriptions in Dynamic Nameservice and use them in BSC KIKIMR-13309
-rw-r--r--library/cpp/actors/core/interconnect.h7
-rw-r--r--library/cpp/actors/interconnect/interconnect.h9
-rw-r--r--ydb/core/mind/bscontroller/bsc.cpp7
-rw-r--r--ydb/core/mind/bscontroller/impl.h6
-rw-r--r--ydb/core/mind/dynamic_nameserver.cpp15
-rw-r--r--ydb/core/mind/dynamic_nameserver_impl.h4
6 files changed, 37 insertions, 11 deletions
diff --git a/library/cpp/actors/core/interconnect.h b/library/cpp/actors/core/interconnect.h
index 37fd7bff4d..dd6509f727 100644
--- a/library/cpp/actors/core/interconnect.h
+++ b/library/cpp/actors/core/interconnect.h
@@ -179,6 +179,13 @@ namespace NActors {
struct TEvRegisterNodeResult;
struct TEvListNodes: public TEventLocal<TEvListNodes, EvListNodes> {
+ const bool SubscribeToStaticNodeChanges = false;
+
+ TEvListNodes() = default;
+
+ TEvListNodes(bool subscribeToStaticNodeChanges)
+ : SubscribeToStaticNodeChanges(subscribeToStaticNodeChanges)
+ {}
};
struct TNodeInfo {
diff --git a/library/cpp/actors/interconnect/interconnect.h b/library/cpp/actors/interconnect/interconnect.h
index a8a646dd18..38d8cd4781 100644
--- a/library/cpp/actors/interconnect/interconnect.h
+++ b/library/cpp/actors/interconnect/interconnect.h
@@ -111,6 +111,15 @@ namespace NActors {
Location = ni.Location;
return *this;
}
+
+ friend bool operator ==(const TNodeInfo& x, const TNodeInfo& y) {
+ return x.Address == y.Address && x.Host == y.Host && x.ResolveHost == y.ResolveHost && x.Port == y.Port
+ && x.Location == y.Location;
+ }
+
+ friend bool operator !=(const TNodeInfo& x, const TNodeInfo& y) {
+ return !(x == y);
+ }
};
TMap<ui32, TNodeInfo> StaticNodeTable;
diff --git a/ydb/core/mind/bscontroller/bsc.cpp b/ydb/core/mind/bscontroller/bsc.cpp
index e128d3c9cc..4fc8b06918 100644
--- a/ydb/core/mind/bscontroller/bsc.cpp
+++ b/ydb/core/mind/bscontroller/bsc.cpp
@@ -128,7 +128,7 @@ void TBlobStorageController::OnActivateExecutor(const TActorContext&) {
}
// request node list
- Send(GetNameserviceActorId(), new TEvInterconnect::TEvListNodes);
+ Send(GetNameserviceActorId(), new TEvInterconnect::TEvListNodes(true));
// create storage pool stats monitor
StoragePoolStat = std::make_unique<TStoragePoolStat>(GetServiceCounters(AppData()->Counters, "storage_pool_stat"));
@@ -148,7 +148,6 @@ void TBlobStorageController::Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev) {
STLOG(PRI_DEBUG, BS_CONTROLLER, BSC01, "Handle TEvInterconnect::TEvNodesInfo");
const bool initial = !HostRecords;
HostRecords = std::make_shared<THostRecordMap::element_type>(ev->Get());
- Schedule(TDuration::Minutes(5), new TEvPrivate::TEvHostRecordsTimeToLiveExceeded);
if (initial) {
// create self-heal actor
SelfHealId = Register(CreateSelfHealActor());
@@ -157,10 +156,6 @@ void TBlobStorageController::Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev) {
Send(SelfHealId, new TEvPrivate::TEvUpdateHostRecords(HostRecords));
}
-void TBlobStorageController::HandleHostRecordsTimeToLiveExceeded() {
- Send(GetNameserviceActorId(), new TEvInterconnect::TEvListNodes);
-}
-
void TBlobStorageController::IssueInitialGroupContent() {
auto ev = MakeHolder<TEvControllerNotifyGroupChange>();
for (const auto& kv : GroupMap) {
diff --git a/ydb/core/mind/bscontroller/impl.h b/ydb/core/mind/bscontroller/impl.h
index c64419dcf7..c78f4669cd 100644
--- a/ydb/core/mind/bscontroller/impl.h
+++ b/ydb/core/mind/bscontroller/impl.h
@@ -1493,7 +1493,6 @@ private:
enum EEv {
EvUpdateSystemViews = EventSpaceBegin(TEvents::ES_PRIVATE),
EvUpdateSelfHealCounters,
- EvHostRecordsTimeToLiveExceeded,
EvDropDonor,
EvScrub,
EvVSlotReadyUpdate,
@@ -1504,7 +1503,6 @@ private:
struct TEvUpdateSystemViews : public TEventLocal<TEvUpdateSystemViews, EvUpdateSystemViews> {};
struct TEvUpdateSelfHealCounters : TEventLocal<TEvUpdateSelfHealCounters, EvUpdateSelfHealCounters> {};
- struct TEvHostRecordsTimeToLiveExceeded : TEventLocal<TEvHostRecordsTimeToLiveExceeded, EvHostRecordsTimeToLiveExceeded> {};
struct TEvDropDonor : TEventLocal<TEvDropDonor, EvDropDonor> {
std::vector<TVSlotId> VSlotIds;
@@ -1681,6 +1679,8 @@ private:
TActivationContext::Send(new IEventHandle(TEvents::TSystem::Poison, 0, actorId, SelfId(), nullptr, 0));
}
}
+ TActivationContext::Send(new IEventHandle(TEvents::TSystem::Unsubscribe, 0, GetNameserviceActorId(), SelfId(),
+ nullptr, 0));
return TActor::PassAway();
}
@@ -1728,7 +1728,6 @@ private:
THostRecordMap HostRecords;
void Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev);
- void HandleHostRecordsTimeToLiveExceeded();
public:
// Self-heal actor's main purpose is to monitor FAULTY pdisks and to slightly move groups out of them; every move
@@ -1996,7 +1995,6 @@ public:
hFunc(TEvTabletPipe::TEvServerConnected, Handle);
hFunc(TEvTabletPipe::TEvServerDisconnected, Handle);
fFunc(TEvPrivate::EvUpdateSelfHealCounters, EnqueueIncomingEvent);
- cFunc(TEvPrivate::EvHostRecordsTimeToLiveExceeded, HandleHostRecordsTimeToLiveExceeded);
fFunc(TEvPrivate::EvDropDonor, EnqueueIncomingEvent);
fFunc(TEvBlobStorage::EvControllerScrubQueryStartQuantum, EnqueueIncomingEvent);
fFunc(TEvBlobStorage::EvControllerScrubQuantumFinished, EnqueueIncomingEvent);
diff --git a/ydb/core/mind/dynamic_nameserver.cpp b/ydb/core/mind/dynamic_nameserver.cpp
index 1a29b6e1f2..025cdae652 100644
--- a/ydb/core/mind/dynamic_nameserver.cpp
+++ b/ydb/core/mind/dynamic_nameserver.cpp
@@ -356,6 +356,9 @@ void TDynamicNameserver::Handle(TEvInterconnect::TEvListNodes::TPtr &ev,
}
}
ListNodesQueue.push_back(ev->Sender);
+ if (ev->Get()->SubscribeToStaticNodeChanges) {
+ StaticNodeChangeSubscribers.insert(ev->Sender);
+ }
}
void TDynamicNameserver::Handle(TEvInterconnect::TEvGetNode::TPtr &ev, const TActorContext &ctx)
@@ -441,12 +444,22 @@ void TDynamicNameserver::Handle(NConsole::TEvConsole::TEvConfigNotificationReque
auto& record = ev->Get()->Record;
if (record.HasConfig()) {
if (const auto& config = record.GetConfig(); config.HasNameserviceConfig()) {
- StaticConfig = BuildNameserverTable(config.GetNameserviceConfig());
+ auto newStaticConfig = BuildNameserverTable(config.GetNameserviceConfig());
+ if (StaticConfig->StaticNodeTable != newStaticConfig->StaticNodeTable) {
+ StaticConfig = std::move(newStaticConfig);
+ for (const auto& subscriber : StaticNodeChangeSubscribers) {
+ TActivationContext::Send(new IEventHandle(SelfId(), subscriber, new TEvInterconnect::TEvListNodes));
+ }
+ }
}
}
Send(ev->Sender, new NConsole::TEvConsole::TEvConfigNotificationResponse(record), 0, ev->Cookie);
}
+void TDynamicNameserver::Handle(TEvents::TEvUnsubscribe::TPtr ev) {
+ StaticNodeChangeSubscribers.erase(ev->Sender);
+}
+
IActor *CreateDynamicNameserver(const TIntrusivePtr<TTableNameserverSetup> &setup, ui32 poolId) {
return new TDynamicNameserver(setup, poolId);
}
diff --git a/ydb/core/mind/dynamic_nameserver_impl.h b/ydb/core/mind/dynamic_nameserver_impl.h
index 9f5dac9a88..b18c870607 100644
--- a/ydb/core/mind/dynamic_nameserver_impl.h
+++ b/ydb/core/mind/dynamic_nameserver_impl.h
@@ -209,6 +209,7 @@ public:
HFunc(TEvNodeBroker::TEvNodesInfo, Handle);
HFunc(TEvPrivate::TEvUpdateEpoch, Handle);
HFunc(NMon::TEvHttpInfo, Handle);
+ hFunc(TEvents::TEvUnsubscribe, Handle);
hFunc(NConsole::TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse, Handle);
hFunc(NConsole::TEvConsole::TEvConfigNotificationRequest, Handle);
@@ -247,6 +248,8 @@ private:
void Handle(NConsole::TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse::TPtr ev);
void Handle(NConsole::TEvConsole::TEvConfigNotificationRequest::TPtr ev);
+ void Handle(TEvents::TEvUnsubscribe::TPtr ev);
+
private:
TIntrusivePtr<TTableNameserverSetup> StaticConfig;
std::array<TDynamicConfigPtr, DOMAINS_COUNT> DynamicConfigs;
@@ -258,6 +261,7 @@ private:
// Domain -> Epoch ID.
THashMap<ui32, ui64> EpochUpdates;
ui32 ResolvePoolId;
+ THashSet<TActorId> StaticNodeChangeSubscribers;
};
} // NNodeBroker