]> Sergey Matveev's repositories - public-inbox.git/commitdiff
extindex: fix w/ Xapian 1.2.21..1.2.24
authorEric Wong <e@yhbt.net>
Sun, 17 Jan 2021 07:09:59 +0000 (07:09 +0000)
committerEric Wong <e@80x24.org>
Mon, 18 Jan 2021 09:25:12 +0000 (09:25 +0000)
Xapian v1.2.21..v1.2.24 failed to set the close-on-exec flag
on the flintlock FD, causing "git cat-file" processes to
hold onto the lock and prevent subsequent Xapian::WritableDatabase
from locking the DB.  So cleanup git processes after committing
the miscidx transaction.

lib/PublicInbox/ExtSearchIdx.pm
lib/PublicInbox/SearchIdx.pm
lib/PublicInbox/V2Writable.pm

index 85959a95c8c81e7534362635b8b0a8a10d0855ae..c782a62a83b6330eda77818e30dea8531d90190d 100644 (file)
@@ -1003,6 +1003,7 @@ sub idx_init { # similar to V2Writable
        $self->with_umask(\&_idx_init, $self, $opt);
        $self->{oidx}->begin_lazy;
        $self->{oidx}->eidx_prep;
+       $self->git->batch_prepare;
        $self->{midx}->begin_txn;
 }
 
index adced0762b41487d5bdaa69517db157901bf3076..7f7b980d96a1efb665db1ebcc8f5c9935cdc0caa 100644 (file)
@@ -105,8 +105,11 @@ sub load_xapian_writable () {
        $DB_CREATE_OR_OPEN = eval($xap.'::DB_CREATE_OR_OPEN()');
        $DB_OPEN = eval($xap.'::DB_OPEN()');
        my $ver = (eval($xap.'::major_version()') << 16) |
-               (eval($xap.'::minor_version()') << 8);
+               (eval($xap.'::minor_version()') << 8) |
+               eval($xap.'::revision()');
        $DB_NO_SYNC = 0x4 if $ver >= 0x10400;
+       # Xapian v1.2.21..v1.2.24 were missing close-on-exec on OFD locks
+       $X->{CLOEXEC_UNSET} = 1 if $ver >= 0x010215 && $ver <= 0x010218;
        1;
 }
 
index 54004fd795c07bc6d3672c29aa1d1d7958517110..0104f87ae421e25960220c5a64d9c5d30c41f136 100644 (file)
@@ -17,6 +17,7 @@ use PublicInbox::InboxWritable;
 use PublicInbox::OverIdx;
 use PublicInbox::Msgmap;
 use PublicInbox::Spawn qw(spawn popen_rd run_die);
+use PublicInbox::Search;
 use PublicInbox::SearchIdx qw(log2stack is_ancestor check_size is_bad_blob);
 use IO::Handle; # ->autoflush
 use File::Temp ();
@@ -608,7 +609,11 @@ shard[$i] bad echo:$echo != $i waiting for txn commit
                }
 
                my $midx = $self->{midx}; # misc index
-               $midx->commit_txn if $midx;
+               if ($midx) {
+                       $midx->commit_txn;
+                       $PublicInbox::Search::X{CLOEXEC_UNSET} and
+                               $self->git->cleanup;
+               }
 
                # last_commit is special, don't commit these until
                # Xapian shards are done:
@@ -618,7 +623,10 @@ shard[$i] bad echo:$echo != $i waiting for txn commit
                        $dbh->commit;
                        $dbh->begin_work;
                }
-               $midx->begin_txn if $midx;
+               if ($midx) {
+                       $self->git->batch_prepare;
+                       $midx->begin_txn;
+               }
        }
        $self->{total_bytes} += $self->{transact_bytes};
        $self->{transact_bytes} = 0;