Переглянути джерело

HPCC-22551 Add support for removing nodes from topology server on closedown

Should make autoscale downwards better behaved.

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 4 роки тому
батько
коміт
d1e34ea3e7

+ 1 - 0
roxie/ccd/ccdmain.cpp

@@ -1425,6 +1425,7 @@ int CCD_API roxie_main(int argc, const char *argv[], const char * defaultYaml)
     setNodeCaching(false); // ditto
     perfMonHook.clear();
     stopAeronDriver();
+    stopTopoThread();
 
     strdup("Make sure leak checking is working");
     roxiemem::releaseRoxieHeap();

+ 12 - 4
roxie/topo/toposerver.cpp

@@ -123,10 +123,18 @@ void init_signals()
 
 void updateTopology(const std::string &newInfo)
 {
-    unsigned &found = topology[newInfo];
-    if (found==0)
-        responseDirty = true;
-    found = msTick();
+    if (newInfo[0]=='-')
+    {
+        if (topology.erase(newInfo.substr(1)))
+            responseDirty = true;
+    }
+    else
+    {
+        unsigned &found = topology[newInfo];
+        if (found==0)
+            responseDirty = true;
+        found = msTick();
+    }
 }
 
 void timeoutTopology()

+ 10 - 0
roxie/udplib/udptopo.cpp

@@ -265,6 +265,7 @@ public:
     TopologyManager() { currentTopology.setown(new CTopologyServer); };
     void setServers(const StringArray &_topoServers);
     void setRoles(const std::vector<RoxieEndpointInfo> &myRoles);
+    void closedown();
     const ITopologyServer &getCurrent();
 
     bool update();
@@ -400,6 +401,14 @@ void TopologyManager::setRoles(const std::vector<RoxieEndpointInfo> &myRoles)
     currentTopology.swap(newServer);
 }
 
+void TopologyManager::closedown()
+{
+    topoBuf.replaceString("server|", "-server|");
+    topoBuf.replaceString("agent|", "-agent|");
+    freeze(false);
+    update();
+}
+
 extern UDPLIB_API const ITopologyServer *getTopology()
 {
     return &topologyManager.getCurrent();
@@ -456,6 +465,7 @@ extern UDPLIB_API void publishTopology(unsigned traceLevel)
                 }
                 waitTime = topoUpdateInterval;
             }
+            topologyManager.closedown();
         });
     }
 }

+ 2 - 0
roxie/udplib/udptopo.hpp

@@ -126,6 +126,8 @@ struct RoxieEndpointInfo
 
 extern UDPLIB_API void initializeTopology(const StringArray &topoServers, const std::vector<RoxieEndpointInfo> &myRoles);
 extern UDPLIB_API void publishTopology(unsigned traceLevel);
+extern UDPLIB_API void stopTopoThread();
+
 #ifndef _CONTAINERIZED
 extern UDPLIB_API void createStaticTopology(const std::vector<RoxieEndpointInfo> &allRoles, unsigned traceLevel);
 #endif