From: Marcin Siodelski Date: Tue, 4 Jul 2017 15:55:20 +0000 (+0200) Subject: [5318] Default control connection timeout is now 10s. X-Git-Tag: trac5227_base~8^2~1^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9bab1aae6da96de38fbeec3b9c98015e4321de8a;p=thirdparty%2Fkea.git [5318] Default control connection timeout is now 10s. --- diff --git a/src/bin/dhcp4/tests/ctrl_dhcp4_srv_unittest.cc b/src/bin/dhcp4/tests/ctrl_dhcp4_srv_unittest.cc index 80396ed9ab..034cab67f4 100644 --- a/src/bin/dhcp4/tests/ctrl_dhcp4_srv_unittest.cc +++ b/src/bin/dhcp4/tests/ctrl_dhcp4_srv_unittest.cc @@ -84,6 +84,9 @@ public: using Dhcpv4Srv::receivePacket; }; +/// @brief Default control connection timeout. +const size_t DEFAULT_CONNECTION_TIMEOUT = 10; + /// @brief Fixture class intended for testin control channel in the DHCPv4Srv class CtrlChannelDhcpv4SrvTest : public ::testing::Test { public: @@ -114,6 +117,7 @@ public: CommandMgr::instance().closeCommandSocket(); CommandMgr::instance().deregisterAll(); + CommandMgr::instance().setConnectionTimeout(DEFAULT_CONNECTION_TIMEOUT); server_.reset(); }; @@ -1307,6 +1311,11 @@ TEST_F(CtrlChannelDhcpv4SrvTest, longResponse) { TEST_F(CtrlChannelDhcpv4SrvTest, connectionTimeout) { createUnixChannelServer(); + // Set connection timeout to 2s to prevent long waiting time for the + // timeout during this test. + const unsigned short timeout = 2; + CommandMgr::instance().setConnectionTimeout(timeout); + // Server's response will be assigned to this variable. std::string response; @@ -1329,11 +1338,11 @@ TEST_F(CtrlChannelDhcpv4SrvTest, connectionTimeout) { std::string command = "{ \"command\": \"foo\" "; ASSERT_TRUE(client->sendCommand(command)); - // Let's wait up to 10s for the server's response. The response + // Let's wait up to 15s for the server's response. The response // should arrive sooner assuming that the timeout mechanism for // the server is working properly. - const unsigned int timeout = 10; - ASSERT_TRUE(client->getResponse(response, 10)); + const unsigned int timeout = 15; + ASSERT_TRUE(client->getResponse(response, timeout)); // Explicitly close the client's connection. client->disconnectFromServer(); diff --git a/src/bin/dhcp6/tests/ctrl_dhcp6_srv_unittest.cc b/src/bin/dhcp6/tests/ctrl_dhcp6_srv_unittest.cc index 1b503dacca..b31443f4f8 100644 --- a/src/bin/dhcp6/tests/ctrl_dhcp6_srv_unittest.cc +++ b/src/bin/dhcp6/tests/ctrl_dhcp6_srv_unittest.cc @@ -81,6 +81,9 @@ public: using Dhcpv6Srv::receivePacket; }; +/// @brief Default control connection timeout. +const size_t DEFAULT_CONNECTION_TIMEOUT = 10; + class CtrlDhcpv6SrvTest : public BaseServerTest { public: CtrlDhcpv6SrvTest() @@ -91,6 +94,8 @@ public: virtual ~CtrlDhcpv6SrvTest() { LeaseMgrFactory::destroy(); StatsMgr::instance().removeAll(); + CommandMgr::instance().setConnectionTimeout(DEFAULT_CONNECTION_TIMEOUT); + reset(); }; @@ -1326,6 +1331,11 @@ TEST_F(CtrlChannelDhcpv6SrvTest, longResponse) { TEST_F(CtrlChannelDhcpv6SrvTest, connectionTimeout) { createUnixChannelServer(); + // Set connection timeout to 2s to prevent long waiting time for the + // timeout during this test. + const unsigned short timeout = 2; + CommandMgr::instance().setConnectionTimeout(timeout); + // Server's response will be assigned to this variable. std::string response; @@ -1348,11 +1358,11 @@ TEST_F(CtrlChannelDhcpv6SrvTest, connectionTimeout) { std::string command = "{ \"command\": \"foo\" "; ASSERT_TRUE(client->sendCommand(command)); - // Let's wait up to 10s for the server's response. The response + // Let's wait up to 15s for the server's response. The response // should arrive sooner assuming that the timeout mechanism for // the server is working properly. - const unsigned int timeout = 10; - ASSERT_TRUE(client->getResponse(response, 10)); + const unsigned int timeout = 15; + ASSERT_TRUE(client->getResponse(response, timeout)); // Explicitly close the client's connection. client->disconnectFromServer(); diff --git a/src/lib/config/command_mgr.cc b/src/lib/config/command_mgr.cc index f0509c36dc..53407af1e8 100644 --- a/src/lib/config/command_mgr.cc +++ b/src/lib/config/command_mgr.cc @@ -31,10 +31,8 @@ namespace { /// @brief Maximum size of the data chunk sent/received over the socket. const size_t BUF_SIZE = 8192; -/// @brief Specifies connection timeout in milliseconds. -/// -/// @todo Make it configurable. -const unsigned CONNECTION_TIMEOUT = 5000; +/// @brief Default connection timeout in seconds. +const unsigned short DEFAULT_CONNECTION_TIMEOUT = 10; class ConnectionPool; @@ -56,11 +54,13 @@ public: /// for data transmission. /// @param connection_pool Reference to the connection pool to which this /// connection belongs. + /// @param timeout Connection timeout. Connection(const IOServicePtr& io_service, const boost::shared_ptr& socket, - ConnectionPool& connection_pool) - : socket_(socket), timeout_timer_(*io_service), buf_(), response_(), - connection_pool_(connection_pool), feed_(), + ConnectionPool& connection_pool, + const unsigned short timeout) + : socket_(socket), timeout_timer_(*io_service), timeout_(timeout), + buf_(), response_(), connection_pool_(connection_pool), feed_(), response_in_progress_(false) { LOG_INFO(command_logger, COMMAND_SOCKET_CONNECTION_OPENED) @@ -74,7 +74,7 @@ public: // Start timer for detecting timeouts. timeout_timer_.setup(boost::bind(&Connection::timeoutHandler, this), - CONNECTION_TIMEOUT, IntervalTimer::ONE_SHOT); + timeout_ * 1000, IntervalTimer::ONE_SHOT); } /// @brief Destructor. @@ -160,6 +160,9 @@ private: /// @brief Interval timer used to detect connection timeouts. IntervalTimer timeout_timer_; + /// @brief Connection timeout. + unsigned short timeout_; + /// @brief Buffer used for received data. std::array buf_; @@ -375,7 +378,7 @@ public: /// @brief Constructor. CommandMgrImpl() : io_service_(), acceptor_(), socket_(), socket_name_(), - connection_pool_() { + connection_pool_(), timeout_(DEFAULT_CONNECTION_TIMEOUT) { } /// @brief Opens acceptor service allowing the control clients to connect. @@ -405,6 +408,9 @@ public: /// @brief Pool of connections. ConnectionPool connection_pool_; + + /// @brief Connection timeout + unsigned short timeout_; }; void @@ -465,7 +471,8 @@ CommandMgrImpl::doAccept() { if (!ec) { // New connection is arriving. Start asynchronous transmission. ConnectionPtr connection(new Connection(io_service_, socket_, - connection_pool_)); + connection_pool_, + timeout_)); connection_pool_.start(connection); } else if (ec.value() != boost::asio::error::operation_aborted) { @@ -521,5 +528,11 @@ CommandMgr::setIOService(const IOServicePtr& io_service) { impl_->io_service_ = io_service; } +void +CommandMgr::setConnectionTimeout(const unsigned short timeout) { + impl_->timeout_ = timeout; +} + + }; // end of isc::config }; // end of isc diff --git a/src/lib/config/command_mgr.h b/src/lib/config/command_mgr.h index 95055ac03d..5eb23015fb 100644 --- a/src/lib/config/command_mgr.h +++ b/src/lib/config/command_mgr.h @@ -54,6 +54,11 @@ public: /// @param io_service Pointer to the IO service. void setIOService(const asiolink::IOServicePtr& io_service); + /// @brief Override default connection timeout. + /// + /// @param timeout New connection timeout in seconds. + void setConnectionTimeout(const unsigned short timeout); + /// @brief Opens control socket with parameters specified in socket_info /// /// Currently supported types are: