You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by mm...@apache.org on 2013/06/19 01:20:40 UTC

svn commit: r1494371 - /spamassassin/trunk/lib/Mail/SpamAssassin/BayesStore/Redis.pm

Author: mmartinec
Date: Tue Jun 18 23:20:40 2013
New Revision: 1494371

URL: http://svn.apache.org/r1494371
Log:
Bug 6942 - Redis bayes storage module - robustness: treat as disconnected on failure;  get_storage_variables: only fetch variables which are actually needed

Modified:
    spamassassin/trunk/lib/Mail/SpamAssassin/BayesStore/Redis.pm

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/BayesStore/Redis.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/BayesStore/Redis.pm?rev=1494371&r1=1494370&r2=1494371&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/BayesStore/Redis.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/BayesStore/Redis.pm Tue Jun 18 23:20:40 2013
@@ -315,6 +315,7 @@ sub _open_db {
   }
   elsif ($err) {
     $err =~ s{ at /.*}{}s; # skip full trace
+    $self->{is_really_open} = 0;
     warn("bayes: Redis connection failed: $err");
     return 0;
   }
@@ -498,14 +499,14 @@ Only 1,2,6 are used with Redis, others r
 =cut
 
 sub get_storage_variables {
-  my($self) = @_;
+  my($self, @varnames) = @_;
 
-  my @tokens = map {"v:$_"}
-               qw{LAST_JOURNAL_SYNC NSPAM NHAM NTOKENS LAST_EXPIRE
-                  OLDEST_TOKEN_AGE DB_VERSION LAST_JOURNAL_SYNC
-                  LAST_ATIME_DELTA LAST_EXPIRE_REDUCE NEWEST_TOKEN_AGE
-                  TOKEN_FORMAT};
-  my $values = $self->_mget(\@tokens);
+  @varnames = qw{LAST_JOURNAL_SYNC NSPAM NHAM NTOKENS LAST_EXPIRE
+                 OLDEST_TOKEN_AGE DB_VERSION LAST_JOURNAL_SYNC
+                 LAST_ATIME_DELTA LAST_EXPIRE_REDUCE NEWEST_TOKEN_AGE
+                 TOKEN_FORMAT}  if !@varnames;
+  @varnames = map("v:$_", @varnames);
+  my $values = $self->_mget(\@varnames);
   return if !$values;
   return map(defined $_ ? $_ : 0, @$values);
 }
@@ -737,8 +738,9 @@ ham learned.
 sub nspam_nham_get {
   my($self) = @_;
 
-  my @vars = $self->get_storage_variables();
-  ($vars[1], $vars[2]);
+  my @vars = $self->get_storage_variables('NSPAM', 'NHAM');
+  dbg("bayes: nspam_nham_get nspam=%s, nham=%s", @vars);
+  @vars;
 }
 
 =head2 nspam_nham_change
@@ -766,6 +768,7 @@ sub nspam_nham_change {
   }
   elsif ($err) {
     $err =~ s{ at /.*}{}s; # skip full trace
+    $self->{is_really_open} = 0;
     die("bayes: failed to increment nspam $ds nham $dh: $err");
   }
 
@@ -925,8 +928,8 @@ sub backup_database {
   return 0 unless $self->tie_db_writable;
 
   my $atime = time;
-  my @vars = $self->get_storage_variables;
-  print "v\t$vars[6]\tdb_version # this must be the first line!!!\n";
+  my @vars = $self->get_storage_variables(qw(DB_VERSION NSPAM NHAM));
+  print "v\t$vars[0]\tdb_version # this must be the first line!!!\n";
   print "v\t$vars[1]\tnum_spam\n";
   print "v\t$vars[2]\tnum_nonspam\n";
 
@@ -1251,6 +1254,7 @@ sub _get {
   }
   elsif ($err) {
     $err =~ s{ at /.*}{}s; # skip full trace
+    $self->{is_really_open} = 0;
     die("bayes: get failed: $err");
   }
 
@@ -1271,6 +1275,7 @@ sub _mget {
   }
   elsif ($err) {
     $err =~ s{ at /.*}{}s; # skip full trace
+    $self->{is_really_open} = 0;
     die("bayes: mget failed: $err");
   }
 
@@ -1290,6 +1295,7 @@ sub _hmget {
   }
   elsif ($err) {
     $err =~ s{ at /.*}{}s; # skip full trace
+    $self->{is_really_open} = 0;
     die("bayes: hmget failed: $err");
   }
 
@@ -1312,6 +1318,7 @@ sub _set {
   }
   elsif ($err) {
     $err =~ s{ at /.*}{}s; # skip full trace
+    $self->{is_really_open} = 0;
     die("bayes: set failed: $err");
   }
 
@@ -1330,6 +1337,7 @@ sub _hincrby {
   }
   elsif ($err) {
     $err =~ s{ at /.*}{}s; # skip full trace
+    $self->{is_really_open} = 0;
     die("bayes: hincrby failed: $err");
   }
 
@@ -1400,6 +1408,7 @@ sub _wait_all_responses {
   }
   elsif ($err) {
     $err =~ s{ at /.*}{}s; # skip full trace
+    $self->{is_really_open} = 0;
     die sprintf("bayes: wait_all_responses failed: %s, called from line %s\n",
                 $err, (caller)[2]);
   }
@@ -1419,6 +1428,7 @@ sub _del {
   }
   elsif ($err) {
     $err =~ s{ at /.*}{}s; # skip full trace
+    $self->{is_really_open} = 0;
     die("bayes: del failed: $err");
   }