Bug 26854: Close STDERR when forking stage-marc-import.pl

We need to close STDERR when forking stage-marc-import.pl,
or else the CGI session with Apache httpd does not properly
finish. This leads to unexpected behaviour across different httpd
versions, operating systems, etc.

This patch closes the STDERR file handle when forking a child
process to do MARC imports, and it re-opens STDERR to a log file
in the logdir directory to catch any import errors.

Test plan:
1. Apply the patch
2. Go to http://localhost:8081/cgi-bin/koha/tools/stage-marc-import.pl
3. Upload a MARC file with a large number of records (e.g. 30,000 records)
4. Open F12 dev tools
5. Click on "Network" tab
6. Clear all existing network logs
7. Click "Stage for import"
8. After ~30 seconds, the request to stage-marc-import.pl should return a 200 code
9. Immediately, calls to background-job-progress.pl should start, and the "Job progress"
bar should update at a maximum rate of every .5 seconds
(or more realistically 1-2 seconds)

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
This commit is contained in:
David Cook 2020-10-29 04:24:31 +00:00 committed by Jonathan Druart
parent ba04deb9c3
commit f3cacc62cd
1 changed files with 8 additions and 3 deletions

View File

@ -124,10 +124,15 @@ if ($completedJobID) {
exit 0;
} elsif (defined $pid) {
# child
# close STDOUT to signal to Apache that
# we're now running in the background
# close STDOUT/STDERR to signal to end CGI session with Apache
# Otherwise, the AJAX request to this script won't return properly
close STDOUT;
# close STDERR; # there is no good reason to close STDERR
close STDERR;
my $logdir = C4::Context->config('logdir');
if ($logdir && -d $logdir){
my $logfile = sprintf("%s/%s",$logdir,'background-jobs.log');
open(STDERR, '>>', $logfile);
}
} else {
# fork failed, so exit immediately
warn "fork failed while attempting to run tools/stage-marc-import.pl as a background job: $!";