From c34b44da74a3d72ecd4298fb54338e200cb6b22f Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Tue, 27 Feb 2018 10:48:53 +0100 Subject: [PATCH] [5437] Optimized lease search in INIT_REBOOT case. --- src/bin/dhcp4/dhcp4_srv.cc | 51 ++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 11 deletions(-) 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()); + } + } } } -- 2.47.2