LP 115706: Avoid Internal Server Errors with Hold Count Retrieval
authorJason Stephenson <jason@sigio.com>
Tue, 7 Aug 2018 14:02:10 +0000 (10:02 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Fri, 31 May 2019 14:43:26 +0000 (10:43 -0400)
It can happen that the query to get a record's hold count can run too
long and timeout or fail for some other reason.  When this happens,
the user sees an Internal Server Error.  The underlying cause is the
following Perl error:

Can't use an undefined value as an ARRAY reference at
/usr/local/share/perl/5.22.1/OpenILS/Application/Circ/Holds.pm line
4264.

This commit rearranges the code around that line to avoid this
particular undefined value reference error.

Signed-off-by: Jason Stephenson <jason@sigio.com>
Signed-off-by: Cesar Velez <cesar.velez@equinoxinitiative.org>
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>

Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/Holds.pm

index 40a25b1..1336e4e 100644 (file)
@@ -4315,8 +4315,17 @@ sub rec_hold_count {
         } if ($pld != $top_ou->id);
     }
 
+    # To avoid Internal Server Errors, we get an editor, then run the
+    # query and check the result.  If anything fails, we'll return 0.
+    my $result = 0;
+    if (my $e = new_editor()) {
+        my $query_result = $e->json_query($query);
+        if ($query_result && @{$query_result}) {
+            $result = $query_result->[0]->{count}
+        }
+    }
 
-    return new_editor()->json_query($query)->[0]->{count};
+    return $result;
 }
 
 # A helper function to calculate a hold's expiration time at a given