]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5437] Optimized lease search in INIT_REBOOT case.
authorMarcin Siodelski <marcin@isc.org>
Tue, 27 Feb 2018 09:48:53 +0000 (10:48 +0100)
committerMarcin Siodelski <marcin@isc.org>
Tue, 27 Feb 2018 09:57:11 +0000 (10:57 +0100)
src/bin/dhcp4/dhcp4_srv.cc

index 03b3873d73af1a62481b030b3e25a212d95b42fa..d6f003603e2db324ed2799a11315fa10f8893a61 100644 (file)
@@ -1799,21 +1799,50 @@ Dhcpv4Srv::assignLease(Dhcpv4Exchange& ex) {
 
         Lease4Ptr lease;
         Subnet4Ptr original_subnet = subnet;
-        Subnet4Ptr s = original_subnet;
-        while (s) {
-            if (client_id) {
-                lease = LeaseMgrFactory::instance().getLease4(*client_id, s->getID());
-            }
 
-            if (!lease && hwaddr) {
-                lease = LeaseMgrFactory::instance().getLease4(*hwaddr, s->getID());
+        if (client_id) {
+            Lease4Collection leases_client_id = LeaseMgrFactory::instance().getLease4(*client_id);
+            if (!leases_client_id.empty()) {
+                Subnet4Ptr s = original_subnet;
+
+                while (s) {
+                    for (auto l = leases_client_id.begin(); l != leases_client_id.end(); ++l) {
+                        if ((*l)->subnet_id_ == s->getID()) {
+                            lease = *l;
+                            break;
+                        }
+                    }
+
+                    if (lease) {
+                        break;
+
+                    } else {
+                        s = s->getNextSubnet(original_subnet, query->getClasses());
+                    }
+                }
             }
+        }
 
-            if (lease ) {
-                break;
+        if (!lease && hwaddr) {
+            Lease4Collection leases_hwaddr = LeaseMgrFactory::instance().getLease4(*hwaddr);
+            if (!leases_hwaddr.empty()) {
+                Subnet4Ptr s = original_subnet;
 
-            } else {
-                s = s->getNextSubnet(original_subnet, query->getClasses());
+                while (s) {
+                    for (auto l = leases_hwaddr.begin(); l != leases_hwaddr.end(); ++l) {
+                        if ((*l)->subnet_id_ == s->getID()) {
+                            lease = *l;
+                            break;
+                        }
+                    }
+
+                    if (lease) {
+                        break;
+
+                    } else {
+                        s = s->getNextSubnet(original_subnet, query->getClasses());
+                    }
+                }
             }
         }