diff options
author | Ratan Gupta <ratagupt@in.ibm.com> | 2017-09-22 18:26:11 +0530 |
---|---|---|
committer | Ratan Gupta <ratagupt@in.ibm.com> | 2017-10-11 18:17:17 +0530 |
commit | 16f12886cc31a81e48ef9ed8cdcef4a1599bdeac (patch) | |
tree | 36e201c6623a79f9c0151f74e32657c09b53674c | |
parent | e9c9b81c8c01e15306dad27a3281b582e775c44a (diff) | |
download | phosphor-networkd-16f12886cc31a81e48ef9ed8cdcef4a1599bdeac.tar.gz phosphor-networkd-16f12886cc31a81e48ef9ed8cdcef4a1599bdeac.zip |
Reduce the number of restarts of systemd-networkd
Start the timer once we get the dbus request and wait for timeout
if we get the dbus request in meanwhile, reset the timer and
wait for timeout.
Listen for ipv6 rtnetlink address also.
Resolves openbmc/openbmc#2227
Change-Id: I3f448e84107826defafb9ada523c1ab08ec1b971
Signed-off-by: Ratan Gupta <ratagupt@in.ibm.com>
-rw-r--r-- | network_manager.cpp | 23 | ||||
-rw-r--r-- | network_manager.hpp | 4 | ||||
-rw-r--r-- | network_manager_main.cpp | 38 | ||||
-rw-r--r-- | rtnetlink_server.cpp | 11 | ||||
-rw-r--r-- | test/test_network_manager.cpp | 4 | ||||
-rw-r--r-- | types.hpp | 8 |
6 files changed, 61 insertions, 27 deletions
diff --git a/network_manager.cpp b/network_manager.cpp index bb6d204..e9d8ad9 100644 --- a/network_manager.cpp +++ b/network_manager.cpp @@ -25,7 +25,8 @@ namespace phosphor namespace network { -extern std::unique_ptr<phosphor::network::Timer> refreshTimer; +extern std::unique_ptr<phosphor::network::Timer> refreshObjectTimer; +extern std::unique_ptr<phosphor::network::Timer> restartTimer; using namespace phosphor::logging; using namespace sdbusplus::xyz::openbmc_project::Common::Error; @@ -201,20 +202,24 @@ void Manager::writeToConfigurationFile() intf.second->writeConfigurationFile(); } - restartNetwork(); + restartTimers(); } -void Manager::restartNetwork() +void Manager::restartTimers() { using namespace std::chrono; - - if (refreshTimer && !refreshTimer->isExpired()) + if (refreshObjectTimer && restartTimer) { - auto time = duration_cast<microseconds>( - phosphor::network::networkChangeTimeout); - refreshTimer->startTimer(time); + // start the restart timer. + auto restartTime = duration_cast<microseconds>( + phosphor::network::restartTimeout); + restartTimer->startTimer(restartTime); + + // start the refresh timer. + auto refreshTime = duration_cast<microseconds>( + phosphor::network::refreshTimeout); + refreshObjectTimer->startTimer(refreshTime); } - restartSystemdUnit("systemd-networkd.service"); } }//namespace network diff --git a/network_manager.hpp b/network_manager.hpp index 70ed8fc..7685ba8 100644 --- a/network_manager.hpp +++ b/network_manager.hpp @@ -103,8 +103,8 @@ class Manager : public details::VLANCreateIface */ bool createDefaultNetworkFiles(bool force); - /** @brief restart the systemd networkd. */ - void restartNetwork(); + /** @brief restart the network timers. */ + void restartTimers(); private: /** @brief Persistent sdbusplus DBus bus connection. */ diff --git a/network_manager_main.cpp b/network_manager_main.cpp index 969b705..0c95c8d 100644 --- a/network_manager_main.cpp +++ b/network_manager_main.cpp @@ -15,25 +15,47 @@ namespace network { std::unique_ptr<phosphor::network::Manager> manager = nullptr; -std::unique_ptr<phosphor::network::Timer> refreshTimer = nullptr; +std::unique_ptr<phosphor::network::Timer> refreshObjectTimer = nullptr; +std::unique_ptr<phosphor::network::Timer> restartTimer = nullptr; +/** @brief refresh the network objects. */ void refreshObjects() { - manager->createChildObjects(); + if (manager) + { + manager->createChildObjects(); + } +} + +/** @brief restart the systemd networkd. */ +void restartNetwork() +{ + restartSystemdUnit("systemd-networkd.service"); } } //namespace network } //namespace phosphor +void initializeTimers() +{ + std::function<void()> refreshFunc( + std::bind(&phosphor::network::refreshObjects)); + + std::function<void()> restartFunc( + std::bind(&phosphor::network::restartNetwork)); + + phosphor::network::refreshObjectTimer = + std::make_unique<phosphor::network::Timer>(refreshFunc); + + phosphor::network::restartTimer = + std::make_unique<phosphor::network::Timer>(restartFunc); +} + int main(int argc, char *argv[]) { using namespace phosphor::logging; - std::function<void()> func( - std::bind(&phosphor::network::refreshObjects)); - - phosphor::network::refreshTimer = - std::make_unique<phosphor::network::Timer>(func); + initializeTimers(); auto bus = sdbusplus::bus::new_default(); @@ -75,7 +97,7 @@ int main(int argc, char *argv[]) // if files created restart the network. // don't need to call the create child objects as eventhandler // will create it. - phosphor::network::manager->restartNetwork(); + phosphor::network::restartNetwork(); } return svr.run(); } diff --git a/rtnetlink_server.cpp b/rtnetlink_server.cpp index 91e9947..31dbfd1 100644 --- a/rtnetlink_server.cpp +++ b/rtnetlink_server.cpp @@ -21,7 +21,7 @@ namespace phosphor namespace network { -extern std::unique_ptr<phosphor::network::Timer> refreshTimer; +extern std::unique_ptr<phosphor::network::Timer> refreshObjectTimer; namespace rtnetlink { @@ -46,13 +46,13 @@ static int eventHandler(sd_event_source* es, int fd, uint32_t revents, { // starting the timer here to make sure that we don't want // create the child objects multiple times. - if (refreshTimer->isExpired()) + if (refreshObjectTimer->isExpired()) { using namespace std::chrono; - auto time = duration_cast<microseconds>(networkChangeTimeout); + auto time = duration_cast<microseconds>(refreshTimeout); // if start timer throws exception then let the application // crash - refreshTimer->startTimer(time); + refreshObjectTimer->startTimer(time); } // end if } // end if @@ -63,7 +63,6 @@ static int eventHandler(sd_event_source* es, int fd, uint32_t revents, return 0; } - int Server::run() { using namespace phosphor::logging; @@ -118,7 +117,7 @@ int Server::run() memset(&addr, 0, sizeof(addr)); addr.nl_family = AF_NETLINK; - addr.nl_groups = RTMGRP_IPV4_IFADDR; + addr.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR; if (bind(smartSock(), (struct sockaddr*)&addr, sizeof(addr)) < 0) { diff --git a/test/test_network_manager.cpp b/test/test_network_manager.cpp index 6281081..8413c01 100644 --- a/test/test_network_manager.cpp +++ b/test/test_network_manager.cpp @@ -21,7 +21,9 @@ namespace phosphor namespace network { -std::unique_ptr<phosphor::network::Timer> refreshTimer = nullptr; +std::unique_ptr<phosphor::network::Timer> refreshObjectTimer = nullptr; +std::unique_ptr<phosphor::network::Timer> restartTimer = nullptr; + namespace fs = std::experimental::filesystem; class TestNetworkManager : public testing::Test @@ -17,7 +17,13 @@ namespace network { using namespace std::chrono_literals; -constexpr auto networkChangeTimeout = 1s; + +// wait for three seconds before restarting the networkd +constexpr auto restartTimeout = 3s; + +// refresh the objets after five seconds as network +// configuration takes 3-4 sec after systemd-networkd restart. +constexpr auto refreshTimeout = restartTimeout + 5s; namespace systemd { |