]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2738] Updated indexes on reload
authorFrancis Dupont <fdupont@isc.org>
Fri, 3 Feb 2023 21:24:03 +0000 (22:24 +0100)
committerFrancis Dupont <fdupont@isc.org>
Wed, 8 Feb 2023 15:52:03 +0000 (16:52 +0100)
src/lib/dhcpsrv/dhcpsrv_messages.cc
src/lib/dhcpsrv/dhcpsrv_messages.mes
src/lib/dhcpsrv/memfile_lease_mgr.cc
src/lib/dhcpsrv/tests/memfile_lease_extended_info_unittest.cc
src/lib/dhcpsrv/tests/memfile_lease_mgr_unittest.cc

index 02d9bb1a99bf995ac89e8af34f5ff17be0a73083..08a84874fd7d915f8b40ee3535f76739d8fd5e6e 100644 (file)
@@ -325,7 +325,7 @@ const char* values[] = {
     "DHCPSRV_MEMFILE_ADD_ADDR4", "adding IPv4 lease with address %1",
     "DHCPSRV_MEMFILE_ADD_ADDR6", "adding IPv6 lease with address %1",
     "DHCPSRV_MEMFILE_BEGIN_BUILD_EXTENDED_INFO_TABLES6", "building extended info tables with %1 sanity check level%2, tables %3",
-    "DHCPSRV_MEMFILE_BEGIN_EXTRACT_EXTENDED_INFO4", "extract  extended info with %1 sanity check level%2",
+    "DHCPSRV_MEMFILE_BEGIN_EXTRACT_EXTENDED_INFO4", "extract extended info with %1 sanity check level%2",
     "DHCPSRV_MEMFILE_BEGIN_TRANSACTION", "committing to memory file database",
     "DHCPSRV_MEMFILE_BUILD_EXTENDED_INFO_TABLES6", "building extended info tables saw %1 leases, extended info sanity checks modified %2 / updated %3 leases and %4 leases were entered into tables",
     "DHCPSRV_MEMFILE_BUILD_EXTENDED_INFO_TABLES6_ERROR", "building extended info tables got an exception on the lease for %1: %2",
index 3b60a833f5bb46802945cb2db9876fa13561bcbb..6a42ad07f76141046ffba9b7097f1f0e166ae7a5 100644 (file)
@@ -391,7 +391,7 @@ A debug message issued when the server is building extended info tables.
 The extended info sanity check level, update in file when requested
 and the fact tables are enabled or disabled are displayed.
 
-% DHCPSRV_MEMFILE_BEGIN_EXTRACT_EXTENDED_INFO4 extract  extended info with %1 sanity check level%2
+% DHCPSRV_MEMFILE_BEGIN_EXTRACT_EXTENDED_INFO4 extract extended info with %1 sanity check level%2
 A debug message issued when the server is extracting extended info.
 The extended info sanity check level and update in file when requested
 are displayed.
index 750b1638d0c5f003145f07fda7e79850082f7592..5cb8a4267be10ec3a4eb1c6ff6233e0198eb9878 100644 (file)
@@ -2961,8 +2961,13 @@ Memfile_LeaseMgr::extractExtendedInfo4(bool update, bool current) {
     size_t modified = 0;
     size_t updated = 0;
     size_t processed = 0;
+    auto& index = storage4_.get<AddressIndexTag>();
+    auto lease_it = index.begin();
+    auto next_it = index.end();
 
-    for (auto lease : storage4_) {
+    for (; lease_it != index.end(); lease_it = next_it) {
+        next_it = std::next(lease_it);
+        Lease4Ptr lease = *lease_it;
         ++leases;
         try {
             if (upgradeLease4ExtendedInfo(lease, check)) {
@@ -2972,8 +2977,12 @@ Memfile_LeaseMgr::extractExtendedInfo4(bool update, bool current) {
                     ++updated;
                 }
             }
-            extractLease4ExtendedInfo(lease, false);
-            if (!lease->relay_id_.empty() || !lease->remote_id_.empty()) {
+            // Work on a copy as the multi-index requires fields used
+            // as indexes to be read-only.
+            Lease4Ptr copy(new Lease4(*lease));
+            extractLease4ExtendedInfo(copy, false);
+            if (!copy->relay_id_.empty() || !copy->remote_id_.empty()) {
+                index.replace(lease_it, copy);
                 ++processed;
             }
         } catch (const std::exception& ex) {
index d95e404e00d93d82368c445636098dd2708e0753..26920e66768e0b70b01616be1c9a2a89182ef415 100644 (file)
@@ -475,66 +475,66 @@ void
 MemfileExtendedInfoTest::testGetLeases4ByRemoteId() {
     // Lease manager is created with empty tables.
     start(Memfile_LeaseMgr::V4);
-    initLease4(false);
+    initLease4(true);
 
-    // Create leases.
+    // Update leases.
     IOAddress addr0(ADDRESS4[0]);
     IOAddress addr1(ADDRESS4[1]);
     IOAddress addr2(ADDRESS4[2]);
     IOAddress addr3(ADDRESS4[3]);
     IOAddress addr4(ADDRESS4[4]);
     IOAddress zero = IOAddress::IPV4_ZERO_ADDRESS();
-    vector<uint8_t> remote_id0 = { 0xaa, 0xbb, 0xcc };
-    vector<uint8_t> remote_id1 = { 1, 2, 3, 4 };
+    vector<uint8_t> remote_id0 = { 1, 2, 3, 4 };
+    vector<uint8_t> remote_id1 = { 0xaa, 0xbb, 0xcc };
     vector<uint8_t> remote_id2 = createFromString(DUIDS[2]);
     string user_context_txt0 = "{ \"ISC\": { \"relay-agent-info\": {";
-    user_context_txt0 += " \"sub-options\": \"0203AABBCC\",";
-    user_context_txt0 += " \"remote-id\": \"AABBCC\" } } }";
+    user_context_txt0 += " \"sub-options\": \"020401020304\",";
+    user_context_txt0 += " \"remote-id\": \"01020304\" } } }";
     ElementPtr user_context0;
     ASSERT_NO_THROW(user_context0 = Element::fromJSON(user_context_txt0));
     string user_context_txt1 = "{ \"ISC\": { \"relay-agent-info\": {";
-    user_context_txt1 += " \"sub-options\": \"020401020304\",";
-    user_context_txt1 += " \"remote-id\": \"01020304\" } } }";
+    user_context_txt1 += " \"sub-options\": \"0203AABBCC\",";
+    user_context_txt1 += " \"remote-id\": \"AABBCC\" } } }";
     ElementPtr user_context1;
     ASSERT_NO_THROW(user_context1 = Element::fromJSON(user_context_txt1));
 
     Lease4Ptr lease;
     // lease0: addr0, id0, now.
-    lease = leases4[0];
-    ASSERT_TRUE(lease);
+    lease.reset(new Lease4(*leases4[0]));
+    leases4[0] = lease;
     lease->remote_id_ = remote_id0;
     lease->setContext(user_context0);
 
     // lease1: addr1, id1, now.
-    lease = leases4[1];
-    ASSERT_TRUE(lease);
+    lease.reset(new Lease4(*leases4[1]));
+    leases4[1] = lease;
     lease->remote_id_ = remote_id1;
     lease->setContext(user_context1);
 
     // lease2: addr2, id0, now - 500.
-    lease = leases4[2];
-    ASSERT_TRUE(lease);
+    lease.reset(new Lease4(*leases4[2]));
+    leases4[2] = lease;
     lease->remote_id_ = remote_id0;
     lease->setContext(user_context0);
     lease->cltt_ = now_ - 500;
 
     // lease3: addr3, id0, now - 800.
-    lease = leases4[3];
-    ASSERT_TRUE(lease);
+    lease.reset(new Lease4(*leases4[3]));
+    leases4[3] = lease;
     lease->remote_id_ = remote_id0;
     lease->setContext(user_context0);
     lease->cltt_ = now_ - 800;
 
     // lease4: addr4, id0, now - 100.
-    lease = leases4[4];
-    ASSERT_TRUE(lease);
+    lease.reset(new Lease4(*leases4[4]));
+    leases4[4] = lease;
     lease->remote_id_ = remote_id0;
     lease->setContext(user_context0);
     lease->cltt_ = now_ - 100;
 
-    // Add leases.
+    // Update leases.
     for (size_t i = 0; i < leases4.size(); ++i) {
-        EXPECT_TRUE(lease_mgr_->addLease(leases4[i]));
+        EXPECT_NO_THROW(lease_mgr_->updateLease4(leases4[i]));
     }
 
     Lease4Collection got;
index 74047155ea1f5e9d8e4f36e8f67553d32dd8498d..1833265f895a7f0d1ab5f822e8d65c1df29ee296 100644 (file)
@@ -3615,6 +3615,20 @@ TEST_F(MemfileLeaseMgrTest, extractExtendedInfo4) {
     EXPECT_EQ(relay, lease->relay_id_);
     const vector<uint8_t> remote = { 1, 2, 3 };
     EXPECT_EQ(remote, lease->remote_id_);
+
+    // Check the id indexes where updated.
+    IOAddress zero = IOAddress::IPV4_ZERO_ADDRESS();
+    Lease4Collection leases;
+    EXPECT_NO_THROW(leases = lease_mgr->getLeases4ByRelayId(relay,
+                                                            zero,
+                                                            LeasePageSize(100)));
+    ASSERT_EQ(1, leases.size());
+    EXPECT_EQ(*lease, *leases[0]);
+    EXPECT_NO_THROW(leases = lease_mgr->getLeases4ByRemoteId(remote,
+                                                             zero,
+                                                             LeasePageSize(100)));
+    ASSERT_EQ(1, leases.size());
+    EXPECT_EQ(*lease, *leases[0]);
 }
 
 /// @brief Checks that extractExtendedInfo4 does not update
@@ -3769,6 +3783,20 @@ TEST_F(MemfileLeaseMgrTest, extractExtendedInfo4ExplicitSanitize) {
     const vector<uint8_t> remote = { 1, 2, 3 };
     EXPECT_EQ(remote, lease->remote_id_);
 
+
+    // Check the id indexes where updated.
+    IOAddress zero = IOAddress::IPV4_ZERO_ADDRESS();
+    Lease4Collection leases;
+    EXPECT_NO_THROW(leases = lease_mgr->getLeases4ByRelayId(relay,
+                                                            zero,
+                                                            LeasePageSize(100)));
+    ASSERT_EQ(1, leases.size());
+    EXPECT_EQ(*lease, *leases[0]);
+    EXPECT_NO_THROW(leases = lease_mgr->getLeases4ByRemoteId(remote,
+                                                             zero,
+                                                             LeasePageSize(100)));
+    ASSERT_EQ(1, leases.size());
+    EXPECT_EQ(*lease, *leases[0]);
     // Check the lease file was updated.
     string new_content =
         "192.0.2.2,02:02:02:02:02:02,,200,200,8,1,1,,1,\n"