2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-09-05 00:15:17 +00:00

[#2869] Finished delete cascade

This commit is contained in:
Francis Dupont
2023-07-06 23:04:23 +02:00
parent 122223650a
commit 47693d30ea
8 changed files with 92 additions and 10 deletions

View File

@@ -3525,9 +3525,7 @@ MySqlLeaseMgr::deleteLease(const Lease6Ptr& lease) {
// Check success case first as it is the most likely outcome. // Check success case first as it is the most likely outcome.
if (affected_rows == 1) { if (affected_rows == 1) {
// Delete references from extended info tables. // Delete references from extended info tables.
if (getExtendedInfoTablesEnabled()) { // Performed by the delete cascade.
deleteExtendedInfo6(lease->addr_);
}
// Run installed callbacks. // Run installed callbacks.
if (hasCallbacks()) { if (hasCallbacks()) {

View File

@@ -2706,9 +2706,7 @@ PgSqlLeaseMgr::deleteLease(const Lease6Ptr& lease) {
// Check success case first as it is the most likely outcome. // Check success case first as it is the most likely outcome.
if (affected_rows == 1) { if (affected_rows == 1) {
// Delete references from extended info tables. // Delete references from extended info tables.
if (getExtendedInfoTablesEnabled()) { // Performed by the delete cascade.
deleteExtendedInfo6(lease->addr_);
}
// Run installed callbacks. // Run installed callbacks.
if (hasCallbacks()) { if (hasCallbacks()) {

View File

@@ -8,7 +8,7 @@
#include <asiolink/io_address.h> #include <asiolink/io_address.h>
#include <cc/data.h> #include <cc/data.h>
#include <dhcpsrv/testutils/generic_extended_info_unittest.h> #include <dhcpsrv/testutils/generic_lease_extended_info_unittest.h>
#include <mysql/testutils/mysql_schema.h> #include <mysql/testutils/mysql_schema.h>
#include <dhcpsrv/mysql_lease_mgr.h> #include <dhcpsrv/mysql_lease_mgr.h>
@@ -172,6 +172,15 @@ TEST_F(MySqlExtendedInfoTest, enableTablesMultiThreading) {
testEnableTables(); testEnableTables();
} }
TEST_F(MySqlExtendedInfoTest, deleteCascade) {
testDeleteCascade();
}
TEST_F(MySqlExtendedInfoTest, deleteCascadeMultiThreading) {
MultiThreadingTest mt(true);
testDeleteCascade();
}
TEST_F(MySqlExtendedInfoTest, getLeases6ByRelayId) { TEST_F(MySqlExtendedInfoTest, getLeases6ByRelayId) {
testGetLeases6ByRelayId(); testGetLeases6ByRelayId();
} }

View File

@@ -8,7 +8,7 @@
#include <asiolink/io_address.h> #include <asiolink/io_address.h>
#include <cc/data.h> #include <cc/data.h>
#include <dhcpsrv/testutils/generic_extended_info_unittest.h> #include <dhcpsrv/testutils/generic_lease_extended_info_unittest.h>
#include <pgsql/testutils/pgsql_schema.h> #include <pgsql/testutils/pgsql_schema.h>
#include <dhcpsrv/pgsql_lease_mgr.h> #include <dhcpsrv/pgsql_lease_mgr.h>
@@ -172,6 +172,15 @@ TEST_F(PgSqlExtendedInfoTest, enableTablesMultiThreading) {
testEnableTables(); testEnableTables();
} }
TEST_F(PgSqlExtendedInfoTest, deleteCascade) {
testDeleteCascade();
}
TEST_F(PgSqlExtendedInfoTest, deleteCascadeMultiThreading) {
MultiThreadingTest mt(true);
testDeleteCascade();
}
TEST_F(PgSqlExtendedInfoTest, getLeases6ByRelayId) { TEST_F(PgSqlExtendedInfoTest, getLeases6ByRelayId) {
testGetLeases6ByRelayId(); testGetLeases6ByRelayId();
} }

View File

@@ -27,7 +27,7 @@ libdhcpsrvtest_la_SOURCES += lease_file_io.cc lease_file_io.h
libdhcpsrvtest_la_SOURCES += test_config_backend.h libdhcpsrvtest_la_SOURCES += test_config_backend.h
libdhcpsrvtest_la_SOURCES += test_config_backend_dhcp4.cc test_config_backend_dhcp4.h libdhcpsrvtest_la_SOURCES += test_config_backend_dhcp4.cc test_config_backend_dhcp4.h
libdhcpsrvtest_la_SOURCES += test_config_backend_dhcp6.cc test_config_backend_dhcp6.h libdhcpsrvtest_la_SOURCES += test_config_backend_dhcp6.cc test_config_backend_dhcp6.h
libdhcpsrvtest_la_SOURCES += generic_extended_info_unittest.h libdhcpsrvtest_la_SOURCES += generic_lease_extended_info_unittest.h
if HAVE_MYSQL if HAVE_MYSQL
libdhcpsrvtest_la_SOURCES += mysql_generic_backend_unittest.cc mysql_generic_backend_unittest.h libdhcpsrvtest_la_SOURCES += mysql_generic_backend_unittest.cc mysql_generic_backend_unittest.h

View File

@@ -105,7 +105,8 @@ public:
std::vector<uint8_t> duid_data = createFromString(DUIDS[i]); std::vector<uint8_t> duid_data = createFromString(DUIDS[i]);
DuidPtr duid(new DUID(duid_data)); DuidPtr duid(new DUID(duid_data));
asiolink::IOAddress addr(ADDRESS6[i]); asiolink::IOAddress addr(ADDRESS6[i]);
ASSERT_NO_THROW(lease.reset(new Lease6(((i % 2) ? Lease::TYPE_NA : Lease::TYPE_PD), addr, duid, ASSERT_NO_THROW(lease.reset(new Lease6(((i % 2) ? Lease::TYPE_NA : Lease::TYPE_PD),
addr, duid,
123, 1000, 2000, 123, 1000, 2000,
static_cast<SubnetID>(i)))); static_cast<SubnetID>(i))));
leases6.push_back(lease); leases6.push_back(lease);
@@ -179,6 +180,9 @@ public:
/// @brief Test initLease6 with tables. /// @brief Test initLease6 with tables.
void testEnableTables(); void testEnableTables();
/// @brief Test delete cascade on tables.
void testDeleteCascade();
/// @brief Test getLeases6ByRelayId. /// @brief Test getLeases6ByRelayId.
void testGetLeases6ByRelayId(); void testGetLeases6ByRelayId();
@@ -1027,6 +1031,46 @@ GenericExtendedInfoTest<NakedLeaseMgrType>::testEnableTables() {
} }
} }
/// @brief Verifies that the delete cascade feature works as expected,
/// i.e. that deleteLease() does not require an explicit call to
/// deleteExtendedInfo6().
template<typename NakedLeaseMgrType> void
GenericExtendedInfoTest<NakedLeaseMgrType>::testDeleteCascade() {
// Lease manager is created with empty tables.
start(true);
initLease6();
EXPECT_EQ(0, lease_mgr_->byRelayId6size());
EXPECT_EQ(0, lease_mgr_->byRemoteId6size());
// Create parameter values.
asiolink::IOAddress lease_addr(ADDRESS6[0]);
std::vector<uint8_t> relay_id_data0 = createFromString(DUIDS[0]);
DUID relay_id0(relay_id_data0);
std::vector<uint8_t> relay_id_data1 = createFromString(DUIDS[1]);
DUID relay_id1(relay_id_data1);
std::vector<uint8_t> remote_id0 = createFromString(DUIDS[2]);
std::vector<uint8_t> remote_id1 = createFromString(DUIDS[3]);
// Fill the table.
EXPECT_NO_THROW(lease_mgr_->addRelayId6(lease_addr, relay_id_data0));
EXPECT_NO_THROW(lease_mgr_->addRelayId6(lease_addr, relay_id_data1));
EXPECT_NO_THROW(lease_mgr_->addRemoteId6(lease_addr, remote_id0));
EXPECT_NO_THROW(lease_mgr_->addRemoteId6(lease_addr, remote_id1));
EXPECT_EQ(2, lease_mgr_->byRelayId6size());
EXPECT_EQ(2, lease_mgr_->byRemoteId6size());
// Remove the first lease.
EXPECT_NO_THROW(lease_mgr_->deleteLease(leases6[0]));
// Check the first lease was gone.
EXPECT_FALSE(lease_mgr_->getLease6(Lease::TYPE_NA, lease_addr));
EXPECT_FALSE(lease_mgr_->getLease6(Lease::TYPE_PD, lease_addr));
// Check tables are now empty.
EXPECT_EQ(0, lease_mgr_->byRelayId6size());
EXPECT_EQ(0, lease_mgr_->byRemoteId6size());
}
/// @brief Verifies that getLeases6ByRelayId works as expected. /// @brief Verifies that getLeases6ByRelayId works as expected.
template<typename NakedLeaseMgrType> void template<typename NakedLeaseMgrType> void
GenericExtendedInfoTest<NakedLeaseMgrType>::testGetLeases6ByRelayId() { GenericExtendedInfoTest<NakedLeaseMgrType>::testGetLeases6ByRelayId() {

View File

@@ -5832,6 +5832,18 @@ UPDATE dhcp6_global_parameter
SET name = 'ddns-conflict-resolution-mode', value = 'no-check-with-dhcid', parameter_type = 4 SET name = 'ddns-conflict-resolution-mode', value = 'no-check-with-dhcid', parameter_type = 4
WHERE name = 'ddns-use-conflict-resolution' and value = 'false'; WHERE name = 'ddns-use-conflict-resolution' and value = 'false';
-- Add a constraint on lease6_relay_id that any lease_addr must map to
-- a lease6 address.
ALTER TABLE lease6_relay_id
ADD CONSTRAINT fk_lease6_relay_id_addr FOREIGN KEY (lease_addr)
REFERENCES lease6 (address) ON DELETE CASCADE ON UPDATE NO ACTION;
-- Add a constraint on lease6_remote_id that any lease_addr must map to
-- a lease6 address.
ALTER TABLE lease6_remote_id
ADD CONSTRAINT fk_lease6_remote_id_addr FOREIGN KEY (lease_addr)
REFERENCES lease6 (address) ON DELETE CASCADE ON UPDATE NO ACTION;
-- Update the schema version number. -- Update the schema version number.
UPDATE schema_version UPDATE schema_version
SET version = '20', minor = '0'; SET version = '20', minor = '0';

View File

@@ -73,6 +73,18 @@ UPDATE dhcp6_global_parameter
SET name = 'ddns-conflict-resolution-mode', value = 'no-check-with-dhcid', parameter_type = 4 SET name = 'ddns-conflict-resolution-mode', value = 'no-check-with-dhcid', parameter_type = 4
WHERE name = 'ddns-use-conflict-resolution' and value = 'false'; WHERE name = 'ddns-use-conflict-resolution' and value = 'false';
-- Add a constraint on lease6_relay_id that any lease_addr must map to
-- a lease6 address.
ALTER TABLE lease6_relay_id
ADD CONSTRAINT fk_lease6_relay_id_addr FOREIGN KEY (lease_addr)
REFERENCES lease6 (address) ON DELETE CASCADE ON UPDATE NO ACTION;
-- Add a constraint on lease6_remote_id that any lease_addr must map to
-- a lease6 address.
ALTER TABLE lease6_remote_id
ADD CONSTRAINT fk_lease6_remote_id_addr FOREIGN KEY (lease_addr)
REFERENCES lease6 (address) ON DELETE CASCADE ON UPDATE NO ACTION;
-- Update the schema version number. -- Update the schema version number.
UPDATE schema_version UPDATE schema_version
SET version = '20', minor = '0'; SET version = '20', minor = '0';