"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",
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.
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)) {
++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) {
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;
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
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"