From: Marcin Siodelski Date: Tue, 27 Feb 2018 09:48:53 +0000 (+0100) Subject: [5437] Optimized lease search in INIT_REBOOT case. X-Git-Tag: ha_checkpoints12~10^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c34b44da74a3d72ecd4298fb54338e200cb6b22f;p=thirdparty%2Fkea.git [5437] Optimized lease search in INIT_REBOOT case. --- diff --git a/src/bin/dhcp4/dhcp4_srv.cc b/src/bin/dhcp4/dhcp4_srv.cc index 03b3873d73..d6f003603e 100644 --- a/src/bin/dhcp4/dhcp4_srv.cc +++ b/src/bin/dhcp4/dhcp4_srv.cc @@ -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()); + } + } } }