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 2005/11/01 00:37:21 UTC

svn commit: r329933 - /spamassassin/trunk/masses/corpora/mk-corpus-link-farm

Author: jm
Date: Mon Oct 31 15:37:19 2005
New Revision: 329933

URL: http://svn.apache.org/viewcvs?rev=329933&view=rev
Log:
defer deletion until end of script, to avoid race conditions with multiple parallel mass-checkers

Modified:
    spamassassin/trunk/masses/corpora/mk-corpus-link-farm

Modified: spamassassin/trunk/masses/corpora/mk-corpus-link-farm
URL: http://svn.apache.org/viewcvs/spamassassin/trunk/masses/corpora/mk-corpus-link-farm?rev=329933&r1=329932&r2=329933&view=diff
==============================================================================
--- spamassassin/trunk/masses/corpora/mk-corpus-link-farm (original)
+++ spamassassin/trunk/masses/corpora/mk-corpus-link-farm Mon Oct 31 15:37:19 2005
@@ -95,10 +95,11 @@
 # { dests => [ ], dir => "/src3/spam", num => 500 }, } ];
 
 my $cwd = cwd();
+my $poss_delete = { };
 
 my $mbox_work = "$mbox_tmpdir/mboxes.d";
 if (-d $mbox_work) {
-  rmtree($mbox_work) or warn "cannot rmtree $mbox_work: $!"; 
+  mark_for_poss_deletion($mbox_work);
 }
 
 main();
@@ -109,6 +110,7 @@
   find_srcs();
   dist_across_dests();
   make_links_in_dests();
+  perform_poss_deletion();
 }
 
 
@@ -191,9 +193,11 @@
     foreach my $dest (@$dests) {
       my $dir = $dest->{dir}.'/'.$class;
       if (-d $dir) {
-        rmtree($dir) or warn "cannot rmtree $dir: $!"; 
+        mark_for_poss_deletion($dir);
+      }
+      else {
+        mkpath($dir) or warn "cannot mkdir $dir: $!";
       }
-      mkpath($dir) or warn "cannot mkdir $dir: $!";
     }
     foreach my $src (@$srcs) {
       _mklink($class, $src);
@@ -269,6 +273,9 @@
         $srcname = $cwd.'/'.$srcname;
       }
 
+      if (remove_from_poss_delete($dstname)) {
+        unlink $dstname;
+      }
       if (symlink($srcname, $dstname)) {
         dbg "  $srcname -> $dstname";
       } else {
@@ -299,6 +306,35 @@
     push (@{$src->{$class}{dests}}, { dest => $dest, num => $$nhamref });
     $src->{$class}{num} -= $$nhamref;
     $$nhamref = 0;
+  }
+}
+
+sub mark_for_poss_deletion {
+  my ($dir) = @_;
+
+  File::Find::find(sub {
+      if (-f $_) {
+        my $fname = $File::Find::name;
+        $poss_delete->{$fname} = 1;
+      } else {
+        # TODO: delete dirs?  for now, leave 'em behind
+      }
+    }, $dir);
+}
+
+sub perform_poss_deletion {
+  foreach my $fname (keys %{$poss_delete}) {
+    unlink $fname or warn "cannot unlink $fname";
+  }
+}
+
+sub remove_from_poss_delete {
+  my ($fname) = @_;
+  if (exists $poss_delete->{$fname}) {
+    delete $poss_delete->{$fname};
+    return 1;
+  } else {
+    return 0;
   }
 }