2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-08-31 14:05:33 +00:00

[3997] Corrected DHCP6 server crash on exit when DDNS is enabled

Rather that stopping it explicitly, the server was relying D2ClientMgr
to stop itself during its own destruction.  This was falling over during
process wind-down because the IfaceMgr singletone was being destroyed before
the D2ClientMgr instance.  The server destructor now explicitly stops the
D2ClientMgr.

src/bin/dhcp6/dhcp6_messages.mes
    added DHCP6_SRV_D2STOP_ERROR log message

src/bin/dhcp6/dhcp6_srv.cc
    Dhcpv6Srv::stopD2() - new method stops the NCR sender, causing it to
    unregister its WathSocket from IfaceMgr

    Dhcpv6Srv::~Dhcpv6Srv() - added call to Dhcpv6Srv::stopD2()

src/bin/dhcp6/tests/dhcp6_process_tests.sh.in
    Enabled DNS updates in the CONFIG string.  This ensures the D2
    client will be started during system tests
This commit is contained in:
Thomas Markwalder
2015-08-12 16:28:55 -04:00
parent 5e855328c8
commit ef1033c4c4
5 changed files with 35 additions and 1 deletions

View File

@@ -269,6 +269,7 @@ Dhcpv4Srv::~Dhcpv4Srv() {
// Highly unlikely, but lets Report it but go on
LOG_ERROR(dhcp4_logger, DHCP4_SRV_D2STOP_ERROR).arg(ex.what());
}
IfaceMgr::instance().closeSockets();
}

View File

@@ -676,6 +676,12 @@ core component within the IPv6 DHCP server (the Dhcpv6 server object)
has failed. As a result, the server will exit. The reason for the
failure is given within the message.
% DHCP6_SRV_D2STOP_ERROR error stopping IO with DHCP_DDNS during shutdown: %1
This error message indicates that during shutdown, an erro occurred while
stopping IO between the DHCPv6 server and the DHCP_DDNS server. This is
probably due to a programmatic error is not likely to impact either server
upon restart. The reason for the failure is given within the message.
% DHCP6_STANDALONE skipping message queue, running standalone
This is a debug message indicating that the IPv6 server is running in
standalone mode, not connected to the message queue. Standalone mode

View File

@@ -229,6 +229,13 @@ Dhcpv6Srv::Dhcpv6Srv(uint16_t port)
}
Dhcpv6Srv::~Dhcpv6Srv() {
try {
stopD2();
} catch(const std::exception& ex) {
// Highly unlikely, but lets Report it but go on
LOG_ERROR(dhcp6_logger, DHCP6_SRV_D2STOP_ERROR).arg(ex.what());
}
IfaceMgr::instance().closeSockets();
LeaseMgrFactory::destroy();
@@ -2872,6 +2879,15 @@ Dhcpv6Srv::startD2() {
}
}
void
Dhcpv6Srv::stopD2() {
D2ClientMgr& d2_mgr = CfgMgr::instance().getD2ClientMgr();
if (d2_mgr.ddnsEnabled()) {
// Updates are enabled, so lets stop the sender
d2_mgr.stopSender();
}
}
void
Dhcpv6Srv::d2ClientErrorHandler(const
dhcp_ddns::NameChangeSender::Result result,

View File

@@ -124,6 +124,13 @@ public:
/// D2ClientErrors. This method does not catch exceptions.
void startD2();
/// @brief Stops DHCP_DDNS client IO if DDNS updates are enabled.
///
/// If updates are enabled, it instructs the D2ClientMgr singleton to
/// leave send mode. If D2ClientMgr encounters errors it may throw
/// D2ClientErrors. This method does not catch exceptions.
void stopD2();
/// @brief Implements the error handler for DHCP_DDNS IO errors
///
/// Invoked when a NameChangeRequest send to kea-dhcp-ddns completes with

View File

@@ -37,7 +37,11 @@ CONFIG="{
{
\"subnet\": \"2001:db8:1::/64\",
\"pools\": [ { \"pool\": \"2001:db8:1::10-2001:db8:1::100\" } ]
} ]
} ],
\"dhcp-ddns\": {
\"enable-updates\": true,
\"qualifying-suffix\": \"\"
}
},
\"Logging\":