diff options
author | alexvru <alexvru@ydb.tech> | 2023-08-08 18:28:56 +0300 |
---|---|---|
committer | alexvru <alexvru@ydb.tech> | 2023-08-08 19:29:08 +0300 |
commit | 3875d4ea30a3307f4ce47d4a01c131f00c100468 (patch) | |
tree | d74a210f6e4ed382c060b95110ad4ab9dd1a7368 | |
parent | 3fde6ea974a169d992c9f63a7bcc07e0903760cd (diff) | |
download | ydb-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.h | 7 | ||||
-rw-r--r-- | library/cpp/actors/interconnect/interconnect.h | 9 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/bsc.cpp | 7 | ||||
-rw-r--r-- | ydb/core/mind/bscontroller/impl.h | 6 | ||||
-rw-r--r-- | ydb/core/mind/dynamic_nameserver.cpp | 15 | ||||
-rw-r--r-- | ydb/core/mind/dynamic_nameserver_impl.h | 4 |
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 |