You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by jm...@apache.org on 2008/01/11 00:06:58 UTC
svn commit: r610979 -
/spamassassin/trunk/lib/Mail/SpamAssassin/DBBasedAddrList.pm
Author: jm
Date: Thu Jan 10 15:06:57 2008
New Revision: 610979
URL: http://svn.apache.org/viewvc?rev=610979&view=rev
Log:
bug 5731: add a timeout to the DB_File tie() call; let's see if this avoids the DB_File hangs
Modified:
spamassassin/trunk/lib/Mail/SpamAssassin/DBBasedAddrList.pm
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/DBBasedAddrList.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/DBBasedAddrList.pm?rev=610979&r1=610978&r2=610979&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/DBBasedAddrList.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/DBBasedAddrList.pm Thu Jan 10 15:06:57 2008
@@ -26,6 +26,7 @@
use Mail::SpamAssassin::PersistentAddrList;
use Mail::SpamAssassin::Util;
use Mail::SpamAssassin::Logger;
+use Mail::SpamAssassin::Timeout;
use vars qw{
@ISA
@@ -83,13 +84,22 @@
dbg("auto-whitelist: tie-ing to DB file of type $dbm_module $mod1 in $path");
- ($self->{is_locked} && $dbm_module eq 'DB_File') and
- Mail::SpamAssassin::Util::avoid_db_file_locking_bug ($path);
+ # bug 5731: something in DB_File appears to hang on tie() on gutsy
+ my $timer = Mail::SpamAssassin::Timeout->new({ secs => 60 });
+ my $tied = $timer->run_and_catch(sub {
+
+ ($self->{is_locked} && $dbm_module eq 'DB_File') and
+ Mail::SpamAssassin::Util::avoid_db_file_locking_bug ($path);
+
+ return tie %{ $self->{accum} }, $dbm_module, $path, $mod2,
+ oct($main->{conf}->{auto_whitelist_file_mode});
+ });
- if (! tie %{ $self->{accum} }, $dbm_module, $path, $mod2,
- oct($main->{conf}->{auto_whitelist_file_mode}) )
- {
+ if ($timer->timed_out() || !$tied) {
my $err = $!; # might get overwritten later
+
+ if ($timer->timed_out()) { $err = "timed out"; }
+
if ($self->{is_locked}) {
$self->{main}->{locker}->safe_unlock($self->{locked_file});
$self->{is_locked} = 0;