[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