On a large and busy system the holds queue can take several minutes to build adding a significant load to the database and koha server. I have profiled the script and have noticed two major inefficiencies: 1. Calls to C4::Circulation::GetBranchItemRule constitute roughly 35% of the runtime. But this method can easily be memoized. 2. With LocalHoldsPriority enabled, expensive checks are made for all available items, even if it is only relevant to do these checks for local items. Depending on how the system is configured, either the unnecessary loading of patron objects, or calls to _checkHoldPolicy can take considerable time. I have prepared two patches which together cuts the runtime of the script with abouth 50% if LocalHoldsPriority is enabled. Profiling result before: https://bv-test-opac.biblioteket.nu/resources/before/index.html Profiling result after: https://bv-test-opac.biblioteket.nu/resources/after/index.html
Created attachment 161358 [details] [review] Bug 35899: memoize C4::Circulation::GetBranchItemRule when building holds queue Test plan: * Examine patches and make sure they do not alter the functionality (provided there are no unexpected side effects in called subroutines) * Run prove t/db_dependent/HoldsQueue.t
Created attachment 161359 [details] [review] Bug 35899: don't perform expensive checks on non-local items when examining local items
Created attachment 161360 [details] [review] Bug 35899: memoize C4::Circulation::GetBranchItemRule when building holds queue Test plan: * Examine patches and make sure they do not alter the functionality (provided there are no unexpected side effects in called subroutines) * Run prove t/db_dependent/HoldsQueue.t
Created attachment 164969 [details] [review] Bug 35899: don't perform expensive checks on non-local items when examining local items
Created attachment 164970 [details] [review] Bug 35899: memoize C4::Circulation::GetBranchItemRule when building holds queue Test plan: * Examine patches and make sure they do not alter the functionality (provided there are no unexpected side effects in called subroutines) * Run prove t/db_dependent/HoldsQueue.t