]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#1305] add thread and queue info to get-status command
authorRazvan Becheriu <razvan@isc.org>
Tue, 11 Aug 2020 07:55:58 +0000 (10:55 +0300)
committerRazvan Becheriu <razvan@isc.org>
Tue, 18 Aug 2020 20:11:25 +0000 (23:11 +0300)
src/bin/dhcp4/ctrl_dhcp4_srv.cc
src/bin/dhcp4/tests/ctrl_dhcp4_srv_unittest.cc
src/bin/dhcp6/ctrl_dhcp6_srv.cc
src/bin/dhcp6/tests/ctrl_dhcp6_srv_unittest.cc

index 9b1deefeaf1b790c2bb772a0ed09687511ce3670..f6a06b8a898c934bbb07f02d36bcf8ef577b3349 100644 (file)
@@ -660,7 +660,12 @@ ControlledDhcpv4Srv::commandStatusGetHandler(const string&,
         status->set("reload", Element::create(reload.total_seconds()));
     }
 
-    // todo: number of service threads.
+    if (MultiThreadingMgr::instance().getMode()) {
+        status->set("thread-pool-size", Element::create(
+                    long(MultiThreadingMgr::instance().getThreadPoolSize())));
+        status->set("packet-queue-size", Element::create(
+                    long(MultiThreadingMgr::instance().getPacketQueueSize())));
+    }
 
     return (createAnswer(0, status));
 }
index 9ebb1ab23bb6268a71ea2f17ca2191e2e595b270..22efe381e08581457399b6f09bba9bc01fa90cd8 100644 (file)
@@ -1119,6 +1119,47 @@ TEST_F(CtrlChannelDhcpv4SrvTest, statusGet) {
     ASSERT_TRUE(found_reload);
     EXPECT_LE(found_reload->intValue(), 5);
     EXPECT_GE(found_reload->intValue(), 0);
+
+    MultiThreadingMgr::instance().setMode(true);
+    MultiThreadingMgr::instance().setThreadPoolSize(4);
+    MultiThreadingMgr::instance().setPacketQueueSize(64);
+    sendUnixCommand("{ \"command\": \"status-get\" }", response_txt);
+    ASSERT_NO_THROW(response = Element::fromJSON(response_txt));
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    EXPECT_EQ(2, response->size());
+    result = response->get("result");
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    arguments = response->get("arguments");
+    ASSERT_EQ(Element::map, arguments->getType());
+
+    // The returned pid should be the pid of our process.
+    found_pid = arguments->get("pid");
+    ASSERT_TRUE(found_pid);
+    EXPECT_EQ(static_cast<int64_t>(getpid()), found_pid->intValue());
+
+    // It is hard to check the actual uptime (and reload) as it is based
+    // on current time. Let's just make sure it is within a reasonable
+    // range.
+    found_uptime = arguments->get("uptime");
+    ASSERT_TRUE(found_uptime);
+    EXPECT_LE(found_uptime->intValue(), 5);
+    EXPECT_GE(found_uptime->intValue(), 0);
+
+    found_reload = arguments->get("reload");
+    ASSERT_TRUE(found_reload);
+    EXPECT_LE(found_reload->intValue(), 5);
+    EXPECT_GE(found_reload->intValue(), 0);
+
+    auto found_thread_count = arguments->get("thread-pool-size");
+    ASSERT_TRUE(found_thread_count);
+    EXPECT_EQ(found_thread_count->intValue(), 4);
+
+    auto found_queue_size = arguments->get("packet-queue-size");
+    ASSERT_TRUE(found_queue_size);
+    EXPECT_EQ(found_queue_size->intValue(), 64);
 }
 
 // This test verifies that the DHCP server handles config-backend-pull command
index 1b73cb83b34dc6860a56fe2e0d5552f0a636492a..7a316363dd20b5538076529f346c623296486316 100644 (file)
@@ -663,7 +663,12 @@ ControlledDhcpv6Srv::commandStatusGetHandler(const string&,
         status->set("reload", Element::create(reload.total_seconds()));
     }
 
-    // todo: number of service threads.
+    if (MultiThreadingMgr::instance().getMode()) {
+        status->set("thread-pool-size", Element::create(
+                    long(MultiThreadingMgr::instance().getThreadPoolSize())));
+        status->set("packet-queue-size", Element::create(
+                    long(MultiThreadingMgr::instance().getPacketQueueSize())));
+    }
 
     return (createAnswer(0, status));
 }
index c0ac48da0f95881e3c9478d07aba17908b26e254..ac6ea65c7c050b90c29f34c8d86ad6cc346429da 100644 (file)
@@ -1009,6 +1009,47 @@ TEST_F(CtrlChannelDhcpv6SrvTest, statusGet) {
     ASSERT_TRUE(found_reload);
     EXPECT_LE(found_reload->intValue(), 5);
     EXPECT_GE(found_reload->intValue(), 0);
+
+    MultiThreadingMgr::instance().setMode(true);
+    MultiThreadingMgr::instance().setThreadPoolSize(4);
+    MultiThreadingMgr::instance().setPacketQueueSize(64);
+    sendUnixCommand("{ \"command\": \"status-get\" }", response_txt);
+    ASSERT_NO_THROW(response = Element::fromJSON(response_txt));
+    ASSERT_TRUE(response);
+    ASSERT_EQ(Element::map, response->getType());
+    EXPECT_EQ(2, response->size());
+    result = response->get("result");
+    ASSERT_TRUE(result);
+    ASSERT_EQ(Element::integer, result->getType());
+    EXPECT_EQ(0, result->intValue());
+    arguments = response->get("arguments");
+    ASSERT_EQ(Element::map, arguments->getType());
+
+    // The returned pid should be the pid of our process.
+    found_pid = arguments->get("pid");
+    ASSERT_TRUE(found_pid);
+    EXPECT_EQ(static_cast<int64_t>(getpid()), found_pid->intValue());
+
+    // It is hard to check the actual uptime (and reload) as it is based
+    // on current time. Let's just make sure it is within a reasonable
+    // range.
+    found_uptime = arguments->get("uptime");
+    ASSERT_TRUE(found_uptime);
+    EXPECT_LE(found_uptime->intValue(), 5);
+    EXPECT_GE(found_uptime->intValue(), 0);
+
+    found_reload = arguments->get("reload");
+    ASSERT_TRUE(found_reload);
+    EXPECT_LE(found_reload->intValue(), 5);
+    EXPECT_GE(found_reload->intValue(), 0);
+
+    auto found_thread_count = arguments->get("thread-pool-size");
+    ASSERT_TRUE(found_thread_count);
+    EXPECT_EQ(found_thread_count->intValue(), 4);
+
+    auto found_queue_size = arguments->get("packet-queue-size");
+    ASSERT_TRUE(found_queue_size);
+    EXPECT_EQ(found_queue_size->intValue(), 64);
 }
 
 // This test verifies that the DHCP server handles server-tag-get command