]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#4447] Removed left joins from pick functions
authorThomas Markwalder <tmark@isc.org>
Sat, 18 Apr 2026 17:01:52 +0000 (13:01 -0400)
committerThomas Markwalder <tmark@isc.org>
Mon, 20 Apr 2026 15:17:31 +0000 (15:17 +0000)
Left joins are perf killers. Relying on free
leseseX consistency instead.

a/src/bin/admin/tests/mysql_tests.sh.in
    mysql_sflqPickFreeLease6()
    mysql_sflqPickFreeLease6()
    - updated tests

/src/bin/admin/tests/pgsql_tests.sh.in
    pgsql_sflqPickFreeLease6()
    pgsql_sflqPickFreeLease6()
    - updated tests

/src/lib/dhcpsrv/testutils/generic_lease_mgr_unittest.cc
    GenericLeaseMgrTest::testSflqLeaseOps4()
    GenericLeaseMgrTest::testSflqLeaseOps6()
    - updated tests

/src/share/database/scripts/mysql/dhcpdb_create.mysql
/src/share/database/scripts/mysql/upgrade_033_to_034.sh.in
    - remove left join from SFLQ pick functions

/src/share/database/scripts/pgsql/dhcpdb_create.pgsql
/src/share/database/scripts/pgsql/upgrade_032_to_033.sh.in
    - remove left join from SFLQ pick functions

changelog_unreleased/4447-shared-flq-allocator-reconcile-sflq-pool-create-and-pick-free-lease-inconsistency [new file with mode: 0644]
src/bin/admin/tests/mysql_tests.sh.in
src/bin/admin/tests/pgsql_tests.sh.in
src/lib/dhcpsrv/testutils/generic_lease_mgr_unittest.cc
src/share/database/scripts/mysql/dhcpdb_create.mysql
src/share/database/scripts/mysql/upgrade_033_to_034.sh.in
src/share/database/scripts/pgsql/dhcpdb_create.pgsql
src/share/database/scripts/pgsql/upgrade_032_to_033.sh.in

diff --git a/changelog_unreleased/4447-shared-flq-allocator-reconcile-sflq-pool-create-and-pick-free-lease-inconsistency b/changelog_unreleased/4447-shared-flq-allocator-reconcile-sflq-pool-create-and-pick-free-lease-inconsistency
new file mode 100644 (file)
index 0000000..0c3bf79
--- /dev/null
@@ -0,0 +1,8 @@
+[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)
index 5ee683730173b5abd1bb741e23457acb7cbee4f2..2938d43d3d226b53131c17040e731d9eabe52472 100755 (executable)
@@ -4200,29 +4200,32 @@ mysql_sflqPickFreeLease4() {
     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'
@@ -4372,29 +4375,32 @@ mysql_sflqPickFreeLease6() {
     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'
index 1c0fbbf1e5a83cd51a431ed014727759691a9df5..97efbf7aae36292254a4fe7d4391f252707942f1 100755 (executable)
@@ -3358,29 +3358,33 @@ pgsql_sflqPickFreeLease4() {
     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)"
@@ -3530,29 +3534,32 @@ pgsql_sflqPickFreeLease6() {
     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"
index 691e11325dfbc96413e0ac30d50456f7ac4774b7..d1e70d4cc047fc0734a859a46fcf3aa6c30e036f 100644 (file)
@@ -5796,19 +5796,25 @@ GenericLeaseMgrTest::testSflqLeaseOps4() {
     // 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,
@@ -5843,12 +5849,15 @@ GenericLeaseMgrTest::testSflqLeaseOps4() {
         // 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 },
@@ -5863,7 +5872,6 @@ GenericLeaseMgrTest::testSflqLeaseOps4() {
     };
 
     // 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_;
@@ -5963,10 +5971,13 @@ GenericLeaseMgrTest::testSflqLeaseOps6(Lease::Type lease_type) {
     // 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));
@@ -5980,10 +5991,14 @@ GenericLeaseMgrTest::testSflqLeaseOps6(Lease::Type lease_type) {
 
     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,
@@ -6018,12 +6033,15 @@ GenericLeaseMgrTest::testSflqLeaseOps6(Lease::Type lease_type) {
         // 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 },
@@ -6038,8 +6056,6 @@ GenericLeaseMgrTest::testSflqLeaseOps6(Lease::Type lease_type) {
     };
 
     // 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_;
index 5c19acffd8b2296b9a674a2a6debdc454c87a837..1bd51ea67ea27473f1af10160a3ef20795e979e7 100644 (file)
@@ -6854,9 +6854,7 @@ BEGIN
 
     -- 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;
 
@@ -6866,9 +6864,7 @@ BEGIN
     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;
@@ -7022,10 +7018,8 @@ BEGIN
 
     -- 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;
 
@@ -7035,10 +7029,8 @@ BEGIN
     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;
index 603e1625dfd4dc0c41407115bbbf0fa93876b48e..361e55c62bd282de3f960f3c5631c7a2bcd3516b 100755 (executable)
@@ -434,9 +434,7 @@ BEGIN
 
     -- 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;
 
@@ -446,9 +444,7 @@ BEGIN
     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;
@@ -603,10 +599,8 @@ BEGIN
 
     -- 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;
 
@@ -616,10 +610,8 @@ BEGIN
     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;
index 1661ba95eb18032f3465b88f6acc5735f6f24f6e..a2b186cd02a5455c16f4cb2ab5c668f932d6a099 100644 (file)
@@ -6940,9 +6940,7 @@ BEGIN
 
     -- 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;
 
@@ -6952,9 +6950,7 @@ BEGIN
     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;
@@ -7323,9 +7319,8 @@ BEGIN
     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;
 
@@ -7335,10 +7330,8 @@ BEGIN
     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;
index 979e41d73fd4df58cf6dcb9c32401445077e8cd8..1a8db51420194672f60ed090e0503974bf7d59d4 100755 (executable)
@@ -226,9 +226,7 @@ BEGIN
 
     -- 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;
 
@@ -238,9 +236,7 @@ BEGIN
     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;
@@ -610,9 +606,8 @@ BEGIN
     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;
 
@@ -622,10 +617,8 @@ BEGIN
     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;