From f90a09bc9f4bc58465ecf1a49082120eb852aa2e Mon Sep 17 00:00:00 2001 From: Thomas Markwalder Date: Mon, 20 Oct 2025 13:46:02 -0400 Subject: [PATCH] [#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 --- ...y-config-test-command-can-affect-ha-connections | 6 ++++++ src/bin/dhcp4/json_config_parser.cc | 4 +--- src/bin/dhcp6/json_config_parser.cc | 4 +--- src/lib/util/multi_threading_mgr.h | 14 ++++++++++++++ src/lib/util/tests/multi_threading_mgr_unittest.cc | 11 +++++++++++ 5 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 changelog_unreleased/4145-an-empty-config-test-command-can-affect-ha-connections 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()); +} -- 2.47.3