X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2Fbin%2Ffreeside-torrus-srvderive;h=c368703a44e970fe5c417be50c64a3f143d3c72c;hb=a604b9d9a87a415d64f1fc3c159f0a89302b137c;hp=0441c4704753d3ed4c9e82b3d33112c711530ba4;hpb=5af9611527ddcda51c778eabcabed8516b414614;p=freeside.git diff --git a/FS/bin/freeside-torrus-srvderive b/FS/bin/freeside-torrus-srvderive index 0441c4704..c368703a4 100644 --- a/FS/bin/freeside-torrus-srvderive +++ b/FS/bin/freeside-torrus-srvderive @@ -1,6 +1,7 @@ #!/usr/bin/perl -w use strict; +use Sys::SigAction qw( set_sig_handler ); use Date::Parse; use Date::Format; use FS::Daemon ':all'; #daemonize1 drop_root daemonize2 myexit logfile sig* @@ -59,11 +60,11 @@ my $orderlimit = " "; -while (1) { +MAIN: while (1) { my $found = 0; - foreach my $torrus_srvderive ( qsearch('torrus_srvderive', {}) ) { + SERVICEID: foreach my $torrus_srvderive ( qsearch('torrus_srvderive', {}) ) { my $serviceid = $torrus_srvderive->serviceid; @@ -75,6 +76,25 @@ while (1) { } my $in = join(',', @in); + if ( ! $torrus_srvderive->last_srv_date ) { + warn "finding initial last_srv_date for $serviceid\n" if $DEBUG; + my $dsql = "SELECT srv_date FROM srvexport WHERE serviceid IN ($in) + ORDER BY srv_date LIMIT 1"; + my $dsth = dbh->prepare($dsql) or die $DBI::errstr; + $dsth->execute or die $dsth->errstr; + my $date = $dsth->fetchrow_arrayref->[0]; + if ( $date ) { + warn "found initial last_srv_date of $date; updating $serviceid\n" + if $DEBUG; + $torrus_srvderive->last_srv_date($date); + my $error = $torrus_srvderive->replace; + die $error if $error; + } else { + warn "no initial last_srv_date for $serviceid; skipping\n" if $DEBUG; + next; + } + } + my $ssql = " $sql AND EXISTS ( SELECT 1 FROM srvexport AS other @@ -91,8 +111,30 @@ while (1) { warn "searching for times to add $serviceid\n" if $DEBUG; warn $ssql if $DEBUG > 2; - my $sth = dbh->prepare($ssql) or die $DBI::errstr; #better recovery? - $sth->execute($serviceid, $serviceid) or die $sth->errstr; + my $sth = dbh->prepare($ssql) or die $DBI::errstr; #better recovery here? + + warn "executing search\n" if $DEBUG; + + eval { + my $h = set_sig_handler( 'ALRM', sub { die "_timeout\n"; } ); + alarm(10*60); #5*60); #$torrus_srvderive->last_srv_date ? 5*60 : 15*60); + $sth->execute($serviceid, $serviceid) or die $sth->errstr; + alarm(0); + }; + alarm(0); + + if ( $@ && $@ eq "_timeout\n" ) { + warn "search timed out; reconnecting and restarting\n"; + dbh->clone()->do("KILL QUERY ". dbh->{"mysql_thread_id"}) + if driver_name eq 'mysql'; + dbh->rollback; #or die dbh->errstr; + adminsuidsetup($user); + next SERVICEID; #MAIN; + } elsif ( $@ ) { + die $@; + } + + warn "search executed; checking results\n" if $DEBUG; my $prev = 0; while ( my $row = $sth->fetchrow_arrayref ) { @@ -131,10 +173,13 @@ while (1) { my $isth = dbh->prepare($isql) or die $DBI::errstr; #better recovery? - #stupid mysql deadlocks all the time here, so we need to recover - $isth->execute( @param ) or do { + #stupid mysql deadlocks all the time on insert, so we need to recover + unless ( $isth->execute(@param) ) { warn "Error inserting data for $serviceid$dir (restarting): ". $isth->errstr; + dbh->rollback; #or die dbh->errstr; + sleep 5; + next SERVICEID; #MAIN; } } @@ -151,7 +196,7 @@ while (1) { } warn "done with $serviceid\n" if $DEBUG; - } + } #foreach my $torrus_srvderive dbh->commit or die dbh->errstr; myexit() if sigterm() || sigint();