[svn] commit: r3610 - in /branches/vorner-recursor-timeouts/src/bin/recurse: recurse.spec.pre.in recursor.cc recursor.h tests/recursor_unittest.cc

BIND 10 source code commits bind10-changes at lists.isc.org
Mon Nov 22 20:11:39 UTC 2010


Author: vorner
Date: Mon Nov 22 20:11:39 2010
New Revision: 3610

Log:
Configuration of timeouts

Modified:
    branches/vorner-recursor-timeouts/src/bin/recurse/recurse.spec.pre.in
    branches/vorner-recursor-timeouts/src/bin/recurse/recursor.cc
    branches/vorner-recursor-timeouts/src/bin/recurse/recursor.h
    branches/vorner-recursor-timeouts/src/bin/recurse/tests/recursor_unittest.cc

Modified: branches/vorner-recursor-timeouts/src/bin/recurse/recurse.spec.pre.in
==============================================================================
--- branches/vorner-recursor-timeouts/src/bin/recurse/recurse.spec.pre.in (original)
+++ branches/vorner-recursor-timeouts/src/bin/recurse/recurse.spec.pre.in Mon Nov 22 20:11:39 2010
@@ -3,6 +3,18 @@
     "module_name": "Recurse",
     "module_description": "Recursive service",
     "config_data": [
+      {
+        "item_name": "timeout",
+        "item_type": "integer",
+        "item_optional": False,
+        "item_default": 2000
+      },
+      {
+        "item_name": "retries",
+        "item_type": "integer",
+        "item_optional": False,
+        "item_default": 0
+      },
       {
         "item_name": "forward_addresses",
         "item_type": "list",

Modified: branches/vorner-recursor-timeouts/src/bin/recurse/recursor.cc
==============================================================================
--- branches/vorner-recursor-timeouts/src/bin/recurse/recursor.cc (original)
+++ branches/vorner-recursor-timeouts/src/bin/recurse/recursor.cc Mon Nov 22 20:11:39 2010
@@ -116,6 +116,11 @@
     vector<addr_t> upstream_;
     /// Addresses we listen on
     vector<addr_t> listen_;
+
+    /// Time in milliseconds, to timeout
+    int timeout_;
+    /// Number of retries after timeout
+    unsigned retries_;
 
 private:
 
@@ -489,6 +494,27 @@
         vector<addr_t> forwardAddresses(parseAddresses(forwardAddressesE));
         ConstElementPtr listenAddressesE(config->get("listen_on"));
         vector<addr_t> listenAddresses(parseAddresses(listenAddressesE));
+        bool set_timeouts(false);
+        int timeout = impl_->timeout_;
+        unsigned retries = impl_->retries_;
+        ConstElementPtr timeoutE(config->get("timeout")),
+            retriesE(config->get("retries"));
+        if (timeoutE) {
+            // It should be safe to just get it, the config manager should
+            // check for us
+            timeout = timeoutE->intValue();
+            if (timeout < -1) {
+                isc_throw(BadValue, "Timeout too small");
+            }
+            set_timeouts = true;
+        }
+        if (retriesE) {
+            if (retriesE->intValue() < 0) {
+                isc_throw(BadValue, "Negative number of retries");
+            }
+            retries = retriesE->intValue();
+            set_timeouts = true;
+        }
         // Everything OK, so commit the changes
         // listenAddresses can fail to bind, so try them first
         if (listenAddressesE) {
@@ -496,6 +522,9 @@
         }
         if (forwardAddressesE) {
             setForwardAddresses(forwardAddresses);
+        }
+        if (set_timeouts) {
+            setTimeouts(timeout, retries);
         }
         return (isc::config::createAnswer());
     } catch (const isc::Exception& error) {
@@ -562,6 +591,20 @@
     }
 }
 
+void
+Recursor::setTimeouts(int timeout, unsigned retries) {
+    dlog("Setting timeout to " + boost::lexical_cast<string>(timeout) +
+        " and retry count to " + boost::lexical_cast<string>(retries));
+    impl_->timeout_ = timeout;
+    impl_->retries_ = retries;
+    impl_->queryShutdown();
+    impl_->querySetup(*dnss_);
+}
+pair<int, unsigned>
+Recursor::getTimeouts() const {
+    return (pair<int, unsigned>(impl_->timeout_, impl_->retries_));
+}
+
 vector<addr_t>
 Recursor::getListenAddresses() const {
     return (impl_->listen_);

Modified: branches/vorner-recursor-timeouts/src/bin/recurse/recursor.h
==============================================================================
--- branches/vorner-recursor-timeouts/src/bin/recurse/recursor.h (original)
+++ branches/vorner-recursor-timeouts/src/bin/recurse/recursor.h Mon Nov 22 20:11:39 2010
@@ -110,6 +110,23 @@
         uint16_t> >& addresses);
     std::vector<std::pair<std::string, uint16_t> > getListenAddresses() const;
 
+    /**
+     * \short Set options related to timeouts.
+     *
+     * This sets the time of timeout and number of retries.
+     * \param timeout The time in milliseconds. The value -1 disables timeouts.
+     * \param retries The number of retries (0 means try the first time only,
+     *     do not retry).
+     */
+    void setTimeouts(int timeout = -1, unsigned retries = 0);
+
+    /**
+     * \short Get info about timeouts.
+     *
+     * \returns Timeout and retries (as described in setTimeouts).
+     */
+    std::pair<int, unsigned> getTimeouts() const;
+
 private:
     RecursorImpl* impl_;
     asiolink::DNSService* dnss_;

Modified: branches/vorner-recursor-timeouts/src/bin/recurse/tests/recursor_unittest.cc
==============================================================================
--- branches/vorner-recursor-timeouts/src/bin/recurse/tests/recursor_unittest.cc (original)
+++ branches/vorner-recursor-timeouts/src/bin/recurse/tests/recursor_unittest.cc Mon Nov 22 20:11:39 2010
@@ -165,7 +165,8 @@
     EXPECT_EQ(0, server.getForwardAddresses().size());
 }
 
-void RecursorConfig::invalidTest(const string &JOSN) {
+void
+RecursorConfig::invalidTest(const string &JOSN) {
     ElementPtr config(Element::fromJSON(JOSN));
     EXPECT_FALSE(server.updateConfig(config)->equals(
         *isc::config::createAnswer())) << "Accepted config " << JOSN << endl;
@@ -278,4 +279,40 @@
         "}]}");
 }
 
-}
+// Just test it sets and gets the values correctly
+TEST_F(RecursorConfig, timeouts) {
+    server.setTimeouts(0, 1);
+    EXPECT_EQ(0, server.getTimeouts().first);
+    EXPECT_EQ(1, server.getTimeouts().second);
+    server.setTimeouts();
+    EXPECT_EQ(-1, server.getTimeouts().first);
+    EXPECT_EQ(0, server.getTimeouts().second);
+}
+
+TEST_F(RecursorConfig, timeoutsConfig) {
+    ElementPtr config = Element::fromJSON("{"
+            "\"timeout\": 1000,"
+            "\"retries\": 3"
+            "}");
+    ConstElementPtr result(server.updateConfig(config));
+    EXPECT_EQ(result->toWire(), isc::config::createAnswer()->toWire());
+    EXPECT_EQ(1000, server.getTimeouts().first);
+    EXPECT_EQ(3, server.getTimeouts().second);
+}
+
+TEST_F(RecursorConfig, invalidTimeoutsConfig) {
+    invalidTest("{"
+        "\"timeout\": \"error\""
+        "}");
+    invalidTest("{"
+        "\"timeout\": -2"
+        "}");
+    invalidTest("{"
+        "\"retries\": \"error\""
+        "}");
+    invalidTest("{"
+        "\"retries\": -1"
+        "}");
+}
+
+}




More information about the bind10-changes mailing list