From: Francis Dupont Date: Sat, 31 Dec 2016 19:17:16 +0000 (+0100) Subject: [5095] Second attempt with a shared callout manager X-Git-Tag: trac3590_base~15^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=334d8f1c329956a0aad8a75de3d8fe6327a6dca9;p=thirdparty%2Fkea.git [5095] Second attempt with a shared callout manager --- diff --git a/src/bin/dhcp4/tests/hooks_unittest.cc b/src/bin/dhcp4/tests/hooks_unittest.cc index b57ba29740..c9cef864cd 100644 --- a/src/bin/dhcp4/tests/hooks_unittest.cc +++ b/src/bin/dhcp4/tests/hooks_unittest.cc @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -111,6 +112,7 @@ public: HooksManager::preCalloutsLibraryHandle().deregisterAllCallouts("lease4_release"); HooksManager::preCalloutsLibraryHandle().deregisterAllCallouts("lease4_decline"); + CalloutManager::getSharedManager().reset(); delete srv_; } @@ -1607,6 +1609,9 @@ TEST_F(HooksDhcpv4SrvTest, HooksDecline) { IfaceMgrTestConfig test_config(true); IfaceMgr::instance().openSockets4(); + // Libraries will be reloaded later + CalloutManager::getSharedManager().reset(new CalloutManager(0)); + // Install a callout EXPECT_NO_THROW(HooksManager::preCalloutsLibraryHandle().registerCallout( "lease4_decline", lease4_decline_callout)); @@ -1653,6 +1658,9 @@ TEST_F(HooksDhcpv4SrvTest, HooksDeclineDrop) { IfaceMgrTestConfig test_config(true); IfaceMgr::instance().openSockets4(); + // Libraries will be reloaded later + CalloutManager::getSharedManager().reset(new CalloutManager(0)); + // Install a callout EXPECT_NO_THROW(HooksManager::preCalloutsLibraryHandle().registerCallout( "lease4_decline", lease4_decline_drop_callout)); diff --git a/src/bin/dhcp6/tests/hooks_unittest.cc b/src/bin/dhcp6/tests/hooks_unittest.cc index 975fd797fc..82f928e2f6 100644 --- a/src/bin/dhcp6/tests/hooks_unittest.cc +++ b/src/bin/dhcp6/tests/hooks_unittest.cc @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -113,10 +114,17 @@ public: // Clear static buffers resetCalloutBuffers(); + + // Reset the hook system in its original state + HooksManager::unloadLibraries(); } /// @brief destructor (deletes Dhcpv6Srv) ~HooksDhcpv6SrvTest() { + + // Clear shared manager + CalloutManager::getSharedManager().reset(); + } /// @brief creates an option with specified option code @@ -2082,6 +2090,9 @@ TEST_F(HooksDhcpv6SrvTest, skipLease6Rebind) { TEST_F(HooksDhcpv6SrvTest, basicLease6Decline) { IfaceMgrTestConfig test_config(true); + // Libraries will be reloaded later + CalloutManager::getSharedManager().reset(new CalloutManager(0)); + // Install lease6_decline callout EXPECT_NO_THROW(HooksManager::preCalloutsLibraryHandle().registerCallout( "lease6_decline", lease6_decline_callout)); @@ -2126,10 +2137,12 @@ TEST_F(HooksDhcpv6SrvTest, basicLease6Decline) { } // Test that the lease6_decline hook point can handle SKIP status. -/// @todo: Reenable this once #5095 is fixed. -TEST_F(HooksDhcpv6SrvTest, DISABLED_lease6DeclineSkip) { +TEST_F(HooksDhcpv6SrvTest, lease6DeclineSkip) { IfaceMgrTestConfig test_config(true); + // Libraries will be reloaded later + CalloutManager::getSharedManager().reset(new CalloutManager(0)); + // Install lease6_decline callout. It will set the status to skip EXPECT_NO_THROW(HooksManager::preCalloutsLibraryHandle().registerCallout( "lease6_decline", lease6_decline_skip_callout)); @@ -2174,6 +2187,9 @@ TEST_F(HooksDhcpv6SrvTest, DISABLED_lease6DeclineSkip) { TEST_F(HooksDhcpv6SrvTest, lease6DeclineDrop) { IfaceMgrTestConfig test_config(true); + // Libraries will be reloaded later + CalloutManager::getSharedManager().reset(new CalloutManager(0)); + // Install lease6_decline callout. It will set the status to skip EXPECT_NO_THROW(HooksManager::preCalloutsLibraryHandle().registerCallout( "lease6_decline", lease6_decline_drop_callout)); diff --git a/src/lib/hooks/callout_manager.cc b/src/lib/hooks/callout_manager.cc index d41f7df443..2ab33d7c23 100644 --- a/src/lib/hooks/callout_manager.cc +++ b/src/lib/hooks/callout_manager.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2013-2015 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2013-2016 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -24,6 +24,8 @@ using namespace std; namespace isc { namespace hooks { +boost::shared_ptr CalloutManager::shared_manager_; + // Constructor CalloutManager::CalloutManager(int num_libraries) : server_hooks_(ServerHooks::getServerHooks()), diff --git a/src/lib/hooks/callout_manager.h b/src/lib/hooks/callout_manager.h index 843e1b9cc8..d58855580e 100644 --- a/src/lib/hooks/callout_manager.h +++ b/src/lib/hooks/callout_manager.h @@ -1,4 +1,4 @@ -// Copyright (C) 2013-2015 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2013-2016 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -298,6 +298,13 @@ public: //@} + /// @brief Return the shared manager + /// + /// @return A reference to the shared manager + static boost::shared_ptr& getSharedManager() { + return (shared_manager_); + } + private: /// @brief Check library index /// @@ -368,6 +375,9 @@ private: /// Number of libraries. int num_libraries_; + + /// Shared manager to survive library reloads + static boost::shared_ptr shared_manager_; }; } // namespace util diff --git a/src/lib/hooks/library_manager_collection.cc b/src/lib/hooks/library_manager_collection.cc index ae2a37aa30..1cdc55a1c2 100644 --- a/src/lib/hooks/library_manager_collection.cc +++ b/src/lib/hooks/library_manager_collection.cc @@ -62,7 +62,15 @@ LibraryManagerCollection::loadLibraries() { // The upshot of this is that it is therefore safe for the CalloutManager // to be deleted after all associated libraries are deleted, hence this // link (LibraryManager -> CalloutManager) is safe. - callout_manager_.reset(new CalloutManager(library_names_.size())); + // + // To survive reloads an attempt to re-use the shared manager + // is performed when the list of library is empty. + if (library_names_.empty()) { + callout_manager_ = CalloutManager::getSharedManager(); + } + if (!library_names_.empty() || !callout_manager_) { + callout_manager_.reset(new CalloutManager(library_names_.size())); + } // Now iterate through the libraries are load them one by one. We'll for (size_t i = 0; i < library_names_.size(); ++i) {