about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-03-30 12:23:54 +0500
committerEric Wong <e@80x24.org>2021-03-30 09:00:51 +0000
commit5565abd5ca88deec5cf505d2fb75ad5bac54bbcf (patch)
tree0fd7798032dfbbdae5f05e08f9187fcd7cec80e3
parent9d08d49c68541babf0e618b20f5a1cd11c7c256e (diff)
downloadpublic-inbox-5565abd5ca88deec5cf505d2fb75ad5bac54bbcf.tar.gz
Note that update_kw_maybe is critical in preventing accidental
data loss with default "lei q --output" behavior.

Also avoid treating (proposed) MH support as lock-free, since
appears to lack specifications for locking and be even worse
than mbox* in that regard...
-rw-r--r--lib/PublicInbox/LeiToMail.pm25
1 files changed, 13 insertions, 12 deletions
diff --git a/lib/PublicInbox/LeiToMail.pm b/lib/PublicInbox/LeiToMail.pm
index 847e5cb9..4c33c752 100644
--- a/lib/PublicInbox/LeiToMail.pm
+++ b/lib/PublicInbox/LeiToMail.pm
@@ -227,24 +227,25 @@ sub _mbox_write_cb ($$) {
 sub update_kw_maybe ($$$$) {
         my ($lei, $lse, $eml, $kw) = @_;
         return unless $lse;
-        my $x = $lse->kw_changed($eml, $kw);
+        my $lse_oids = $lse->kw_changed($eml, $kw);
         my $vmd = { kw => $kw };
-        if ($x) {
+        if ($lse_oids) { # already in lei/store
+                $lei->{sto}->ipc_do('set_eml', $eml, $vmd);
+        } elsif (my $xoids = $lei->{ale}->xoids_for($eml)) {
+                # it's in an external, only set kw, here
+                $lei->{sto}->ipc_do('set_xvmd', $xoids, $eml, $vmd);
+        } else { # never-before-seen, import the whole thing
+                # XXX this is critical in protecting against accidental
+                # data loss without --augment
                 $lei->{sto}->ipc_do('set_eml', $eml, $vmd);
-        } elsif (!defined($x)) {
-                if (my $xoids = $lei->{ale}->xoids_for($eml)) {
-                        $lei->{sto}->ipc_do('set_xvmd', $xoids, $eml, $vmd);
-                } else {
-                        $lei->{sto}->ipc_do('set_eml', $eml, $vmd);
-                }
         }
 }
 
 sub _augment_or_unlink { # maildir_each_eml cb
         my ($f, $kw, $eml, $lei, $lse, $mod, $shard, $unlink) = @_;
         if ($mod) {
-                # can't get dirent.d_ino w/ pure Perl, so we extract the OID
-                # if it looks like one:
+                # can't get dirent.d_ino w/ pure Perl readdir, so we extract
+                # the OID if it looks like one instead of doing stat(2)
                 my $hex = $f =~ m!\b([a-f0-9]{40,})[^/]*\z! ?
                                 $1 : sha256_hex($f);
                 my $recno = hex(substr($hex, 0, 8));
@@ -564,7 +565,7 @@ sub do_post_auth {
                 my $shard = $self->{-wq_worker_nr};
                 if (my $net = $lei->{net}) {
                         $net->{shard_info} = [ $mod, $shard ];
-                } else { # Maildir (MH?)
+                } else { # Maildir
                         $self->{shard_info} = [ $mod, $shard ];
                 }
                 $aug = '+'; # incr_post_augment
@@ -595,7 +596,7 @@ sub ipc_atfork_child {
 }
 
 sub lock_free {
-        $_[0]->{base_type} =~ /\A(?:maildir|mh|imap|jmap)\z/ ? 1 : 0;
+        $_[0]->{base_type} =~ /\A(?:maildir|imap|jmap)\z/ ? 1 : 0;
 }
 
 sub poke_dst {