From: Thomas Markwalder Date: Thu, 13 Feb 2014 19:39:10 +0000 (-0500) Subject: [3329] D2ClientMgr now supports suspending updates. X-Git-Tag: bind10-1.2.0beta1-release~45^2~6 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e448f9b0e46ea1a4812572818c5f63051b697ef0;p=thirdparty%2Fkea.git [3329] D2ClientMgr now supports suspending updates. Added ability to suspend DDNS updates to D2ClientMgr, so updating can be stopped when errors communications with D2 fail. Made D2ClientMgr non-copyable to avoid programmatic errors. Changed D2ClientMgr to return simply return from startSender() if already in send mode. --- diff --git a/src/lib/dhcpsrv/d2_client_mgr.cc b/src/lib/dhcpsrv/d2_client_mgr.cc index e43bbdbd22..111f3707f0 100644 --- a/src/lib/dhcpsrv/d2_client_mgr.cc +++ b/src/lib/dhcpsrv/d2_client_mgr.cc @@ -36,6 +36,19 @@ D2ClientMgr::~D2ClientMgr(){ stopSender(); } +void +D2ClientMgr::suspendUpdates() { + if (ddnsEnabled()) { + /// @todo For now we will disable updates and stop sending. + /// This at least provides a means to shut it off if there are errors. + LOG_WARN(dhcpsrv_logger, DHCPSRV_DHCP_DDNS_SUSPEND_UPDATES); + d2_client_config_->enableUpdates(false); + if (name_change_sender_) { + stopSender(); + } + } +} + void D2ClientMgr::setD2ClientConfig(D2ClientConfigPtr& new_config) { if (!new_config) { @@ -45,9 +58,11 @@ D2ClientMgr::setD2ClientConfig(D2ClientConfigPtr& new_config) { // Don't do anything unless configuration values are actually different. if (*d2_client_config_ != *new_config) { + // Make sure we stop sending first. + stopSender(); if (!new_config->getEnableUpdates()) { - // Updating has been turned off, destroy current sender. - // Any queued requests are tossed. + // Updating has been turned off. + // Destroy current sender (any queued requests are tossed). name_change_sender_.reset(); } else { dhcp_ddns::NameChangeSenderPtr new_sender; @@ -84,7 +99,6 @@ D2ClientMgr::setD2ClientConfig(D2ClientConfigPtr& new_config) { /// then the queued contents might now be invalid. There is /// no way to regenerate them if they are wrong. if (name_change_sender_) { - name_change_sender_->stopSending(); new_sender->assumeQueue(*name_change_sender_); } @@ -194,15 +208,25 @@ D2ClientMgr::qualifyName(const std::string& partial_name) const { void D2ClientMgr::startSender(D2ClientErrorHandler error_handler) { + if (amSending()) { + return; + } + // Create a our own service instance when we are not being multiplexed // into an external service.. private_io_service_.reset(new asiolink::IOService()); startSender(error_handler, *private_io_service_); + LOG_INFO(dhcpsrv_logger, DHCPSRV_DHCP_DDNS_SENDER_STARTED) + .arg(d2_client_config_->toText()); } void D2ClientMgr::startSender(D2ClientErrorHandler error_handler, isc::asiolink::IOService& io_service) { + if (amSending()) { + return; + } + if (!name_change_sender_) { isc_throw(D2ClientError, "D2ClientMgr::startSender sender is null"); } @@ -242,6 +266,7 @@ D2ClientMgr::stopSender() { // If its not null, call stop. if (name_change_sender_) { name_change_sender_->stopSending(); + LOG_INFO(dhcpsrv_logger, DHCPSRV_DHCP_DDNS_SENDER_STOPPED); } } diff --git a/src/lib/dhcpsrv/d2_client_mgr.h b/src/lib/dhcpsrv/d2_client_mgr.h index de47c122ec..c367551fa5 100644 --- a/src/lib/dhcpsrv/d2_client_mgr.h +++ b/src/lib/dhcpsrv/d2_client_mgr.h @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -80,7 +81,8 @@ boost::function