// 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()) {
// 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()) {
#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>
testEnableTables();
}
+TEST_F(MySqlExtendedInfoTest, deleteCascade) {
+ testDeleteCascade();
+}
+
+TEST_F(MySqlExtendedInfoTest, deleteCascadeMultiThreading) {
+ MultiThreadingTest mt(true);
+ testDeleteCascade();
+}
+
TEST_F(MySqlExtendedInfoTest, getLeases6ByRelayId) {
testGetLeases6ByRelayId();
}
#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>
testEnableTables();
}
+TEST_F(PgSqlExtendedInfoTest, deleteCascade) {
+ testDeleteCascade();
+}
+
+TEST_F(PgSqlExtendedInfoTest, deleteCascadeMultiThreading) {
+ MultiThreadingTest mt(true);
+ testDeleteCascade();
+}
+
TEST_F(PgSqlExtendedInfoTest, getLeases6ByRelayId) {
testGetLeases6ByRelayId();
}
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
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);
/// @brief Test initLease6 with tables.
void testEnableTables();
+ /// @brief Test delete cascade on tables.
+ void testDeleteCascade();
+
/// @brief Test getLeases6ByRelayId.
void testGetLeases6ByRelayId();
}
}
+/// @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() {
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';
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';