Parcourir la source

[5318] Default control connection timeout is now 10s.

Marcin Siodelski il y a 7 ans
Parent
commit
9bab1aae6d

+ 12 - 3
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();

+ 13 - 3
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();

+ 23 - 10
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<UnixDomainSocket>& 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<char, BUF_SIZE> 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

+ 5 - 0
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: