Mailing List Archive

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;
}
}