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: AS43350 77.247.176.0/21 X-Spam-Status: No, score=-3.3 required=3.0 tests=AWL,BAYES_00, RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_ZBI,RCVD_IN_XBL,SPF_FAIL,SPF_HELO_FAIL, TO_EQ_FM_DOM_SPF_FAIL shortcircuit=no autolearn=no autolearn_force=no version=3.4.0 Received: from 80x24.org (chomsky.torservers.net [77.247.181.162]) by dcvr.yhbt.net (Postfix) with ESMTP id D10812018E for ; Fri, 5 Aug 2016 22:07:27 +0000 (UTC) From: Eric Wong To: spew@80x24.org Subject: [PATCH] search: disable batching in newer versions of Xapian, for now Date: Fri, 5 Aug 2016 22:07:25 +0000 Message-Id: <20160805220725.20416-1-e@80x24.org> List-Id: This warrants further investigation, but it appears we cannot release Xapian reliably after forking "git log" due to the lack of a close-on-exec flag on the Xapian flintlock FD --- lib/PublicInbox/SearchIdx.pm | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm index f8249c5..a69428a 100644 --- a/lib/PublicInbox/SearchIdx.pm +++ b/lib/PublicInbox/SearchIdx.pm @@ -28,6 +28,12 @@ use constant { PERM_EVERYBODY => 0664, }; +# XXX temporary hack... +my $xap_ver = ((Search::Xapian::major_version << 16) | + (Search::Xapian::minor_version << 8 ) | + Search::Xapian::revision()); +our $XAP_LOCK_BROKEN = $xap_ver >= 0x010216; # >= 1.2.22 + sub new { my ($class, $git_dir, $writable) = @_; my $dir = PublicInbox::Search->xdir($git_dir); @@ -42,7 +48,7 @@ sub new { if ($writable == 1) { require File::Path; File::Path::mkpath($dir); - $self->{batch_size} = 100; + $self->{batch_size} = 100 unless $XAP_LOCK_BROKEN; $flag = Search::Xapian::DB_CREATE_OR_OPEN; _lock_acquire($self); } @@ -56,16 +62,14 @@ sub _xdb_release { my $xdb = delete $self->{xdb}; $xdb->commit_transaction; $xdb->close; - _lock_release($self); } sub _xdb_acquire { - my ($self) = @_; - _lock_acquire($self); + my ($self, $more) = @_; my $dir = PublicInbox::Search->xdir($self->{git_dir}); my $flag = Search::Xapian::DB_OPEN; my $xdb = Search::Xapian::WritableDatabase->new($dir, $flag); - $xdb->begin_transaction; + $xdb->begin_transaction if $more; $self->{xdb} = $xdb; } @@ -399,10 +403,19 @@ sub _index_sync { $mm->last_commit($commit) if $commit; $dbh->commit; } - _xdb_release($self); + if ($XAP_LOCK_BROKEN) { + $xdb->commit_transaction if !$more; + } else { + $xdb = undef; + _xdb_release($self); + _lock_release($self); + } # let another process do some work... - $dbh->begin_work if $dbh && $more; - $xdb = _xdb_acquire($self); + if (!$XAP_LOCK_BROKEN) { + _lock_acquire($self); + $dbh->begin_work if $dbh && $more; + $xdb = _xdb_acquire($self, $more); + } }; my $range = $lx eq '' ? $tip : "$lx..$tip"; -- 2.8.1