Browse Source

[3668] Install LFC timer for the DHCPv4 and DHCPv6 server.

Marcin Siodelski 10 years ago
parent
commit
aaababbd72

+ 7 - 0
src/bin/dhcp4/dhcp4_messages.mes

@@ -187,6 +187,13 @@ specified client after receiving a REQUEST message from it.  There are many
 possible reasons for such a failure. Additional messages will indicate the
 possible reasons for such a failure. Additional messages will indicate the
 reason.
 reason.
 
 
+% DHCP4_LEASE_DATABASE_TIMERS_EXEC_FAIL failed to execute the timers for lease database: %1
+A warning message executed when a server process is unable to execute
+the periodic actions for the lease database. An example of the periodic
+action is a Lease File Cleanup. One of the reasons for the failure is
+a misconfiguration of the lease database, whereby the lease database
+hasn't been selected.
+
 % DHCP4_NAME_GEN_UPDATE_FAIL failed to update the lease after generating name for a client: %1
 % DHCP4_NAME_GEN_UPDATE_FAIL failed to update the lease after generating name for a client: %1
 This message indicates the failure when trying to update the lease and/or
 This message indicates the failure when trying to update the lease and/or
 options in the server's response with the hostname generated by the server
 options in the server's response with the hostname generated by the server

+ 24 - 3
src/bin/dhcp4/dhcp4_srv.cc

@@ -1,4 +1,4 @@
-// Copyright (C) 2011-2014 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC")
 //
 //
 // Permission to use, copy, modify, and/or distribute this software for any
 // Permission to use, copy, modify, and/or distribute this software for any
 // purpose with or without fee is hereby granted, provided that the above
 // purpose with or without fee is hereby granted, provided that the above
@@ -40,6 +40,7 @@
 #include <hooks/hooks_manager.h>
 #include <hooks/hooks_manager.h>
 #include <util/strutil.h>
 #include <util/strutil.h>
 
 
+#include <asio.hpp>
 #include <boost/bind.hpp>
 #include <boost/bind.hpp>
 #include <boost/foreach.hpp>
 #include <boost/foreach.hpp>
 
 
@@ -149,9 +150,20 @@ Dhcpv4Srv::sendPacket(const Pkt4Ptr& packet) {
 bool
 bool
 Dhcpv4Srv::run() {
 Dhcpv4Srv::run() {
     while (!shutdown_) {
     while (!shutdown_) {
-        /// @todo: calculate actual timeout once we have lease database
+        /// @todo Currently we're using the fixed value of the timeout for
+        /// select. This value shouldn't be changed. Keeping it at 1s
+        /// guarantees that the main loop will be executed at least once
+        /// a seconds allowing for executing the interval timers associated
+        /// with the lease database backend in use. The intervals for these
+        /// timers are configured using the unit of 1 second. Bumping up
+        /// the select timeout would cause the timers to go out of sync
+        /// with the configured value.
+        /// Probing for the packets at this pace should not cause a
+        /// significant rise of the CPU usage. However, in the future we
+        /// should adjust the select timeout to the value reported by the
+        /// lease database backend as a minimal poll interval.
         //cppcheck-suppress variableScope This is temporary anyway
         //cppcheck-suppress variableScope This is temporary anyway
-        const int timeout = 1000;
+        const int timeout = 1;
 
 
         // client's message and server's response
         // client's message and server's response
         Pkt4Ptr query;
         Pkt4Ptr query;
@@ -183,6 +195,15 @@ Dhcpv4Srv::run() {
         // terminate.
         // terminate.
         handleSignal();
         handleSignal();
 
 
+        // Execute ready timers for the lease database, e.g. Lease File Cleanup.
+        try {
+            LeaseMgrFactory::instance().getIOService()->get_io_service().poll();
+
+        } catch (const std::exception& ex) {
+            LOG_WARN(dhcp4_logger, DHCP4_LEASE_DATABASE_TIMERS_EXEC_FAIL)
+                .arg(ex.what());
+        }
+
         // Timeout may be reached or signal received, which breaks select()
         // Timeout may be reached or signal received, which breaks select()
         // with no reception ocurred
         // with no reception ocurred
         if (!query) {
         if (!query) {

+ 7 - 0
src/bin/dhcp6/dhcp6_messages.mes

@@ -275,6 +275,13 @@ failed to grant a non-temporary address lease for the client. There may
 be many reasons for such failure. Each failure is logged in a separate
 be many reasons for such failure. Each failure is logged in a separate
 log entry.
 log entry.
 
 
+% DHCP6_LEASE_DATABASE_TIMERS_EXEC_FAIL failed to execute the timers for lease database: %1
+A warning message executed when a server process is unable to execute
+the periodic actions for the lease database. An example of the periodic
+action is a Lease File Cleanup. One of the reasons for the failure is
+a misconfiguration of the lease database, whereby the lease database
+hasn't been selected.
+
 % DHCP6_LEASE_NA_WITHOUT_DUID address lease for address %1 does not have a DUID
 % DHCP6_LEASE_NA_WITHOUT_DUID address lease for address %1 does not have a DUID
 This error message indicates a database consistency problem. The lease
 This error message indicates a database consistency problem. The lease
 database has an entry indicating that the given address is in use,
 database has an entry indicating that the given address is in use,

+ 25 - 8
src/bin/dhcp6/dhcp6_srv.cc

@@ -1,4 +1,4 @@
-// Copyright (C) 2011-2014 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC")
 //
 //
 // Permission to use, copy, modify, and/or distribute this software for any
 // Permission to use, copy, modify, and/or distribute this software for any
 // purpose with or without fee is hereby granted, provided that the above
 // purpose with or without fee is hereby granted, provided that the above
@@ -47,6 +47,8 @@
 #include <util/io_utilities.h>
 #include <util/io_utilities.h>
 #include <util/range_utilities.h>
 #include <util/range_utilities.h>
 
 
+#include <asio.hpp>
+
 #include <boost/bind.hpp>
 #include <boost/bind.hpp>
 #include <boost/foreach.hpp>
 #include <boost/foreach.hpp>
 #include <boost/tokenizer.hpp>
 #include <boost/tokenizer.hpp>
@@ -228,14 +230,20 @@ Dhcpv6Srv::testUnicast(const Pkt6Ptr& pkt) const {
 
 
 bool Dhcpv6Srv::run() {
 bool Dhcpv6Srv::run() {
     while (!shutdown_) {
     while (!shutdown_) {
-        /// @todo Calculate actual timeout to the next event (e.g. lease
+        /// @todo Currently we're using the fixed value of the timeout for
-        /// expiration) once we have lease database. The idea here is that
+        /// select. This value shouldn't be changed. Keeping it at 1s
-        /// it is possible to do everything in a single process/thread.
+        /// guarantees that the main loop will be executed at least once
-        /// For now, we are just calling select for 1000 seconds. There
+        /// a seconds allowing for executing the interval timers associated
-        /// were some issues reported on some systems when calling select()
+        /// with the lease database backend in use. The intervals for these
-        /// with too large values. Unfortunately, I don't recall the details.
+        /// timers are configured using the unit of 1 second. Bumping up
+        /// the select timeout would cause the timers to go out of sync
+        /// with the configured value.
+        /// Probing for the packets at this pace should not cause a
+        /// significant rise of the CPU usage. However, in the future we
+        /// should adjust the select timeout to the value reported by the
+        /// lease database backend as a minimal poll interval.
         //cppcheck-suppress variableScope This is temporary anyway
         //cppcheck-suppress variableScope This is temporary anyway
-        const int timeout = 1000;
+        const int timeout = 1;
 
 
         // client's message and server's response
         // client's message and server's response
         Pkt6Ptr query;
         Pkt6Ptr query;
@@ -266,6 +274,15 @@ bool Dhcpv6Srv::run() {
         // terminate.
         // terminate.
         handleSignal();
         handleSignal();
 
 
+        // Execute ready timers for the lease database, e.g. Lease File Cleanup.
+        try {
+            LeaseMgrFactory::instance().getIOService()->get_io_service().poll();
+
+        } catch (const std::exception& ex) {
+            LOG_WARN(dhcp6_logger, DHCP6_LEASE_DATABASE_TIMERS_EXEC_FAIL)
+                .arg(ex.what());
+        }
+
         // Timeout may be reached or signal received, which breaks select()
         // Timeout may be reached or signal received, which breaks select()
         // with no packet received
         // with no packet received
         if (!query) {
         if (!query) {

+ 5 - 0
src/lib/dhcpsrv/dhcpsrv_messages.mes

@@ -302,6 +302,11 @@ memory.
 A debug message issued when DHCPv6 lease is being loaded from the file to
 A debug message issued when DHCPv6 lease is being loaded from the file to
 memory.
 memory.
 
 
+% DHCPSRV_MEMFILE_LFC_SETUP setting up the Lease File Cleanup interval to %1 sec
+An info message logged when the Memfile lease database backend configures
+the LFC to be executed periodically. An argument holds the interval in seconds
+in which the LFC will be executed.
+
 % DHCPSRV_MEMFILE_LFC_START starting Lease File Cleanup
 % DHCPSRV_MEMFILE_LFC_START starting Lease File Cleanup
 An info message issued when the Memfile lease database backend starts the
 An info message issued when the Memfile lease database backend starts the
 periodic Lease File Cleanup.
 periodic Lease File Cleanup.

+ 1 - 0
src/lib/dhcpsrv/memfile_lease_mgr.cc

@@ -491,6 +491,7 @@ Memfile_LeaseMgr::initTimers(const Universe& universe) {
     if (lfc_interval > 0) {
     if (lfc_interval > 0) {
         asiolink::IntervalTimer::Callback cb =
         asiolink::IntervalTimer::Callback cb =
             boost::bind(&Memfile_LeaseMgr::lfcCallback, this);
             boost::bind(&Memfile_LeaseMgr::lfcCallback, this);
+        LOG_INFO(dhcpsrv_logger, DHCPSRV_MEMFILE_LFC_SETUP).arg(lfc_interval);
         lfc_timer_.setup(cb, lfc_interval * 1000);
         lfc_timer_.setup(cb, lfc_interval * 1000);
     }
     }
 }
 }