]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#1188] stop thread pool when applying configuration and use multi threading critical...
authorRazvan Becheriu <razvan@isc.org>
Fri, 24 Apr 2020 08:38:05 +0000 (11:38 +0300)
committerRazvan Becheriu <razvan@isc.org>
Thu, 30 Apr 2020 10:53:48 +0000 (13:53 +0300)
src/bin/dhcp4/ctrl_dhcp4_srv.cc
src/bin/dhcp6/ctrl_dhcp6_srv.cc

index 96fe4484107843047c5b4aade966e7e11c1805cd..8b4872fa5dfc0bcde3228e0ed9108b01734ebf18 100644 (file)
@@ -229,6 +229,8 @@ ControlledDhcpv4Srv::commandShutdownHandler(const string&, ConstElementPtr args)
 
 ConstElementPtr
 ControlledDhcpv4Srv::commandLibReloadHandler(const string&, ConstElementPtr) {
+    // pause dhcp service when reloading libraries
+    MultiThreadingCriticalSection cs;
     /// @todo delete any stored CalloutHandles referring to the old libraries
     /// Get list of currently loaded libraries and reload them.
     HookLibsCollection loaded = HooksManager::getLibraryInfo();
@@ -352,6 +354,9 @@ ControlledDhcpv4Srv::commandConfigSetHandler(const string&,
         return (result);
     }
 
+    // disable multi-threading (it will be applied by new configuration)
+    MultiThreadingMgr::instance().apply(false, 0, 0);
+
     // We are starting the configuration process so we should remove any
     // staging configuration that has been created during previous
     // configuration attempts.
@@ -662,8 +667,8 @@ ControlledDhcpv4Srv::processCommand(const string& command,
 
     if (!srv) {
         ConstElementPtr no_srv = isc::config::createAnswer(1,
-          "Server object not initialized, so can't process command '" +
-          command + "', arguments: '" + txt + "'.");
+            "Server object not initialized, so can't process command '" +
+            command + "', arguments: '" + txt + "'.");
         return (no_srv);
     }
 
@@ -713,9 +718,10 @@ ControlledDhcpv4Srv::processCommand(const string& command,
         } else if (command == "status-get") {
             return (srv->commandStatusGetHandler(command, args));
         }
-        ConstElementPtr answer = isc::config::createAnswer(1,
-                                 "Unrecognized command:" + command);
-        return (answer);
+
+        return (isc::config::createAnswer(1, "Unrecognized command:"
+                                          + command));
+
     } catch (const Exception& ex) {
         return (isc::config::createAnswer(1, "Error while processing command '"
                                           + command + "':" + ex.what() +
index eca00121801db23e5fdc89bb37d2ba44e68595d6..d1ffda7afb376bc99b12c492c2656d030beaf5d5 100644 (file)
@@ -227,11 +227,13 @@ ControlledDhcpv6Srv::commandShutdownHandler(const string&, ConstElementPtr args)
     }
 
     ControlledDhcpv6Srv::getInstance()->shutdownServer(exit_value);
-    return(createAnswer(CONTROL_RESULT_SUCCESS, "Shutting down."));
+    return (createAnswer(CONTROL_RESULT_SUCCESS, "Shutting down."));
 }
 
 ConstElementPtr
 ControlledDhcpv6Srv::commandLibReloadHandler(const string&, ConstElementPtr) {
+    // pause dhcp service when reloading libraries
+    MultiThreadingCriticalSection cs;
     /// @todo delete any stored CalloutHandles referring to the old libraries
     /// Get list of currently loaded libraries and reload them.
     HookLibsCollection loaded = HooksManager::getLibraryInfo();
@@ -355,6 +357,9 @@ ControlledDhcpv6Srv::commandConfigSetHandler(const string&,
         return (result);
     }
 
+    // disable multi-threading (it will be applied by new configuration)
+    MultiThreadingMgr::instance().apply(false, 0, 0);
+
     // We are starting the configuration process so we should remove any
     // staging configuration that has been created during previous
     // configuration attempts.
@@ -665,8 +670,8 @@ ControlledDhcpv6Srv::processCommand(const string& command,
 
     if (!srv) {
         ConstElementPtr no_srv = isc::config::createAnswer(1,
-          "Server object not initialized, can't process command '" +
-          command + "', arguments: '" + txt + "'.");
+            "Server object not initialized, so can't process command '" +
+            command + "', arguments: '" + txt + "'.");
         return (no_srv);
     }
 
@@ -722,7 +727,8 @@ ControlledDhcpv6Srv::processCommand(const string& command,
 
     } catch (const Exception& ex) {
         return (isc::config::createAnswer(1, "Error while processing command '"
-                                          + command + "':" + ex.what()));
+                                          + command + "':" + ex.what() +
+                                          ", params: '" + txt + "'"));
     }
 }