@@ -16,10 +16,13 @@ using namespace NActors;
1616using namespace NNodeWhiteboard ;
1717
1818class TCountersHostsList : public TActorBootstrapped <TCountersHostsList> {
19+ using TBase = TActorBootstrapped<TCountersHostsList>;
20+
1921 IViewer* Viewer;
2022 NMon::TEvHttpInfo::TPtr Event;
2123 THolder<TEvInterconnect::TEvNodesInfo> NodesInfo;
2224 TMap<TNodeId, THolder<TEvWhiteboard::TEvSystemStateResponse>> NodesResponses;
25+ THashSet<TActorId> TcpProxies;
2326 ui32 NodesRequested = 0 ;
2427 ui32 NodesReceived = 0 ;
2528 bool StaticNodesOnly = false ;
@@ -35,47 +38,48 @@ class TCountersHostsList : public TActorBootstrapped<TCountersHostsList> {
3538 , Event(ev)
3639 {}
3740
38- void Bootstrap (const TActorContext& ctx ) {
41+ void Bootstrap () {
3942 const auto & params (Event->Get ()->Request .GetParams ());
4043 StaticNodesOnly = FromStringWithDefault<bool >(params.Get (" static_only" ), StaticNodesOnly);
4144 DynamicNodesOnly = FromStringWithDefault<bool >(params.Get (" dynamic_only" ), DynamicNodesOnly);
4245 const TActorId nameserviceId = GetNameserviceActorId ();
43- ctx. Send (nameserviceId, new TEvInterconnect::TEvListNodes ());
44- ctx. Schedule (TDuration::Seconds (10 ), new TEvents::TEvWakeup ());
46+ Send (nameserviceId, new TEvInterconnect::TEvListNodes ());
47+ Schedule (TDuration::Seconds (10 ), new TEvents::TEvWakeup ());
4548 Become (&TThis::StateRequestedList);
4649 }
4750
4851 STFUNC (StateRequestedList) {
4952 switch (ev->GetTypeRewrite ()) {
50- HFunc (TEvInterconnect::TEvNodesInfo, Handle);
51- CFunc (TEvents::TSystem::Wakeup, Timeout);
53+ hFunc (TEvInterconnect::TEvNodesInfo, Handle);
54+ cFunc (TEvents::TSystem::Wakeup, Timeout);
5255 }
5356 }
5457
5558 STFUNC (StateRequestedSysInfo) {
5659 switch (ev->GetTypeRewrite ()) {
57- HFunc (TEvWhiteboard::TEvSystemStateResponse, Handle);
58- HFunc (TEvents::TEvUndelivered, Undelivered);
59- HFunc (TEvInterconnect::TEvNodeDisconnected, Disconnected);
60- CFunc (TEvents::TSystem::Wakeup, Timeout);
60+ hFunc (TEvWhiteboard::TEvSystemStateResponse, Handle);
61+ hFunc (TEvents::TEvUndelivered, Undelivered);
62+ hFunc (TEvInterconnect::TEvNodeDisconnected, Disconnected);
63+ hFunc (TEvInterconnect::TEvNodeConnected, Connected);
64+ cFunc (TEvents::TSystem::Wakeup, Timeout);
6165 }
6266 }
6367
64- void SendRequest (ui32 nodeId, const TActorContext& ctx ) {
68+ void SendRequest (ui32 nodeId) {
6569 TActorId whiteboardServiceId = MakeNodeWhiteboardServiceId (nodeId);
6670 THolder<TEvWhiteboard::TEvSystemStateRequest> request = MakeHolder<TEvWhiteboard::TEvSystemStateRequest>();
67- ctx. Send (whiteboardServiceId, request.Release (), IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession, nodeId);
68- ++NodesRequested ;
71+ Send (whiteboardServiceId, request.Release (), IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession, nodeId);
72+ NodesRequested++ ;
6973 }
7074
71- void NodeStateInfoReceived (const TActorContext& ctx ) {
75+ void NodeStateInfoReceived () {
7276 ++NodesReceived;
7377 if (NodesRequested == NodesReceived) {
74- ReplyAndDie (ctx );
78+ ReplyAndDie ();
7579 }
7680 }
7781
78- void Handle (TEvInterconnect::TEvNodesInfo::TPtr& ev, const TActorContext& ctx ) {
82+ void Handle (TEvInterconnect::TEvNodesInfo::TPtr& ev) {
7983 NodesInfo = ev->Release ();
8084 ui32 minAllowedNodeId = std::numeric_limits<ui32>::min ();
8185 ui32 maxAllowedNodeId = std::numeric_limits<ui32>::max ();
@@ -90,33 +94,38 @@ class TCountersHostsList : public TActorBootstrapped<TCountersHostsList> {
9094 }
9195 for (const auto & nodeInfo : NodesInfo->Nodes ) {
9296 if (nodeInfo.NodeId >= minAllowedNodeId && nodeInfo.NodeId <= maxAllowedNodeId) {
93- SendRequest (nodeInfo.NodeId , ctx );
97+ SendRequest (nodeInfo.NodeId );
9498 }
9599 }
96100 Become (&TThis::StateRequestedSysInfo);
97101 }
98102
99- void Handle (TEvWhiteboard::TEvSystemStateResponse::TPtr& ev, const TActorContext& ctx ) {
103+ void Handle (TEvWhiteboard::TEvSystemStateResponse::TPtr& ev) {
100104 ui64 nodeId = ev.Get ()->Cookie ;
101105 NodesResponses[nodeId] = ev->Release ();
102- NodeStateInfoReceived (ctx );
106+ NodeStateInfoReceived ();
103107 }
104108
105- void Undelivered (TEvents::TEvUndelivered::TPtr& ev, const TActorContext& ctx ) {
109+ void Undelivered (TEvents::TEvUndelivered::TPtr& ev) {
106110 ui32 nodeId = ev.Get ()->Cookie ;
107111 if (NodesResponses.emplace (nodeId, nullptr ).second ) {
108- NodeStateInfoReceived (ctx );
112+ NodeStateInfoReceived ();
109113 }
110114 }
111115
112- void Disconnected (TEvInterconnect::TEvNodeDisconnected::TPtr& ev, const TActorContext& ctx ) {
116+ void Disconnected (TEvInterconnect::TEvNodeDisconnected::TPtr& ev) {
113117 ui32 nodeId = ev->Get ()->NodeId ;
118+ TcpProxies.erase (ev->Sender );
114119 if (NodesResponses.emplace (nodeId, nullptr ).second ) {
115- NodeStateInfoReceived (ctx );
120+ NodeStateInfoReceived ();
116121 }
117122 }
118123
119- void ReplyAndDie (const TActorContext& ctx) {
124+ void Connected (TEvInterconnect::TEvNodeConnected::TPtr& ev) {
125+ TcpProxies.insert (ev->Sender );
126+ }
127+
128+ void ReplyAndDie () {
120129 TStringStream text;
121130 for (const auto & [nodeId, sysInfo] : NodesResponses) {
122131 if (sysInfo) {
@@ -147,12 +156,19 @@ class TCountersHostsList : public TActorBootstrapped<TCountersHostsList> {
147156 }
148157 }
149158 }
150- ctx.Send (Event->Sender , new NMon::TEvHttpInfoRes (Viewer->GetHTTPOKTEXT (Event->Get ()) + text.Str (), 0 , NMon::IEvHttpInfoRes::EContentType::Custom));
151- Die (ctx);
159+ Send (Event->Sender , new NMon::TEvHttpInfoRes (Viewer->GetHTTPOKTEXT (Event->Get ()) + text.Str (), 0 , NMon::IEvHttpInfoRes::EContentType::Custom));
160+ PassAway ();
161+ }
162+
163+ void PassAway () {
164+ for (auto &tcpPorxy: TcpProxies) {
165+ Send (tcpPorxy, new TEvents::TEvUnsubscribe);
166+ }
167+ TBase::PassAway ();
152168 }
153169
154- void Timeout (const TActorContext &ctx ) {
155- ReplyAndDie (ctx );
170+ void Timeout () {
171+ ReplyAndDie ();
156172 }
157173};
158174
0 commit comments