--- /dev/null
+[func] tmark
+ Added an experimental allocator type, 'shared-flq'.
+ It implements a free lease queue mechanism for
+ MySQL and Postgresql lease back ends. It is
+ intended for use in configurations that share
+ lease data between mulitple servers (i.e. shared
+ lease backends).
+ (Gitlab #4336, #4373, #4405, #4417, #4441, #4447)
run_statement "sflqPickFreeLease4.2" "$sql" "127.0.0.1";
run_statement "sflqPickFreeLease4.3" "$sql" "127.0.0.2";
+ # Inserting an active lease directly. Pick should still see it.
sql="insert into lease4 (address, subnet_id) values (inet_aton('127.0.0.1'), 1)";
run_statement "insert 127.0.0.1" "$sql" "";
sql="select inet_ntoa(sflqPickFreeLease4(inet_aton('127.0.0.0'), inet_aton('127.0.0.2')))"
run_statement "sflqPickFreeLease4.4" "$sql" "127.0.0.0";
- run_statement "sflqPickFreeLease4.5" "$sql" "127.0.0.2";
- run_statement "sflqPickFreeLease4.6" "$sql" "127.0.0.0";
+ run_statement "sflqPickFreeLease4.5" "$sql" "127.0.0.1";
+ run_statement "sflqPickFreeLease4.6" "$sql" "127.0.0.2";
+ # Updating it to reclaimed directly. Pick should still see it.
sql="update lease4 set state = 2 where address = (inet_aton('127.0.0.1'));"
run_statement "update 127.0.0.1" "$sql" "";
sql="select inet_ntoa(sflqPickFreeLease4(inet_aton('127.0.0.0'), inet_aton('127.0.0.2')))"
- run_statement "sflqPickFreeLease4.7" "$sql" "127.0.0.1";
- run_statement "sflqPickFreeLease4.8" "$sql" "127.0.0.2";
- run_statement "sflqPickFreeLease4.9" "$sql" "127.0.0.0";
+ run_statement "sflqPickFreeLease4.7" "$sql" "127.0.0.0";
+ run_statement "sflqPickFreeLease4.8" "$sql" "127.0.0.1";
+ run_statement "sflqPickFreeLease4.9" "$sql" "127.0.0.2";
+ # Deleting a lease directly. Pick should still see it.
sql="delete from lease4"
run_statement "delete 127.0.0.1" "$sql" "";
sql="select inet_ntoa(sflqPickFreeLease4(inet_aton('127.0.0.0'), inet_aton('127.0.0.2')))"
- run_statement "sflqPickFreeLease4.10" "$sql" "127.0.0.1";
- run_statement "sflqPickFreeLease4.11" "$sql" "127.0.0.2";
- run_statement "sflqPickFreeLease4.12" "$sql" "127.0.0.0";
+ run_statement "sflqPickFreeLease4.10" "$sql" "127.0.0.0";
+ run_statement "sflqPickFreeLease4.11" "$sql" "127.0.0.1";
+ run_statement "sflqPickFreeLease4.12" "$sql" "127.0.0.2";
# Check pools with one address.
address='192.0.2.0'
run_statement "sflqPickFreeLease6.2" "$sql" "3001::2";
run_statement "sflqPickFreeLease6.3" "$sql" "3001::";
+ # Inserting an active lease directly. Pick should still see it.
sql="insert into lease6 (address, lease_type, subnet_id) values (inet6_aton('3001::1'), 1, 1)";
run_statement "insert 3001::1" "$sql" "";
sql="select sflqPickFreeLease6('3001::', '3001::02')"
- run_statement "sflqPickFreeLease6.4" "$sql" "3001::2";
- run_statement "sflqPickFreeLease6.5" "$sql" "3001::";
- run_statement "sflqPickFreeLease6.6" "$sql" "3001::2";
+ run_statement "sflqPickFreeLease6.4" "$sql" "3001::1";
+ run_statement "sflqPickFreeLease6.5" "$sql" "3001::2";
+ run_statement "sflqPickFreeLease6.6" "$sql" "3001::";
+ # Updating to reclaimed directly. Pick should still see it.
sql="update lease6 set state = 2 where address = (inet6_aton('3001::1'));"
run_statement "update 3001::1" "$sql" "";
sql="select sflqPickFreeLease6('3001::', '3001::02')"
- run_statement "sflqPickFreeLease6.7" "$sql" "3001::";
- run_statement "sflqPickFreeLease6.8" "$sql" "3001::1";
- run_statement "sflqPickFreeLease6.9" "$sql" "3001::2";
+ run_statement "sflqPickFreeLease6.7" "$sql" "3001::1";
+ run_statement "sflqPickFreeLease6.8" "$sql" "3001::2";
+ run_statement "sflqPickFreeLease6.9" "$sql" "3001::";
+ # Deleting a lease directly. Pick should still see it.
sql="delete from lease6"
run_statement "delete 3001::1" "$sql" "";
sql="select sflqPickFreeLease6('3001::', '3001::02')"
- run_statement "sflqPickFreeLease6.10" "$sql" "3001::";
- run_statement "sflqPickFreeLease6.11" "$sql" "3001::1";
- run_statement "sflqPickFreeLease6.12" "$sql" "3001::2";
+ run_statement "sflqPickFreeLease6.10" "$sql" "3001::1";
+ run_statement "sflqPickFreeLease6.11" "$sql" "3001::2";
+ run_statement "sflqPickFreeLease6.12" "$sql" "3001::";
# Check pools with one address.
address='2001:db8::8bd:1002'
run_statement "sflqPickFreeLease4.2" "$sql" "127.0.0.1";
run_statement "sflqPickFreeLease4.3" "$sql" "127.0.0.2";
+ # Inserting a lease directly. Pick should still see it.
sql="insert into lease4 (address, subnet_id) values ('127.0.0.1'::inet - '0.0.0.0'::inet, 1)";
run_statement "insert 127.0.0.1" "$sql" "";
+ # Inserting an active lease directly. Pick should still see it.
sql="select ('0.0.0.0'::inet + sflqPickFreeLease4($start_address, $end_address))"
run_statement "sflqPickFreeLease4.4" "$sql" "127.0.0.0";
- run_statement "sflqPickFreeLease4.5" "$sql" "127.0.0.2";
- run_statement "sflqPickFreeLease4.6" "$sql" "127.0.0.0";
+ run_statement "sflqPickFreeLease4.5" "$sql" "127.0.0.1";
+ run_statement "sflqPickFreeLease4.6" "$sql" "127.0.0.2";
+ # Updating a lease directly. Pick should still see it.
sql="update lease4 set state = 2 where address = ('127.0.0.1'::inet - '0.0.0.0'::inet);"
run_statement "update 127.0.0.1" "$sql" "";
sql="select ('0.0.0.0'::inet + sflqPickFreeLease4($start_address, $end_address))"
- run_statement "sflqPickFreeLease4.7" "$sql" "127.0.0.1";
- run_statement "sflqPickFreeLease4.8" "$sql" "127.0.0.2";
- run_statement "sflqPickFreeLease4.9" "$sql" "127.0.0.0";
+ run_statement "sflqPickFreeLease4.7" "$sql" "127.0.0.0";
+ run_statement "sflqPickFreeLease4.8" "$sql" "127.0.0.1";
+ run_statement "sflqPickFreeLease4.9" "$sql" "127.0.0.2";
+ # Deleting a lease directly. Pick should still see it.
sql="delete from lease4"
run_statement "delete 127.0.0.1" "$sql" "";
sql="select ('0.0.0.0'::inet + sflqPickFreeLease4($start_address, $end_address))"
- run_statement "sflqPickFreeLease4.10" "$sql" "127.0.0.1";
- run_statement "sflqPickFreeLease4.11" "$sql" "127.0.0.2";
- run_statement "sflqPickFreeLease4.12" "$sql" "127.0.0.0";
+ run_statement "sflqPickFreeLease4.10" "$sql" "127.0.0.0";
+ run_statement "sflqPickFreeLease4.11" "$sql" "127.0.0.1";
+ run_statement "sflqPickFreeLease4.12" "$sql" "127.0.0.2";
# Check pools with one address.
address="('192.0.2.0'::inet - '0.0.0.0'::inet)"
run_statement "sflqPickFreeLease6.2" "$sql" "3001::1";
run_statement "sflqPickFreeLease6.3" "$sql" "3001::2";
+ # Inserting a lease directly. Pick should still see it.
sql="insert into lease6 (address, lease_type, subnet_id) values ('3001::1'::inet, 1::smallint, 1::bigint)";
run_statement "insert 3001::1" "$sql" "";
sql="select sflqPickFreeLease6('3001::'::inet, '3001::02'::inet)"
run_statement "sflqPickFreeLease6.4" "$sql" "3001::";
- run_statement "sflqPickFreeLease6.5" "$sql" "3001::2";
- run_statement "sflqPickFreeLease6.6" "$sql" "3001::";
+ run_statement "sflqPickFreeLease6.5" "$sql" "3001::1";
+ run_statement "sflqPickFreeLease6.6" "$sql" "3001::2";
+ # Updating to reclaimed directly. Pick should still see it.
sql="update lease6 set state = 2 where address = ('3001::1'::inet);"
run_statement "update 3001::1" "$sql" "";
sql="select sflqPickFreeLease6('3001::'::inet, '3001::02'::inet)"
- run_statement "sflqPickFreeLease6.7" "$sql" "3001::1";
- run_statement "sflqPickFreeLease6.8" "$sql" "3001::2";
- run_statement "sflqPickFreeLease6.9" "$sql" "3001::";
+ run_statement "sflqPickFreeLease6.7" "$sql" "3001::";
+ run_statement "sflqPickFreeLease6.8" "$sql" "3001::1";
+ run_statement "sflqPickFreeLease6.9" "$sql" "3001::2";
+ # Deleting a lease directly. Pick should still see it.
sql="delete from lease6"
run_statement "delete 3001::1" "$sql" "";
sql="select sflqPickFreeLease6('3001::'::inet, '3001::02'::inet)"
- run_statement "sflqPickFreeLease6.10" "$sql" "3001::1";
- run_statement "sflqPickFreeLease6.11" "$sql" "3001::2";
- run_statement "sflqPickFreeLease6.12" "$sql" "3001::";
+ run_statement "sflqPickFreeLease6.10" "$sql" "3001::";
+ run_statement "sflqPickFreeLease6.11" "$sql" "3001::1";
+ run_statement "sflqPickFreeLease6.12" "$sql" "3001::2";
# Check pools with one address.
address="'2001:db8::8bd:1002'::inet"
// Create a subnet with a one address pool for simplicity.
IOAddress start_address("192.0.2.0");
IOAddress end_address("192.0.2.0");
+ Lease4Ptr preop_lease = initializeLease4(start_address.toText());
CfgSubnets4Ptr cfg = CfgMgr::instance().getStagingCfg()->getCfgSubnets4();
Subnet4Ptr subnet;
Pool4Ptr pool;
- subnet.reset(new Subnet4(start_address, 24, 1, 2, 3, 1));
+ subnet.reset(new Subnet4(start_address, 24, 1, 2, 3, preop_lease->subnet_id_));
pool.reset(new Pool4(start_address, end_address));
subnet->addPool(pool);
- AllocatorPtr sflq_allocator(new SharedFlqAllocator(Lease::TYPE_V4, subnet));
- subnet->setAllocator(Lease::TYPE_V4, sflq_allocator);
+
+ subnet->setAllocatorType("shared-flq");
+ ASSERT_NO_THROW_LOG(subnet->createAllocators());
cfg->add(subnet);
+ ASSERT_NO_THROW(CfgMgr::instance().commit());
// Should create the SFLQ pool for the subnet.
cfg->initAllocatorsAfterConfigure();
+ ASSERT_TRUE(SharedFlqAllocator::inUse());
+ ASSERT_TRUE(LeaseMgr::useSharedFlqStatement(preop_lease));
+
// Defines a list of lease operations.
enum LeaseOp {
ADD,
// Delete the lease.
{__LINE__, DELETE, Lease::STATE_DEFAULT,
!expired, !should_exist, can_pick },
-#if 0
- // @todo This hinges on #4447
+
// Add an expired lease.
{__LINE__, ADD, Lease::STATE_DEFAULT,
- !expired, should_exist, can_pick },
-#endif
+ expired, should_exist, !can_pick },
+
+ // Delete the lease.
+ {__LINE__, DELETE, Lease::STATE_DEFAULT,
+ !expired, !should_exist, can_pick },
+
// Add a reclaimed lease.
{__LINE__, ADD, Lease::STATE_EXPIRED_RECLAIMED,
!expired, should_exist, can_pick },
};
// Iterate over the scenarios.
- Lease4Ptr preop_lease = initializeLease4(start_address.toText());
for ( auto const& scenario : scenarios ){
std::ostringstream os;
os << "scenario at line: " << scenario.lineno_;
// Create a subnet with a one address pool for simplicity.
IOAddress start_address("2001:db8::");
IOAddress end_address("2001:db8::");
+ Lease6Ptr preop_lease = initializeLease6(start_address.toText());
+ preop_lease->type_ = lease_type;
+
CfgSubnets6Ptr cfg = CfgMgr::instance().getStagingCfg()->getCfgSubnets6();
Subnet6Ptr subnet;
Pool6Ptr pool;
- subnet.reset(new Subnet6(start_address, 64, 1, 2, 3, 4, 1));
+ subnet.reset(new Subnet6(start_address, 64, 1, 2, 3, 4, preop_lease->subnet_id_));
if (lease_type == Lease::TYPE_NA) {
pool.reset(new Pool6(Lease::TYPE_NA, start_address, end_address));
ASSERT_NO_THROW_LOG(subnet->createAllocators());
cfg->add(subnet);
+ ASSERT_NO_THROW(CfgMgr::instance().commit());
// Should create the SFLQ pool for the subnet.
cfg->initAllocatorsAfterConfigure();
+ ASSERT_TRUE(SharedFlqAllocator::inUse());
+ ASSERT_TRUE(LeaseMgr::useSharedFlqStatement(preop_lease));
+
// Defines a list of lease operations.
enum LeaseOp {
ADD,
// Delete the lease.
{__LINE__, DELETE, Lease::STATE_DEFAULT,
!expired, !should_exist, can_pick },
-#if 0
- // @todo This hinges on #4447
+
// Add an expired lease.
{__LINE__, ADD, Lease::STATE_DEFAULT,
- !expired, should_exist, can_pick },
-#endif
+ expired, should_exist, !can_pick },
+
+ // Delete the lease.
+ {__LINE__, DELETE, Lease::STATE_DEFAULT,
+ !expired, !should_exist, can_pick },
+
// Add a reclaimed lease.
{__LINE__, ADD, Lease::STATE_EXPIRED_RECLAIMED,
!expired, should_exist, can_pick },
};
// Iterate over the scenarios.
- Lease6Ptr preop_lease = initializeLease6(start_address.toText());
- preop_lease->type_ = lease_type;
for ( auto const& scenario : scenarios ){
std::ostringstream os;
os << "scenario at line: " << scenario.lineno_;
-- Find first address greater than the last pick.
SELECT f.address INTO free_address FROM free_lease4 f
- LEFT JOIN lease4 on f.address = lease4.address
WHERE (f.address > last_address and f.address <= alloc_end_address)
- AND (lease4.address IS NULL OR lease4.state = 2)
ORDER BY f.address ASC
LIMIT 1;
IF (free_address = 0)
THEN
SELECT f.address INTO free_address FROM free_lease4 f
- LEFT JOIN lease4 on f.address = lease4.address
WHERE (f.address >= alloc_start_address AND f.address <= last_address)
- AND (lease4.address IS NULL OR lease4.state = 2)
ORDER BY f.address ASC
LIMIT 1;
END IF;
-- Find first address greater than the last pick.
SELECT f.address INTO free_address FROM free_lease6 f
- LEFT JOIN lease6 on f.bin_address = lease6.address
WHERE (f.bin_address > bin_last_address
AND f.bin_address <= bin_end_address)
- AND (lease6.address IS NULL OR lease6.state = 2)
ORDER BY f.bin_address
LIMIT 1;
IF (found_rows() = 0)
THEN
SELECT f.address INTO free_address FROM free_lease6 f
- LEFT JOIN lease6 on f.bin_address = lease6.address
WHERE (f.bin_address >= bin_start_address
- AND f.bin_address <= bin_last_address)
- AND (lease6.address IS NULL OR lease6.state = 2)
+ AND f.bin_address <= bin_last_address)
ORDER BY f.bin_address
LIMIT 1;
END IF;
-- Find first address greater than the last pick.
SELECT f.address INTO free_address FROM free_lease4 f
- LEFT JOIN lease4 on f.address = lease4.address
WHERE (f.address > last_address and f.address <= alloc_end_address)
- AND (lease4.address IS NULL OR lease4.state = 2)
ORDER BY f.address ASC
LIMIT 1;
IF (free_address = 0)
THEN
SELECT f.address INTO free_address FROM free_lease4 f
- LEFT JOIN lease4 on f.address = lease4.address
WHERE (f.address >= alloc_start_address AND f.address <= last_address)
- AND (lease4.address IS NULL OR lease4.state = 2)
ORDER BY f.address ASC
LIMIT 1;
END IF;
-- Find first address greater than the last pick.
SELECT f.address INTO free_address FROM free_lease6 f
- LEFT JOIN lease6 on f.bin_address = lease6.address
WHERE (f.bin_address > bin_last_address
AND f.bin_address <= bin_end_address)
- AND (lease6.address IS NULL OR lease6.state = 2)
ORDER BY f.bin_address
LIMIT 1;
IF (found_rows() = 0)
THEN
SELECT f.address INTO free_address FROM free_lease6 f
- LEFT JOIN lease6 on f.bin_address = lease6.address
WHERE (f.bin_address >= bin_start_address
- AND f.bin_address <= bin_last_address)
- AND (lease6.address IS NULL OR lease6.state = 2)
+ AND f.bin_address <= bin_last_address)
ORDER BY f.bin_address
LIMIT 1;
END IF;
-- Find first address greater than the last pick.
SELECT f.address INTO free_address FROM free_lease4 f
- LEFT JOIN lease4 ON f.address = lease4.address
WHERE (f.address > last_address and f.address <= p_end_address)
- AND (lease4.address IS NULL OR lease4.state = 2)
ORDER BY f.address
LIMIT 1;
IF (free_address IS NULL)
THEN
SELECT f.address INTO free_address FROM free_lease4 f
- LEFT JOIN lease4 ON f.address = lease4.address
WHERE (f.address >= p_start_address AND f.address <= last_address)
- AND (lease4.address IS NULL OR lease4.state = 2)
ORDER BY f.address
LIMIT 1;
END IF;
bin_last_address = inetToBytea(last_address);
-- Find first address greater than the last pick.
SELECT f.address INTO free_address FROM free_lease6 f
- LEFT JOIN lease6 ON f.address = lease6.address
- WHERE ((f.bin_address > bin_last_address AND f.bin_address <= bin_end_address)
- AND (lease6.address IS NULL OR lease6.state = 2))
+ WHERE (f.bin_address > bin_last_address AND
+ f.bin_address <= bin_end_address)
ORDER BY f.bin_address
LIMIT 1;
IF (free_address IS NULL)
THEN
SELECT f.address INTO free_address FROM free_lease6 f
- LEFT JOIN lease6 on f.address = lease6.address
- WHERE ((f.bin_address >= bin_start_address AND
- f.bin_address <= bin_last_address)
- AND (lease6.address IS NULL OR lease6.state = 2))
+ WHERE (f.bin_address >= bin_start_address AND
+ f.bin_address <= bin_last_address)
ORDER BY f.bin_address
LIMIT 1;
END IF;
-- Find first address greater than the last pick.
SELECT f.address INTO free_address FROM free_lease4 f
- LEFT JOIN lease4 ON f.address = lease4.address
WHERE (f.address > last_address and f.address <= p_end_address)
- AND (lease4.address IS NULL OR lease4.state = 2)
ORDER BY f.address
LIMIT 1;
IF (free_address IS NULL)
THEN
SELECT f.address INTO free_address FROM free_lease4 f
- LEFT JOIN lease4 ON f.address = lease4.address
WHERE (f.address >= p_start_address AND f.address <= last_address)
- AND (lease4.address IS NULL OR lease4.state = 2)
ORDER BY f.address
LIMIT 1;
END IF;
bin_last_address = inetToBytea(last_address);
-- Find first address greater than the last pick.
SELECT f.address INTO free_address FROM free_lease6 f
- LEFT JOIN lease6 ON f.address = lease6.address
- WHERE ((f.bin_address > bin_last_address AND f.bin_address <= bin_end_address)
- AND (lease6.address IS NULL OR lease6.state = 2))
+ WHERE (f.bin_address > bin_last_address AND
+ f.bin_address <= bin_end_address)
ORDER BY f.bin_address
LIMIT 1;
IF (free_address IS NULL)
THEN
SELECT f.address INTO free_address FROM free_lease6 f
- LEFT JOIN lease6 on f.address = lease6.address
- WHERE ((f.bin_address >= bin_start_address AND
- f.bin_address <= bin_last_address)
- AND (lease6.address IS NULL OR lease6.state = 2))
+ WHERE (f.bin_address >= bin_start_address AND
+ f.bin_address <= bin_last_address)
ORDER BY f.bin_address
LIMIT 1;
END IF;