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;