Reduce problem with timeouts on long-running queries v0.10
authorSteve McIntyre <steve@einval.com>
Sun, 19 Feb 2017 00:36:45 +0000 (00:36 +0000)
committerSteve McIntyre <steve@einval.com>
Sun, 19 Feb 2017 00:36:45 +0000 (00:36 +0000)
Add a keepalive thread to print comments every 10 seconds. This stops
Apache from timing out and killing things.

find_file.cgi

index 269f204..3c81c9c 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/perl -w
+#!/usr/bin/perl
 #
 # find_file.cgi
 #
@@ -22,6 +22,8 @@
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 
 use strict;
+use warnings;
+use threads;
 use DB_File;
 use CGI;
 use ConfigReader::Simple;
@@ -45,7 +47,7 @@ my $footer1 = "";
 my $footer2 = "";
 my $last_update = 0;
 
-my $version = "0.9";
+my $version = "0.10";
 my $title_base = "Debian CD search engine";
 
 my $q = new CGI;
@@ -270,6 +272,14 @@ sub pretty_name ($) {
     return $name;
 }    
 
+sub keepalive_thread () {
+    $SIG{'KILL'} = sub { threads->exit(); };
+    while(1) {
+       sleep 10;
+#      print "<!-- processing, please wait... ->\n"
+    }
+}
+
 set_default_config();
 read_config();
 read_files("en");
@@ -333,6 +343,14 @@ if ($query_type eq "simple") {
 }
 
 # If we get here, we have stuff to work with. Yay!
+
+my $start_time = time();
+print_header();
+print_html_header("$title_base results");
+
+# Now start the keepalive thread to print something every few seconds
+my $thr = threads->create(\&keepalive_thread);
+
 foreach my $area (@chosen_areas) {
     my $db_file_name = "$conf{'dbdir'}/$area.db";
     $l .= "Looking in area $area, file $db_file_name<br>\n";
@@ -364,8 +382,12 @@ foreach my $area (@chosen_areas) {
     dbmclose %fileinfo;
 }
 
-print_header();
-print_html_header("$title_base: $count results");
+# Kill the keepalive thread
+$thr->kill('KILL')->join();
+
+my $end_time = time();
+my $time_taken = $end_time - $start_time;
+
 print
     $q->start_html("$title_base: $count results"),
     $q->h1($title_base), "\n";
@@ -376,6 +398,7 @@ if ($conf{'debug'}) {
     print $q->li("query type: $query_type");
     print $q->li("query term: \"$query_term\" $using_glob");
     print $q->li("re_search: \"$re_search\"");
+    print $q->li("time take: $time_taken\n");
     print "</ul>\n";
 }
 print $q->p("<a href=\"" . $q->url . "\">Search again.</a>");