From: Thomas Markwalder Date: Mon, 20 Oct 2025 17:46:02 +0000 (-0400) Subject: [#4145] Reset MT test code X-Git-Tag: Kea-3.1.3~41 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f90a09bc9f4bc58465ecf1a49082120eb852aa2e;p=thirdparty%2Fkea.git [#4145] Reset MT test code new file: changelog_unreleased/4145-an-empty-config-test-command-can-affect-ha-connections modified: src/bin/dhcp4/json_config_parser.cc modified: src/bin/dhcp6/json_config_parser.cc modified: src/lib/util/multi_threading_mgr.h modified: src/lib/util/tests/multi_threading_mgr_unittest.cc --- diff --git a/changelog_unreleased/4145-an-empty-config-test-command-can-affect-ha-connections b/changelog_unreleased/4145-an-empty-config-test-command-can-affect-ha-connections new file mode 100644 index 0000000000..0e0a404ae4 --- /dev/null +++ b/changelog_unreleased/4145-an-empty-config-test-command-can-affect-ha-connections @@ -0,0 +1,6 @@ +[bug] tmark + Corrected an issue that was causing an + HA peer to not restart its dedicated listener + after handling a config-test command. + Applies to both kea-dhcp4 and kea-dhcp6. + (Gitlab #4145) diff --git a/src/bin/dhcp4/json_config_parser.cc b/src/bin/dhcp4/json_config_parser.cc index c819e71aa8..29b068bb65 100644 --- a/src/bin/dhcp4/json_config_parser.cc +++ b/src/bin/dhcp4/json_config_parser.cc @@ -753,9 +753,7 @@ 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); - } + MtTestMode(); auto answer = processDhcp4Config(config_set); diff --git a/src/bin/dhcp6/json_config_parser.cc b/src/bin/dhcp6/json_config_parser.cc index 72a055bf38..431f37719b 100644 --- a/src/bin/dhcp6/json_config_parser.cc +++ b/src/bin/dhcp6/json_config_parser.cc @@ -870,9 +870,7 @@ 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); - } + MtTestMode(); auto answer = processDhcp6Config(config_set); diff --git a/src/lib/util/multi_threading_mgr.h b/src/lib/util/multi_threading_mgr.h index f761f02eff..a9fdc3a8f2 100644 --- a/src/lib/util/multi_threading_mgr.h +++ b/src/lib/util/multi_threading_mgr.h @@ -387,6 +387,20 @@ public: virtual ~MultiThreadingCriticalSection(); }; +/// @brief RAII wrapper for MT test mode. +/// +/// The constructor enables test mode, the destructor disables it. +class MtTestMode : public boost::noncopyable { +public: + MtTestMode() { + MultiThreadingMgr::instance().setTestMode(true); + } + + ~MtTestMode() { + MultiThreadingMgr::instance().setTestMode(false); + } +}; + } // namespace util } // namespace isc diff --git a/src/lib/util/tests/multi_threading_mgr_unittest.cc b/src/lib/util/tests/multi_threading_mgr_unittest.cc index 400a7e95c0..733c474f0f 100644 --- a/src/lib/util/tests/multi_threading_mgr_unittest.cc +++ b/src/lib/util/tests/multi_threading_mgr_unittest.cc @@ -515,3 +515,14 @@ TEST_F(CriticalSectionCallbackTest, invocationsWithExceptions) { // Retest CriticalSections. runCriticalSections({}, {}); } + +/// @brief Verifies that the RAII wrapper for MT test mode works. +TEST_F(CriticalSectionCallbackTest, mtTestMode) { + ASSERT_FALSE(MultiThreadingMgr::instance().isTestMode()); + { + MtTestMode mt; + ASSERT_TRUE(MultiThreadingMgr::instance().isTestMode()); + } + + ASSERT_FALSE(MultiThreadingMgr::instance().isTestMode()); +}