summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJINMEI Tatuya <jinmei@isc.org>2012-10-06 01:02:01 +0200
committerJINMEI Tatuya <jinmei@isc.org>2012-10-06 01:02:01 +0200
commitc286e0dec766c3d9b2fff6a8bd55539ec976aae9 (patch)
tree1688eeec4ec669830f3299d2a9ef03e57e678a3a /src
parent[2204] simplify configureDataSource by always creating a new lists and swap. (diff)
downloadkea-c286e0dec766c3d9b2fff6a8bd55539ec976aae9.tar.xz
kea-c286e0dec766c3d9b2fff6a8bd55539ec976aae9.zip
[2204] completely replaced setClientList with swapDataSrcClientLists.
the test cases using setClientList were updated so they use swapDataSrcClientLists (some of them work as a test for the "swap" itself). now we don't need setClientList, so it was removed.
Diffstat (limited to 'src')
-rw-r--r--src/bin/auth/auth_srv.cc24
-rw-r--r--src/bin/auth/auth_srv.h38
-rw-r--r--src/bin/auth/datasrc_config.h10
-rw-r--r--src/bin/auth/tests/auth_srv_unittest.cc59
-rw-r--r--src/bin/auth/tests/datasrc_config_unittest.cc5
5 files changed, 76 insertions, 60 deletions
diff --git a/src/bin/auth/auth_srv.cc b/src/bin/auth/auth_srv.cc
index 391416b82e..1102ae3ed3 100644
--- a/src/bin/auth/auth_srv.cc
+++ b/src/bin/auth/auth_srv.cc
@@ -931,29 +931,13 @@ AuthSrv::destroyDDNSForwarder() {
}
}
-void
-AuthSrv::setClientList(const RRClass& rrclass,
- const shared_ptr<ConfigurableClientList>& list)
-{
- // TODO: Debug-build only check
- if (!impl_->mutex_.locked()) {
- isc_throw(isc::Unexpected, "Not locked");
- }
-
- if (list) {
- (*impl_->datasrc_client_lists_)[rrclass] = list;
- } else {
- impl_->datasrc_client_lists_->erase(rrclass);
- }
-}
-
AuthSrv::DataSrcClientListsPtr
AuthSrv::swapDataSrcClientLists(DataSrcClientListsPtr new_lists) {
- {
- thread::Mutex::Locker locker(impl_->mutex_);
- std::swap(new_lists, impl_->datasrc_client_lists_);
+ // TODO: Debug-build only check
+ if (!impl_->mutex_.locked()) {
+ isc_throw(isc::Unexpected, "Not locked!");
}
-
+ std::swap(new_lists, impl_->datasrc_client_lists_);
return (new_lists);
}
diff --git a/src/bin/auth/auth_srv.h b/src/bin/auth/auth_srv.h
index 48aac067b9..f1e73c1158 100644
--- a/src/bin/auth/auth_srv.h
+++ b/src/bin/auth/auth_srv.h
@@ -302,24 +302,36 @@ public:
/// If there was no forwarder yet, this method does nothing.
void destroyDDNSForwarder();
- /// \brief Sets the currently used list for data sources of given
- /// class.
- ///
- /// Replaces the internally used client list with a new one. Other
- /// classes are not changed.
- ///
- /// \param rrclass The class to modify.
- /// \param list Shared pointer to the client list. If it is NULL,
- /// the list is removed instead.
- void setClientList(const isc::dns::RRClass& rrclass, const
- boost::shared_ptr<isc::datasrc::ConfigurableClientList>&
- list);
-
typedef boost::shared_ptr<std::map<
isc::dns::RRClass, boost::shared_ptr<
isc::datasrc::ConfigurableClientList> > >
DataSrcClientListsPtr;
+ /// \brief Swap the currently used set of data source client lists with
+ /// given one.
+ ///
+ /// The "set" of lists is actually given in the form of map from
+ /// RRClasses to shared pointers to isc::datasrc::ConfigurableClientList.
+ ///
+ /// This method returns the swapped set of lists, which was previously
+ /// used by the server.
+ ///
+ /// This method is intended to be used by a separate method to update
+ /// the data source configuration "at once". The caller must hold
+ /// a lock for the mutex object returned by \c getClientListMutex()
+ /// before calling this method.
+ ///
+ /// The ownership of the returned pointer is transferred to the caller.
+ /// The caller is generally expected to release the resources used in
+ /// the old lists. Note that it could take longer time if some of the
+ /// data source clients contain a large size of in-memory data.
+ ///
+ /// The caller can pass a NULL pointer. This effectively disables
+ /// any data source for the server.
+ ///
+ /// \param new_lists Shared pointer to a new set of data source client
+ /// lists.
+ /// \return The previous set of lists. It can be NULL.
DataSrcClientListsPtr swapDataSrcClientLists(DataSrcClientListsPtr
new_lists);
diff --git a/src/bin/auth/datasrc_config.h b/src/bin/auth/datasrc_config.h
index 02354ffa26..532aa34a2f 100644
--- a/src/bin/auth/datasrc_config.h
+++ b/src/bin/auth/datasrc_config.h
@@ -17,6 +17,8 @@
#include "auth_srv.h"
+#include <util/threads/lock.h>
+
#include <cc/data.h>
#include <datasrc/client_list.h>
@@ -62,8 +64,12 @@ configureDataSourceGeneric(Server& server,
}
// Replace the server's lists. By ignoring the return value we let the
- // old lists be destroyed.
- server.swapDataSrcClientLists(new_lists);
+ // old lists be destroyed. Lock will be released immediately after the
+ // swap.
+ {
+ isc::util::thread::Mutex::Locker locker(server.getClientListMutex());
+ server.swapDataSrcClientLists(new_lists);
+ }
}
/// \brief Concrete version of configureDataSource() for the
diff --git a/src/bin/auth/tests/auth_srv_unittest.cc b/src/bin/auth/tests/auth_srv_unittest.cc
index 60a9a2ac38..dd60d896ad 100644
--- a/src/bin/auth/tests/auth_srv_unittest.cc
+++ b/src/bin/auth/tests/auth_srv_unittest.cc
@@ -63,6 +63,7 @@
using namespace std;
using namespace isc::cc;
using namespace isc::dns;
+using namespace isc::datasrc;
using namespace isc::util;
using namespace isc::util::io::internal;
using namespace isc::util::unittests;
@@ -90,6 +91,9 @@ const char* const STATIC_DSRC_FILE = DSRC_DIR "/static.zone";
// a signed example zone.
const char* const CONFIG_INMEMORY_EXAMPLE = TEST_DATA_DIR "/rfc5155-example.zone.signed";
+// shortcut commonly used in tests
+typedef boost::shared_ptr<ConfigurableClientList> ListPtr;
+
class AuthSrvTest : public SrvTestBase {
protected:
AuthSrvTest() :
@@ -1431,7 +1435,9 @@ TEST_F(AuthSrvTest,
boost::shared_ptr<isc::datasrc::ConfigurableClientList>
list(new FakeList(server.getClientList(RRClass::IN()), THROW_NEVER,
false));
- server.setClientList(RRClass::IN(), list);
+ AuthSrv::DataSrcClientListsPtr lists(new std::map<RRClass, ListPtr>);
+ lists->insert(pair<RRClass, ListPtr>(RRClass::IN(), list));
+ server.swapDataSrcClientLists(lists);
}
createDataFromFile("nsec3query_nodnssec_fromWire.wire");
@@ -1459,7 +1465,9 @@ setupThrow(AuthSrv& server, ThrowWhen throw_when, bool isc_exception,
boost::shared_ptr<isc::datasrc::ConfigurableClientList>
list(new FakeList(server.getClientList(RRClass::IN()), throw_when,
isc_exception, rrset));
- server.setClientList(RRClass::IN(), list);
+ AuthSrv::DataSrcClientListsPtr lists(new std::map<RRClass, ListPtr>);
+ lists->insert(pair<RRClass, ListPtr>(RRClass::IN(), list));
+ server.swapDataSrcClientLists(lists);
}
TEST_F(AuthSrvTest,
@@ -1772,34 +1780,37 @@ TEST_F(AuthSrvTest, clientList) {
// There's a debug-build only check in them to make sure everything
// locks them and we call them directly here.
isc::util::thread::Mutex::Locker locker(server.getClientListMutex());
+
+ AuthSrv::DataSrcClientListsPtr lists; // initially empty
+
// The lists don't exist. Therefore, the list of RRClasses is empty.
- // We also have no IN list.
- EXPECT_TRUE(server.getClientListClasses().empty());
- EXPECT_EQ(boost::shared_ptr<const isc::datasrc::ClientList>(),
- server.getClientList(RRClass::IN()));
+ EXPECT_TRUE(server.swapDataSrcClientLists(lists)->empty());
+
// Put something in.
- const boost::shared_ptr<isc::datasrc::ConfigurableClientList>
- list(new isc::datasrc::ConfigurableClientList(RRClass::IN()));
- const boost::shared_ptr<isc::datasrc::ConfigurableClientList>
- list2(new isc::datasrc::ConfigurableClientList(RRClass::CH()));
- server.setClientList(RRClass::IN(), list);
- server.setClientList(RRClass::CH(), list2);
- // There are two things in the list and they are IN and CH
- vector<RRClass> classes(server.getClientListClasses());
- ASSERT_EQ(2, classes.size());
- EXPECT_EQ(RRClass::IN(), classes[0]);
- EXPECT_EQ(RRClass::CH(), classes[1]);
+ const ListPtr list(new ConfigurableClientList(RRClass::IN()));
+ const ListPtr list2(new ConfigurableClientList(RRClass::CH()));
+
+ lists.reset(new std::map<RRClass, ListPtr>);
+ lists->insert(pair<RRClass, ListPtr>(RRClass::IN(), list));
+ lists->insert(pair<RRClass, ListPtr>(RRClass::CH(), list2));
+ server.swapDataSrcClientLists(lists);
+
// And the lists can be retrieved.
EXPECT_EQ(list, server.getClientList(RRClass::IN()));
EXPECT_EQ(list2, server.getClientList(RRClass::CH()));
- // Remove one of them
- server.setClientList(RRClass::CH(),
- boost::shared_ptr<isc::datasrc::ConfigurableClientList>());
- // This really got deleted, including the class.
- classes = server.getClientListClasses();
- ASSERT_EQ(1, classes.size());
- EXPECT_EQ(RRClass::IN(), classes[0]);
+
+ // Replace the lists with new lists containing only one list.
+ lists.reset(new std::map<RRClass, ListPtr>);
+ lists->insert(pair<RRClass, ListPtr>(RRClass::IN(), list));
+ lists = server.swapDataSrcClientLists(lists);
+
+ // Old one had two lists. That confirms our swap for IN and CH classes
+ // (i.e., no other entries were there).
+ EXPECT_EQ(2, lists->size());
+
+ // The CH list really got deleted.
EXPECT_EQ(list, server.getClientList(RRClass::IN()));
+ EXPECT_FALSE(server.getClientList(RRClass::CH()));
}
// We just test the mutex can be locked (exactly once).
diff --git a/src/bin/auth/tests/datasrc_config_unittest.cc b/src/bin/auth/tests/datasrc_config_unittest.cc
index c0c9b5ce99..329c5d11be 100644
--- a/src/bin/auth/tests/datasrc_config_unittest.cc
+++ b/src/bin/auth/tests/datasrc_config_unittest.cc
@@ -81,7 +81,10 @@ datasrcConfigHandler(DatasrcConfigTest* fake_server, const std::string&,
class DatasrcConfigTest : public ::testing::Test {
public:
- // To pretend to be the server:
+ // These pretend to be the server
+ isc::util::thread::Mutex& getClientListMutex() const {
+ return (mutex_);
+ }
void swapDataSrcClientLists(shared_ptr<std::map<dns::RRClass, ListPtr> >
new_lists)
{