]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2869] Finished delete cascade
authorFrancis Dupont <fdupont@isc.org>
Thu, 6 Jul 2023 21:04:23 +0000 (23:04 +0200)
committerFrancis Dupont <fdupont@isc.org>
Thu, 6 Jul 2023 21:04:23 +0000 (23:04 +0200)
src/lib/dhcpsrv/mysql_lease_mgr.cc
src/lib/dhcpsrv/pgsql_lease_mgr.cc
src/lib/dhcpsrv/tests/mysql_lease_extended_info_unittest.cc
src/lib/dhcpsrv/tests/pgsql_lease_extended_info_unittest.cc
src/lib/dhcpsrv/testutils/Makefile.am
src/lib/dhcpsrv/testutils/generic_lease_extended_info_unittest.h [moved from src/lib/dhcpsrv/testutils/generic_extended_info_unittest.h with 97% similarity]
src/share/database/scripts/mysql/dhcpdb_create.mysql
src/share/database/scripts/mysql/upgrade_019_to_020.sh.in

index d38b90c46a40563439d72634dc10511c7560d5bf..6bb30b5be0ce97c3f5ab560cbcd4612cb0dcc130 100644 (file)
@@ -3525,9 +3525,7 @@ MySqlLeaseMgr::deleteLease(const Lease6Ptr& lease) {
     // Check success case first as it is the most likely outcome.
     if (affected_rows == 1) {
         // Delete references from extended info tables.
-        if (getExtendedInfoTablesEnabled()) {
-            deleteExtendedInfo6(lease->addr_);
-        }
+        // Performed by the delete cascade.
 
         // Run installed callbacks.
         if (hasCallbacks()) {
index 6b90f71dd4adb63465cf11746ea96c773ab3c492..ae8a1a71e4069b3bc24e9238aa31c5dd31311c34 100644 (file)
@@ -2706,9 +2706,7 @@ PgSqlLeaseMgr::deleteLease(const Lease6Ptr& lease) {
     // Check success case first as it is the most likely outcome.
     if (affected_rows == 1) {
         // Delete references from extended info tables.
-        if (getExtendedInfoTablesEnabled()) {
-            deleteExtendedInfo6(lease->addr_);
-        }
+        // Performed by the delete cascade.
 
         // Run installed callbacks.
         if (hasCallbacks()) {
index a3c8be9c23bbde3194993cb0562f14ea6b4a92ad..ed491ccb598c6d3b1b69597226a1615563352559 100644 (file)
@@ -8,7 +8,7 @@
 
 #include <asiolink/io_address.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 <dhcpsrv/mysql_lease_mgr.h>
 
@@ -172,6 +172,15 @@ TEST_F(MySqlExtendedInfoTest, enableTablesMultiThreading) {
     testEnableTables();
 }
 
+TEST_F(MySqlExtendedInfoTest, deleteCascade) {
+    testDeleteCascade();
+}
+
+TEST_F(MySqlExtendedInfoTest, deleteCascadeMultiThreading) {
+    MultiThreadingTest mt(true);
+    testDeleteCascade();
+}
+
 TEST_F(MySqlExtendedInfoTest, getLeases6ByRelayId) {
     testGetLeases6ByRelayId();
 }
index e9f803893b9b963321cab667fdc5df48312d5f50..bdb6cd8ecb074a5e38938346b5e5497bd7c36a87 100644 (file)
@@ -8,7 +8,7 @@
 
 #include <asiolink/io_address.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 <dhcpsrv/pgsql_lease_mgr.h>
 
@@ -172,6 +172,15 @@ TEST_F(PgSqlExtendedInfoTest, enableTablesMultiThreading) {
     testEnableTables();
 }
 
+TEST_F(PgSqlExtendedInfoTest, deleteCascade) {
+    testDeleteCascade();
+}
+
+TEST_F(PgSqlExtendedInfoTest, deleteCascadeMultiThreading) {
+    MultiThreadingTest mt(true);
+    testDeleteCascade();
+}
+
 TEST_F(PgSqlExtendedInfoTest, getLeases6ByRelayId) {
     testGetLeases6ByRelayId();
 }
index f15cba746e9ea8f6cf46aa487b77b7fc0e5634d8..301ce3099f7d702e08b2b819038e6a56a4db7958 100644 (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_dhcp4.cc test_config_backend_dhcp4.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
 libdhcpsrvtest_la_SOURCES += mysql_generic_backend_unittest.cc mysql_generic_backend_unittest.h
similarity index 97%
rename from src/lib/dhcpsrv/testutils/generic_extended_info_unittest.h
rename to src/lib/dhcpsrv/testutils/generic_lease_extended_info_unittest.h
index 31c4776a335bc88a53592e51d98239fd0c795980..4be6e5aedce72b71e9b007b999c87f6b5d23bcbe 100644 (file)
@@ -105,7 +105,8 @@ public:
             std::vector<uint8_t> duid_data = createFromString(DUIDS[i]);
             DuidPtr duid(new DUID(duid_data));
             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,
                                                    static_cast<SubnetID>(i))));
             leases6.push_back(lease);
@@ -179,6 +180,9 @@ public:
     /// @brief Test initLease6 with tables.
     void testEnableTables();
 
+    /// @brief Test delete cascade on tables.
+    void testDeleteCascade();
+
     /// @brief Test getLeases6ByRelayId.
     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.
 template<typename NakedLeaseMgrType> void
 GenericExtendedInfoTest<NakedLeaseMgrType>::testGetLeases6ByRelayId() {
index 0e78580510d73e6b1436d77850ecec22d71424e7..62a1b07a53f6cfc34d0cf924d35857ed6d38d501 100644 (file)
@@ -5832,6 +5832,18 @@ UPDATE dhcp6_global_parameter
 SET name = 'ddns-conflict-resolution-mode', value = 'no-check-with-dhcid', parameter_type = 4
 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 schema_version
     SET version = '20', minor = '0';
index 8d15c44a6035bae53579c94b6ba3e9a53241ebb9..98546be2092ecc7f8b7e9a1a916155fe4aa865fb 100644 (file)
@@ -73,6 +73,18 @@ UPDATE dhcp6_global_parameter
 SET name = 'ddns-conflict-resolution-mode', value = 'no-check-with-dhcid', parameter_type = 4
 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 schema_version
     SET version = '20', minor = '0';