]> Sergey Matveev's repositories - public-inbox.git/commitdiff
searchidx: do not release Xapian lock while (only) Msgmap is indexing
authorEric Wong <e@80x24.org>
Sun, 14 Aug 2016 10:21:08 +0000 (10:21 +0000)
committerEric Wong <e@80x24.org>
Sun, 14 Aug 2016 10:22:39 +0000 (10:22 +0000)
SQLite might index quickly, so we hold the lock used by Xapian
for the duration.  This probably needs to be reworked entirely,
actually.

lib/PublicInbox/SearchIdx.pm

index 0eb07a1c12f93a29010bc9a81fd3a355cd5cccd9..f8155ecc0f916a8733ce96cca50686882112bef4 100644 (file)
@@ -436,19 +436,24 @@ sub _index_sync {
 
        my $mm = _msgmap_init($self);
        my $dbh = $mm->{dbh} if $mm;
+       my $mm_only;
        my $cb = sub {
                my ($commit, $more) = @_;
                if ($dbh) {
                        $mm->last_commit($commit) if $commit;
                        $dbh->commit;
                }
-               $xdb->set_metadata($mkey, $commit) if $mkey && $commit;
-               $xdb->commit_transaction;
-               $xdb = _xdb_release($self);
+               if (!$mm_only) {
+                       $xdb->set_metadata($mkey, $commit) if $mkey && $commit;
+                       $xdb->commit_transaction;
+                       $xdb = _xdb_release($self);
+               }
                # let another process do some work... <
                if ($more) {
-                       $xdb = _xdb_acquire($self);
-                       $xdb->begin_transaction;
+                       if (!$mm_only) {
+                               $xdb = _xdb_acquire($self);
+                               $xdb->begin_transaction;
+                       }
                        $dbh->begin_work if $dbh;
                }
        };
@@ -472,14 +477,13 @@ sub _index_sync {
                        my $mkey_prev = $mkey;
                        $mkey = undef; # ignore xapian, for now
                        my $mlog = _git_log($self, $r);
+                       $mm_only = 1;
                        rlog($self, $mlog, *index_mm, *unindex_mm, $cb);
-                       $mlog = undef;
+                       $mm_only = $mlog = undef;
 
                        # now deal with Xapian
                        $mkey = $mkey_prev;
                        $dbh = undef;
-                       $xdb = _xdb_acquire($self);
-                       $xdb->begin_transaction;
                        rlog($self, $xlog, *index_mm2, *unindex_mm2, $cb);
                }
        } else {