]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2419] Begin adding stats to track HR assignment conflicts
authorDan Theisen <djt@isc.org>
Sun, 3 Jul 2022 19:28:27 +0000 (12:28 -0700)
committerDan Theisen <djt@isc.org>
Fri, 8 Jul 2022 19:18:54 +0000 (12:18 -0700)
src/bin/dhcp4/dhcp4_srv.cc
src/bin/dhcp4/tests/shared_network_unittest.cc
src/lib/dhcpsrv/alloc_engine.cc
src/lib/dhcpsrv/cfg_subnets4.cc

index 939f55904b200577c209e4f5902698135bd48a8a..406c0ff4a4ddd04d0c9aae886a989bf00bfa8f31 100644 (file)
@@ -134,7 +134,8 @@ std::set<std::string> dhcp4_statistics = {
     "v4-allocation-fail-shared-network",
     "v4-allocation-fail-subnet",
     "v4-allocation-fail-no-pools",
-    "v4-allocation-fail-classes"
+    "v4-allocation-fail-classes",
+    "v4-reservation-conflicts"
 };
 
 } // end of anonymous namespace
index 6dffbefa4c52763bf77ce7eda4f0b686ab4ef7a6..5fb3b30efcf30cc7d0f77e6c1029b52060901dc0 100644 (file)
@@ -1768,6 +1768,16 @@ TEST_F(Dhcpv4SharedNetworkTest, reservationInSharedNetworkTwoClientsSameIdentifi
     testAssigned([this, &client2]() {
         doRequest(client2, "10.0.0.1");
     });
+
+    // Ensure stats are being recorded for HR conflicts
+    ObservationPtr subnet_conflicts = StatsMgr::instance().getObservation(
+        "subnet[100].reservation-conflicts");
+    ASSERT_TRUE(subnet_conflicts);
+    ASSERT_EQ(1, subnet_conflicts->getInteger().first);
+    ObservationPtr global_conflicts = StatsMgr::instance().getObservation(
+        "v4-reservation-conflicts");
+    ASSERT_TRUE(global_conflicts);
+    ASSERT_EQ(1, global_conflicts->getInteger().first);
 }
 
 // Reserved address can't be assigned as long as access to a subnet is
index 7070b53d10ed8280b03637121cfb7b25caa6a2d7..350cc46758191a0f246a9a5ea88960b19f611e33 100644 (file)
@@ -3701,6 +3701,13 @@ AllocEngine::discoverLease4(AllocEngine::ClientContext4& ctx) {
                     .arg(ctx.currentHost()->getIPv4Reservation().toText())
                     .arg(ctx.conflicting_lease_ ? ctx.conflicting_lease_->toText() :
                          "(no lease info)");
+                StatsMgr::instance().addValue(StatsMgr::generateName(
+                                                  "subnet",
+                                                  new_lease->subnet_id_,
+                                                  "reservation-conflicts"),
+                                              static_cast<int64_t>(1));
+                StatsMgr::instance().addValue("v4-reservation-conflicts",
+                                              static_cast<int64_t>(1));
             }
 
         } else {
index d74a4c52e6ebd11f429249f7952aced0e38e3b37..f6fce4a79fc2af6f7b7f4f7be8a9c5389f803afd 100644 (file)
@@ -527,11 +527,15 @@ CfgSubnets4::updateStatistics() {
                            generateName("subnet", subnet_id, "total-addresses"),
                                         static_cast<int64_t>
                                         (subnet4->getPoolCapacity(Lease::TYPE_V4)));
-        const std::string& name =
+        std::string name =
             StatsMgr::generateName("subnet", subnet_id, "cumulative-assigned-addresses");
         if (!stats_mgr.getObservation(name)) {
             stats_mgr.setValue(name, static_cast<int64_t>(0));
         }
+        name = StatsMgr::generateName("subnet", subnet_id, "reservation-conflicts");
+        if (!stats_mgr.getObservation(name)) {
+            stats_mgr.setValue(name, static_cast<int64_t>(0));
+        }
     }
 
     // Only recount the stats if we have subnets.