ping the database and retry rather before doing anything
authorivan <ivan>
Fri, 25 Jun 2004 10:25:02 +0000 (10:25 +0000)
committerivan <ivan>
Fri, 25 Jun 2004 10:25:02 +0000 (10:25 +0000)
FS/FS/UID.pm
FS/bin/freeside-queued

index 8271f89..3d893ee 100644 (file)
@@ -16,7 +16,7 @@ use FS::Conf;
 
 @ISA = qw(Exporter);
 @EXPORT_OK = qw(checkeuid checkruid cgisuidsetup adminsuidsetup forksuidsetup
-                getotaker dbh datasrc getsecrets driver_name );
+                getotaker dbh datasrc getsecrets driver_name myconnect );
 
 $freeside_uid = scalar(getpwnam('freeside'));
 
@@ -84,11 +84,8 @@ sub forksuidsetup {
   $ENV{'BASH_ENV'} = '';
 
   croak "Not running uid freeside!" unless checkeuid();
-  getsecrets;
-  $dbh = DBI->connect($datasrc,$db_user,$db_pass, {
-                          'AutoCommit' => 0,
-                          'ChopBlanks' => 1,
-  } ) or die "DBI->connect error: $DBI::errstr\n";
+
+  $dbh = &myconnect;
 
   foreach ( keys %callback ) {
     &{$callback{$_}};
@@ -100,6 +97,11 @@ sub forksuidsetup {
   $dbh;
 }
 
+sub myconnect {
+  $dbh = DBI->connect( getsecrets, {'AutoCommit' => 0, 'ChopBlanks' => 1, } )
+    or die "DBI->connect error: $DBI::errstr\n";
+}
+
 =item install_callback
 
 A package can install a callback to be run in adminsuidsetup by passing
index 6ea27c0..0be3d9d 100644 (file)
@@ -7,7 +7,7 @@ use Fcntl qw(:flock);
 use POSIX qw(:sys_wait_h setsid);
 use Date::Format;
 use IO::File;
-use FS::UID qw(adminsuidsetup forksuidsetup driver_name dbh);
+use FS::UID qw(adminsuidsetup forksuidsetup driver_name dbh myconnect);
 use FS::Record qw(qsearch qsearchs);
 use FS::queue;
 use FS::queue_depend;
@@ -75,18 +75,27 @@ while (1) {
   }
   $warnkids=0;
 
-  my $nodepend = driver_name eq 'mysql'
-   ? ''
-   : 'AND 0 = ( SELECT COUNT(*) FROM queue_depend'.
-     ' WHERE queue_depend.jobnum = queue.jobnum ) ';
+  my $dbh = dbh;
+  unless ( $dbh->ping ) {
+    warn "WARNING: connection to database lost, reconnecting...\n";
+    myconnect;
+    unless ( $dbh->ping ) {
+      warn "WARNING: still no connection to database, sleeping for retry...\n";
+      sleep 10;
+      next;
+    }
+  }
 
   #my($job, $ljob);
   #{
   #  my $oldAutoCommit = $FS::UID::AutoCommit;
   #  local $FS::UID::AutoCommit = 0;
   $FS::UID::AutoCommit = 0;
-  my $dbh = dbh; 
   
+  my $nodepend = driver_name eq 'mysql'
+   ? ''
+   : 'AND 0 = ( SELECT COUNT(*) FROM queue_depend'.
+     ' WHERE queue_depend.jobnum = queue.jobnum ) ';
   my $job = qsearchs(
     'queue',
     { 'status' => 'new' },