From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 082112018E; Tue, 9 Aug 2016 00:48:45 +0000 (UTC) Date: Tue, 9 Aug 2016 00:48:45 +0000 From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 4/3] searchidx: avoid holding Xapian lock in cat-file Message-ID: <20160809004845.GA3383@whir> References: <20160809002252.31177-1-e@80x24.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20160809002252.31177-1-e@80x24.org> List-Id: We must ensure cat-file process is launched before Xapian grabs lock, too. Our use of "git cat-file --batch" has the same problem as "git log" did, (which was fixed in commit 3713c727cda431a0dc2865a7878c13ecf9f21851) "searchidx: release Xapian FDs before spawning git log" --- lib/PublicInbox/Git.pm | 4 +++- lib/PublicInbox/SearchIdx.pm | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm index f47bc43..59c2747 100644 --- a/lib/PublicInbox/Git.pm +++ b/lib/PublicInbox/Git.pm @@ -39,7 +39,7 @@ sub _bidi_pipe { sub cat_file { my ($self, $obj, $ref) = @_; - $self->_bidi_pipe(qw(--batch in out pid)); + batch_prepare($self); $self->{out}->print($obj, "\n") or fail($self, "write error: $!"); my $in = $self->{in}; @@ -89,6 +89,8 @@ sub cat_file { $rv; } +sub batch_prepare ($) { _bidi_pipe($_[0], qw(--batch in out pid)) } + sub check { my ($self, $obj) = @_; $self->_bidi_pipe(qw(--batch-check in_c out_c pid_c)); diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm index 6efc1f3..0582526 100644 --- a/lib/PublicInbox/SearchIdx.pm +++ b/lib/PublicInbox/SearchIdx.pm @@ -390,6 +390,7 @@ sub _index_sync { my $tip = $opts->{ref} || 'HEAD'; my $reindex = $opts->{reindex}; my ($mkey, $last_commit, $lx, $xlog); + $self->{git}->batch_prepare; my $xdb = _xdb_acquire($self); $xdb->begin_transaction; do { -- EW