]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LeiStore.pm
lei: use RENAME_NOREPLACE on Linux 3.15+
[public-inbox.git] / lib / PublicInbox / LeiStore.pm
index c45380d1c647af73e12d1029fbd012af8a80adab..f1316229bb3205c9395c345de49d4f89f003561b 100644 (file)
@@ -32,6 +32,7 @@ use POSIX ();
 use IO::Handle (); # ->autoflush
 use Sys::Syslog qw(syslog openlog);
 use Errno qw(EEXIST ENOENT);
+use PublicInbox::Syscall qw(rename_noreplace);
 
 sub new {
        my (undef, $dir, $opt) = @_;
@@ -185,10 +186,7 @@ sub export1_kw_md ($$$$$) {
        my $dst = "$mdir/cur/$bn";
        for my $d (@try) {
                my $src = "$mdir/$d/$orig";
-               if (link($src, $dst)) {
-                       if (!unlink($src) and $! != ENOENT) {
-                               syslog('warning', "unlink($src): $!");
-                       }
+               if (rename_noreplace($src, $dst)) {
                        # TODO: verify oidbin?
                        $self->{lms}->mv_src("maildir:$mdir",
                                        $oidbin, \$orig, $bn);
@@ -196,7 +194,7 @@ sub export1_kw_md ($$$$$) {
                } elsif ($! == EEXIST) { # lost race with "lei export-kw"?
                        return;
                } elsif ($! != ENOENT) {
-                       syslog('warning', "link($src -> $dst): $!");
+                       syslog('warning', "rename_noreplace($src -> $dst): $!");
                }
        }
        for (@try) { return if -e "$mdir/$_/$orig" };
@@ -571,6 +569,12 @@ sub recv_and_run {
        $self->SUPER::recv_and_run(@args);
 }
 
+sub _sto_atexit { # dwaitpid callback
+       my ($args, $pid) = @_;
+       my $self = $args->[0];
+       warn "lei/store PID:$pid died \$?=$?\n" if $?;
+}
+
 sub write_prepare {
        my ($self, $lei) = @_;
        $lei // die 'BUG: $lei not passed';
@@ -587,6 +591,7 @@ sub write_prepare {
                                        -err_wr => $w,
                                        to_close => [ $r ],
                                });
+               $self->wq_wait_async(\&_sto_atexit); # outlives $lei
                require PublicInbox::LeiStoreErr;
                PublicInbox::LeiStoreErr->new($r, $lei);
        }