BIND 10 trac2862, updated. 6321090617d7c3eff5a76d4b701e6d4a969ecfa5 [2862] Scan for remote segments after reconfiguration

BIND 10 source code commits bind10-changes at lists.isc.org
Tue Jul 9 12:58:48 UTC 2013


The branch, trac2862 has been updated
       via  6321090617d7c3eff5a76d4b701e6d4a969ecfa5 (commit)
       via  49dd2cda64271b7fc0407159120b1ffb09f698b7 (commit)
       via  3a13cb67361874642c75748e19ae2d008c1d032d (commit)
      from  249acbdc02708dd9c6ea8912a3b29e88aae09160 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 6321090617d7c3eff5a76d4b701e6d4a969ecfa5
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date:   Tue Jul 9 14:58:23 2013 +0200

    [2862] Scan for remote segments after reconfiguration

commit 49dd2cda64271b7fc0407159120b1ffb09f698b7
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date:   Tue Jul 9 14:55:31 2013 +0200

    [2862] Subscribe in case of remote segment

commit 3a13cb67361874642c75748e19ae2d008c1d032d
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date:   Tue Jul 9 14:48:11 2013 +0200

    [2862] Subscribe and unsubscribe on MCCS

-----------------------------------------------------------------------

Summary of changes:
 src/bin/auth/auth_srv.cc                    |   36 ++++++++++++++++++++++++++-
 src/bin/auth/main.cc                        |    6 +++--
 src/bin/auth/tests/auth_srv_unittest.cc     |   12 +++++++++
 src/lib/config/ccsession.h                  |   14 +++++++++++
 src/lib/config/tests/ccsession_unittests.cc |   11 ++++++++
 5 files changed, 76 insertions(+), 3 deletions(-)

-----------------------------------------------------------------------
diff --git a/src/bin/auth/auth_srv.cc b/src/bin/auth/auth_srv.cc
index c19c17d..36b495a 100644
--- a/src/bin/auth/auth_srv.cc
+++ b/src/bin/auth/auth_srv.cc
@@ -306,6 +306,8 @@ public:
                       MessageAttributes& stats_attrs,
                       const bool done);
 
+    /// Are we currently subscribed to the SegmentReader group?
+    bool readers_subscribed_;
 private:
     bool xfrout_connected_;
     AbstractXfroutClient& xfrout_client_;
@@ -322,6 +324,7 @@ AuthSrvImpl::AuthSrvImpl(AbstractXfroutClient& xfrout_client,
     datasrc_clients_mgr_(io_service_),
     ddns_base_forwarder_(ddns_forwarder),
     ddns_forwarder_(NULL),
+    readers_subscribed_(false),
     xfrout_connected_(false),
     xfrout_client_(xfrout_client)
 {}
@@ -940,7 +943,38 @@ AuthSrv::setTCPRecvTimeout(size_t timeout) {
     dnss_->setTCPRecvTimeout(timeout);
 }
 
+namespace {
+
+bool
+hasRemoteSegment(auth::DataSrcClientsMgr& mgr) {
+    auth::DataSrcClientsMgr::Holder holder(mgr);
+    const std::vector<dns::RRClass>& classes(holder.getClasses());
+    BOOST_FOREACH(const dns::RRClass& rrclass, classes) {
+        const boost::shared_ptr<datasrc::ConfigurableClientList>&
+            list(holder.findClientList(rrclass));
+        const std::vector<DataSourceStatus>& states(list->getStatus());
+        BOOST_FOREACH(const datasrc::DataSourceStatus& status, states) {
+            if (status.getSegmentState() != datasrc::SEGMENT_UNUSED &&
+                status.getSegmentType() != "local")
+                // We use some segment and it's not a local one, so it
+                // must be remote.
+                return true;
+        }
+    }
+    // No remote segment found in any of the lists
+    return false;
+}
+
+}
+
 void
 AuthSrv::listsReconfigured() {
-    // TODO: Here comes something.
+    const bool has_remote = hasRemoteSegment(impl_->datasrc_clients_mgr_);
+    if (has_remote && !impl_->readers_subscribed_) {
+        impl_->config_session_->subscribe("SegmentReader");
+        impl_->readers_subscribed_ = true;
+    } else if (!has_remote && impl_->readers_subscribed_) {
+        impl_->config_session_->unsubscribe("SegmentReader");
+        impl_->readers_subscribed_ = false;
+    }
 }
diff --git a/src/bin/auth/main.cc b/src/bin/auth/main.cc
index dc03be2..991059b 100644
--- a/src/bin/auth/main.cc
+++ b/src/bin/auth/main.cc
@@ -109,9 +109,11 @@ datasrcConfigHandler(AuthSrv* server, bool* first_time,
         assert(config_session != NULL);
         *first_time = false;
         server->getDataSrcClientsMgr().reconfigure(
-            config_session->getRemoteConfigValue("data_sources", "classes"));
+            config_session->getRemoteConfigValue("data_sources", "classes"),
+            boost::bind(&AuthSrv::listsReconfigured, server));
     } else if (config->contains("classes")) {
-        server->getDataSrcClientsMgr().reconfigure(config->get("classes"));
+        server->getDataSrcClientsMgr().reconfigure(config->get("classes"),
+            boost::bind(&AuthSrv::listsReconfigured, server));
     }
 }
 
diff --git a/src/bin/auth/tests/auth_srv_unittest.cc b/src/bin/auth/tests/auth_srv_unittest.cc
index 7a4d950..99ad889 100644
--- a/src/bin/auth/tests/auth_srv_unittest.cc
+++ b/src/bin/auth/tests/auth_srv_unittest.cc
@@ -2166,6 +2166,18 @@ TEST_F(AuthSrvTest, postReconfigure) {
     }
     server.listsReconfigured();
     EXPECT_TRUE(session.haveSubscription("SegmentReader", "*"));
+    // Set the segment to local again
+    updateInMemory(server, "example.", CONFIG_INMEMORY_EXAMPLE);
+    {
+        DataSrcClientsMgr &mgr(server.getDataSrcClientsMgr());
+        DataSrcClientsMgr::Holder holder(mgr);
+        EXPECT_EQ(SEGMENT_INUSE, holder.findClientList(RRClass::IN())->
+                  getStatus()[0].getSegmentState());
+        EXPECT_EQ("local", holder.findClientList(RRClass::IN())->
+                  getStatus()[0].getSegmentType());
+    }
+    server.listsReconfigured();
+    EXPECT_FALSE(session.haveSubscription("SegmentReader", "*"));
 }
 
 }
diff --git a/src/lib/config/ccsession.h b/src/lib/config/ccsession.h
index 04e3046..5c614e6 100644
--- a/src/lib/config/ccsession.h
+++ b/src/lib/config/ccsession.h
@@ -575,6 +575,20 @@ public:
     /// \param id The id of request as returned by groupRecvMsgAsync.
     void cancelAsyncRecv(const AsyncRecvRequestID& id);
 
+    /// \brief Subscribe to a group
+    ///
+    /// Wrapper around the CCSession::subscribe.
+    void subscribe(const std::string& group) {
+        session_.subscribe(group, isc::cc::CC_INSTANCE_WILDCARD);
+    }
+
+    /// \brief Unsubscribe from a group.
+    ///
+    /// Wrapper around the CCSession::unsubscribe.
+    void unsubscribe(const std::string& group) {
+        session_.unsubscribe(group, isc::cc::CC_INSTANCE_WILDCARD);
+    }
+
 private:
     ModuleSpec readModuleSpecification(const std::string& filename);
     void startCheck();
diff --git a/src/lib/config/tests/ccsession_unittests.cc b/src/lib/config/tests/ccsession_unittests.cc
index 700ffe4..d958529 100644
--- a/src/lib/config/tests/ccsession_unittests.cc
+++ b/src/lib/config/tests/ccsession_unittests.cc
@@ -157,6 +157,17 @@ TEST_F(CCSessionTest, notifyNoParams) {
             session.getMsgQueue()->get(1)->toWire();
 }
 
+// Try to subscribe and unsubscribe once again
+TEST_F(CCSessionTest, subscribe) {
+    ModuleCCSession mccs(ccspecfile("spec1.spec"), session, NULL, NULL, false,
+                         false);
+    EXPECT_FALSE(session.haveSubscription("A group", "*"));
+    mccs.subscribe("A group");
+    EXPECT_TRUE(session.haveSubscription("A group", "*"));
+    mccs.unsubscribe("A group");
+    EXPECT_FALSE(session.haveSubscription("A group", "*"));
+}
+
 TEST_F(CCSessionTest, createAnswer) {
     ConstElementPtr answer;
     answer = createAnswer();



More information about the bind10-changes mailing list