From: Francis Dupont Date: Fri, 3 Feb 2023 21:24:03 +0000 (+0100) Subject: [#2738] Updated indexes on reload X-Git-Tag: Kea-2.3.5~59 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=219f7965907691b0a79583480a00a66b94033d1e;p=thirdparty%2Fkea.git [#2738] Updated indexes on reload --- diff --git a/src/lib/dhcpsrv/dhcpsrv_messages.cc b/src/lib/dhcpsrv/dhcpsrv_messages.cc index 02d9bb1a99..08a84874fd 100644 --- a/src/lib/dhcpsrv/dhcpsrv_messages.cc +++ b/src/lib/dhcpsrv/dhcpsrv_messages.cc @@ -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", diff --git a/src/lib/dhcpsrv/dhcpsrv_messages.mes b/src/lib/dhcpsrv/dhcpsrv_messages.mes index 3b60a833f5..6a42ad07f7 100644 --- a/src/lib/dhcpsrv/dhcpsrv_messages.mes +++ b/src/lib/dhcpsrv/dhcpsrv_messages.mes @@ -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. diff --git a/src/lib/dhcpsrv/memfile_lease_mgr.cc b/src/lib/dhcpsrv/memfile_lease_mgr.cc index 750b1638d0..5cb8a4267b 100644 --- a/src/lib/dhcpsrv/memfile_lease_mgr.cc +++ b/src/lib/dhcpsrv/memfile_lease_mgr.cc @@ -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(); + 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) { diff --git a/src/lib/dhcpsrv/tests/memfile_lease_extended_info_unittest.cc b/src/lib/dhcpsrv/tests/memfile_lease_extended_info_unittest.cc index d95e404e00..26920e6676 100644 --- a/src/lib/dhcpsrv/tests/memfile_lease_extended_info_unittest.cc +++ b/src/lib/dhcpsrv/tests/memfile_lease_extended_info_unittest.cc @@ -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 remote_id0 = { 0xaa, 0xbb, 0xcc }; - vector remote_id1 = { 1, 2, 3, 4 }; + vector remote_id0 = { 1, 2, 3, 4 }; + vector remote_id1 = { 0xaa, 0xbb, 0xcc }; vector 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; diff --git a/src/lib/dhcpsrv/tests/memfile_lease_mgr_unittest.cc b/src/lib/dhcpsrv/tests/memfile_lease_mgr_unittest.cc index 74047155ea..1833265f89 100644 --- a/src/lib/dhcpsrv/tests/memfile_lease_mgr_unittest.cc +++ b/src/lib/dhcpsrv/tests/memfile_lease_mgr_unittest.cc @@ -3615,6 +3615,20 @@ TEST_F(MemfileLeaseMgrTest, extractExtendedInfo4) { EXPECT_EQ(relay, lease->relay_id_); const vector 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 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"