[Koha-bugs] [Bug 24185] 'If all unavailable' state for 'on shelf holds' makes holds page very slow if there's a lot of items

bugzilla-daemon at bugs.koha-community.org bugzilla-daemon at bugs.koha-community.org
Wed Jan 15 08:26:25 CET 2020


https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=24185

--- Comment #17 from Andrew Nugged <nugged at gmail.com> ---
Created attachment 97378
  -->
https://bugs.koha-community.org/bugzilla3/attachment.cgi?id=97378&action=edit
Bug 24185: Make holds page fast when 'on shelf holds' set to 'If all
unavailable'

When "reserve/request.pl -> C4/Reserves.pm::IsAvailableForItemLevelRequest"
called many times with hundred of items and "on shelf holds" parameter set to
"If all unavailable" for these items + patron, it goes slow.

It happens because in subloop it is checking if all items available so it is
O(n^2) and it re-checks each time the same info for each item with repeating
DB/data requests.

Fix:
The inner loop 1:1 picked out into separate subroutine and called outside of
the loop, saving data in 'items_any_available' variable once, this variable
passed to IsAvailableForItemLevelRequest to be used inside as the precalculated
result.

This made algorithm O(n) instead of O(n^2) so there is noticeable speed
increase.

How to reproduce:

1) on freshly installed kohadevbox create/import one book,
remember that biblionumber for later use it in down below,

2) add 100 items for that book for some library,

3) find some patron, that patron's card number we will
use as a borrower down below to open holds page,

4) check for the rule or set up a single circulation rule
in admin "/cgi-bin/koha/admin/smart-rules.pl",
that rule should match above book items/library/patron,
check that rule to have a non-zero number of holds (total, daily, count)
allowed,
and, IMPORTANT: set up "On shelf holds allowed" to "If all unavailable",
("item level holds" doesn't matter).

5) open "Home > Catalog > THAT_BOOK > Place a hold on THAT_BOOK" page
("holds" tab), and enter patron code in the search field,
or you can create a direct link by yourself, for example, in my case it was:
/cgi-bin/koha/reserve/request.pl?biblionumber=4&findborrower=23529000686353

6) it should be pretty long page generation time on old code, densely
increasing for every hundred items added. In the case of this solution, it's
fast, and time increases a little only, linear.

I tested on my computer in VirtualBox for page generation times,
did 3-5 runs for same case to check if results are stable, and got such values:

(old code):
  100 items:    50 seconds
  200 items:   3.2 minutes
  300 items:   7.3 minutes

(version with fix):
  100 items:   4.4 seconds
  200 items:   7.5 seconds
  300 items:  10.4 seconds

-- 
You are receiving this mail because:
You are watching all bug changes.


More information about the Koha-bugs mailing list