@@ -67,13 +67,18 @@ void TDynamicNodeResolverBase::Handle(TEvNodeBroker::TEvResolvedNode::TPtr &ev,
6767
6868 if (rec.GetStatus ().GetCode () != NKikimrNodeBroker::TStatus::OK) {
6969 // Reset proxy if node expired.
70- if (exists)
70+ if (exists) {
7171 ResetInterconnectProxyConfig (NodeId, ctx);
72+ *NeedUpdateListNodesCache = true ; // node was erased
73+ }
7274 ReplyWithErrorAndDie (ctx);
7375 return ;
7476 }
7577
7678 TDynamicConfig::TDynamicNodeInfo node (rec.GetNode ());
79+ if (!exists || !oldNode.EqualExceptExpire (node)) {
80+ *NeedUpdateListNodesCache = true ;
81+ }
7782
7883 // If ID is re-used by another node then proxy has to be reset.
7984 if (exists && !oldNode.EqualExceptExpire (node))
@@ -145,6 +150,7 @@ void TDynamicNameserver::Handle(TEvNodeWardenStorageConfig::TPtr ev) {
145150 auto newStaticConfig = BuildNameserverTable (config);
146151 if (StaticConfig->StaticNodeTable != newStaticConfig->StaticNodeTable ) {
147152 StaticConfig = std::move (newStaticConfig);
153+ *NeedUpdateListNodesCache = true ;
148154 for (const auto & subscriber : StaticNodeChangeSubscribers) {
149155 TActivationContext::Send (new IEventHandle (SelfId (), subscriber, new TEvInterconnect::TEvListNodes));
150156 }
@@ -220,31 +226,38 @@ void TDynamicNameserver::ResolveDynamicNode(ui32 nodeId,
220226 reply->NodeId = nodeId;
221227 ctx.Send (ev->Sender , reply);
222228 } else {
223- ctx.RegisterWithSameMailbox (new TDynamicNodeResolver (SelfId (), nodeId, DynamicConfigs[domain], ev, deadline));
229+ ctx.RegisterWithSameMailbox (new TDynamicNodeResolver (SelfId (), nodeId, DynamicConfigs[domain],
230+ NeedUpdateListNodesCache, ev, deadline));
224231 }
225232}
226233
227234void TDynamicNameserver::SendNodesList (const TActorContext &ctx)
228235{
229- auto now = ctx.Now ();
230- for (auto &sender : ListNodesQueue) {
231- THolder<TEvInterconnect::TEvNodesInfo> reply (new TEvInterconnect::TEvNodesInfo);
236+ if (*NeedUpdateListNodesCache) {
237+ auto newListNodesCache = MakeIntrusive<TIntrusiveVector<TEvInterconnect::TNodeInfo>>();
238+
239+ auto now = ctx.Now ();
232240 for (const auto &pr : StaticConfig->StaticNodeTable ) {
233- reply-> Nodes . emplace_back (pr.first ,
234- pr.second .Address , pr.second .Host , pr.second .ResolveHost ,
235- pr.second .Port , pr.second .Location , true );
241+ newListNodesCache-> emplace_back (pr.first ,
242+ pr.second .Address , pr.second .Host , pr.second .ResolveHost ,
243+ pr.second .Port , pr.second .Location , true );
236244 }
237245
238246 for (auto &config : DynamicConfigs) {
239247 for (auto &pr : config->DynamicNodes ) {
240248 if (pr.second .Expire > now)
241- reply-> Nodes . emplace_back (pr.first , pr.second .Address ,
242- pr.second .Host , pr.second .ResolveHost ,
243- pr.second .Port , pr.second .Location , false );
249+ newListNodesCache-> emplace_back (pr.first , pr.second .Address ,
250+ pr.second .Host , pr.second .ResolveHost ,
251+ pr.second .Port , pr.second .Location , false );
244252 }
245253 }
246254
247- ctx.Send (sender, reply.Release ());
255+ ListNodesCache = newListNodesCache;
256+ *NeedUpdateListNodesCache = false ;
257+ }
258+
259+ for (auto &sender : ListNodesQueue) {
260+ ctx.Send (sender, new TEvInterconnect::TEvNodesInfo (ListNodesCache));
248261 }
249262 ListNodesQueue.clear ();
250263}
@@ -300,15 +313,18 @@ void TDynamicNameserver::UpdateState(const NKikimrNodeBroker::TNodesInfo &rec,
300313 config->ExpiredNodes .emplace (node.GetNodeId (), info);
301314 }
302315
316+ *NeedUpdateListNodesCache = true ;
303317 config->Epoch = rec.GetEpoch ();
304318 ctx.Schedule (config->Epoch .End - ctx.Now (),
305319 new TEvPrivate::TEvUpdateEpoch (domain, config->Epoch .Id + 1 ));
306320 } else {
307321 // Note: this update may be optimized to only include new nodes
308322 for (auto &node : rec.GetNodes ()) {
309323 auto nodeId = node.GetNodeId ();
310- if (!config->DynamicNodes .contains (nodeId))
324+ if (!config->DynamicNodes .contains (nodeId)) {
311325 config->DynamicNodes .emplace (nodeId, node);
326+ *NeedUpdateListNodesCache = true ;
327+ }
312328 }
313329 config->Epoch = rec.GetEpoch ();
314330 }
@@ -395,8 +411,8 @@ void TDynamicNameserver::Handle(TEvInterconnect::TEvGetNode::TPtr &ev, const TAc
395411 ctx.Send (ev->Sender , reply.Release ());
396412 } else {
397413 const TInstant deadline = ev->Get ()->Deadline ;
398- ctx.RegisterWithSameMailbox (new TDynamicNodeSearcher (SelfId (), nodeId, DynamicConfigs[domain], ev. Release (),
399- deadline));
414+ ctx.RegisterWithSameMailbox (new TDynamicNodeSearcher (SelfId (), nodeId, DynamicConfigs[domain],
415+ NeedUpdateListNodesCache, ev. Release (), deadline));
400416 }
401417 }
402418}
@@ -455,6 +471,7 @@ void TDynamicNameserver::Handle(NConsole::TEvConsole::TEvConfigNotificationReque
455471 auto newStaticConfig = BuildNameserverTable (config.GetNameserviceConfig ());
456472 if (StaticConfig->StaticNodeTable != newStaticConfig->StaticNodeTable ) {
457473 StaticConfig = std::move (newStaticConfig);
474+ *NeedUpdateListNodesCache = true ;
458475 for (const auto & subscriber : StaticNodeChangeSubscribers) {
459476 TActivationContext::Send (new IEventHandle (SelfId (), subscriber, new TEvInterconnect::TEvListNodes));
460477 }
0 commit comments