From: Razvan Becheriu Date: Mon, 26 Aug 2024 20:19:48 +0000 (+0300) Subject: [#3542] do not open sockets in test mode X-Git-Tag: Kea-2.7.3~39 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0fbb3acd8a1b7dc235f798a3d24a8bbabbaa7204;p=thirdparty%2Fkea.git [#3542] do not open sockets in test mode --- diff --git a/ChangeLog b/ChangeLog index 66a423c03f..5e2de28480 100644 --- a/ChangeLog +++ b/ChangeLog @@ -52,8 +52,8 @@ Kea 2.7.2 (development) released on August 28, 2024 2273. [func]* fdupont The RBAC (role-based access control) hook library was extended to support the new HTTP/HTTPS control socket - of Kea servers. Its name changed to "libdhcp_rbac.so". - "libca_rbac.so" is now a symbolic link to it. + of Kea servers. Note its name changed too from + "libca_rbac.so" to "libdhcp_rbac.so". (Gitlab #3483) 2272. [perf] fdupont diff --git a/src/bin/dhcp4/json_config_parser.cc b/src/bin/dhcp4/json_config_parser.cc index 85b6f5c6e3..d22f8028cf 100644 --- a/src/bin/dhcp4/json_config_parser.cc +++ b/src/bin/dhcp4/json_config_parser.cc @@ -733,6 +733,10 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set, LOG_DEBUG(dhcp4_logger, DBG_DHCP4_COMMAND, DHCP4_CONFIG_START) .arg(server.redactConfig(config_set)->str()); + if (check_only) { + MultiThreadingMgr::instance().setTestMode(true); + } + auto answer = processDhcp4Config(config_set); int status_code = CONTROL_RESULT_SUCCESS; diff --git a/src/bin/dhcp6/json_config_parser.cc b/src/bin/dhcp6/json_config_parser.cc index c4c506bc9b..f5e283a422 100644 --- a/src/bin/dhcp6/json_config_parser.cc +++ b/src/bin/dhcp6/json_config_parser.cc @@ -524,6 +524,7 @@ processDhcp6Config(isc::data::ConstElementPtr config_set) { ControlSocketsParser parser; parser.parse(*srv_config, control_sockets); } + ConstElementPtr multi_threading = mutable_cfg->get("multi-threading"); if (multi_threading) { parameter_name = "multi-threading"; @@ -864,6 +865,10 @@ configureDhcp6Server(Dhcpv6Srv& server, isc::data::ConstElementPtr config_set, LOG_DEBUG(dhcp6_logger, DBG_DHCP6_COMMAND, DHCP6_CONFIG_START) .arg(server.redactConfig(config_set)->str()); + if (check_only) { + MultiThreadingMgr::instance().setTestMode(true); + } + auto answer = processDhcp6Config(config_set); int status_code = CONTROL_RESULT_SUCCESS; @@ -967,7 +972,7 @@ configureDhcp6Server(Dhcpv6Srv& server, isc::data::ConstElementPtr config_set, // configuration. This will add created subnets and option values into // the server's configuration. // This operation should be exception safe but let's make sure. - if (status_code == CONTROL_RESULT_SUCCESS && (!check_only || extra_checks)) { + if (status_code == CONTROL_RESULT_SUCCESS && !check_only) { try { // Setup the command channel. diff --git a/src/lib/config/cmd_http_listener.cc b/src/lib/config/cmd_http_listener.cc index 9dfea59bdf..394806e35c 100644 --- a/src/lib/config/cmd_http_listener.cc +++ b/src/lib/config/cmd_http_listener.cc @@ -40,6 +40,9 @@ CmdHttpListener::~CmdHttpListener() { void CmdHttpListener::start() { + if (MultiThreadingMgr::instance().isTestMode()) { + return; + } // We must be in multi-threading mode. if (!MultiThreadingMgr::instance().getMode()) { isc_throw(InvalidOperation, "CmdHttpListener cannot be started" diff --git a/src/lib/tcp/mt_tcp_listener_mgr.cc b/src/lib/tcp/mt_tcp_listener_mgr.cc index e880284bde..4680717463 100644 --- a/src/lib/tcp/mt_tcp_listener_mgr.cc +++ b/src/lib/tcp/mt_tcp_listener_mgr.cc @@ -40,6 +40,9 @@ MtTcpListenerMgr::~MtTcpListenerMgr() { void MtTcpListenerMgr::start() { + if (MultiThreadingMgr::instance().isTestMode()) { + return; + } // We must be in multi-threading mode. if (!MultiThreadingMgr::instance().getMode()) { isc_throw(InvalidOperation, "MtTcpListenerMgr cannot be started" diff --git a/src/lib/util/multi_threading_mgr.cc b/src/lib/util/multi_threading_mgr.cc index d1526b9b02..cab284d481 100644 --- a/src/lib/util/multi_threading_mgr.cc +++ b/src/lib/util/multi_threading_mgr.cc @@ -14,7 +14,8 @@ namespace isc { namespace util { MultiThreadingMgr::MultiThreadingMgr() - : enabled_(false), critical_section_count_(0), thread_pool_size_(0) { + : enabled_(false), test_mode_(false), critical_section_count_(0), + thread_pool_size_(0) { } MultiThreadingMgr::~MultiThreadingMgr() { diff --git a/src/lib/util/multi_threading_mgr.h b/src/lib/util/multi_threading_mgr.h index e86c48827e..f3da67bdde 100644 --- a/src/lib/util/multi_threading_mgr.h +++ b/src/lib/util/multi_threading_mgr.h @@ -154,6 +154,22 @@ public: /// @param enabled The new mode. void setMode(bool enabled); + /// @brief Sets or clears the test mode for @c MultiThreadingMgr. + /// + /// @param test_mode A flag which indicates that the @c MultiThreadingMgr is + /// in the test mode (if true), or not (if false). + void setTestMode(const bool test_mode) { + test_mode_ = test_mode; + } + + /// @brief Checks if the @c MultiThreadingMgr is in the test mode. + /// + /// @return true if the @c MultiThreadingMgr is in the test mode, false + /// otherwise. + bool isTestMode() const { + return (test_mode_); + } + /// @brief Enter critical section. /// /// When entering @ref MultiThreadingCriticalSection, increment internal @@ -308,6 +324,9 @@ private: /// otherwise. bool enabled_; + /// @brief Indicates if the @c MultiThreadingMgr is in the test mode. + bool test_mode_; + /// @brief The critical section count. /// /// In case the configuration is applied within a