From cf2265059f7cc6187fd35bad50fa7febe8facac1 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 24 Apr 2021 22:42:59 +0000 Subject: lei_saved_search: avoid reentrancy in ->is_dup Use a separate git process when calling xoids_for to prevent reentrancy in ->is_dup. Reentrancy happens since LeiToMail will call ->is_dup when inside callbacks when writing mail. This fixes --dedupe=mid test failures in t/lei-q-save.t I could only reproduce this consistently on a uniprocessor VM. "schedtool -a 0x1 -e ..." could not reproduce the problem on 2 and 4-core systems. --- lib/PublicInbox/LeiSavedSearch.pm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'lib/PublicInbox') diff --git a/lib/PublicInbox/LeiSavedSearch.pm b/lib/PublicInbox/LeiSavedSearch.pm index af864a50..682a43e8 100644 --- a/lib/PublicInbox/LeiSavedSearch.pm +++ b/lib/PublicInbox/LeiSavedSearch.pm @@ -6,6 +6,7 @@ package PublicInbox::LeiSavedSearch; use strict; use v5.10.1; use parent qw(PublicInbox::Lock); +use PublicInbox::Git; use PublicInbox::OverIdx; use PublicInbox::LeiSearch; use PublicInbox::Config; @@ -224,11 +225,13 @@ sub prepare_dedupe { sub over { $_[0]->{oidx} } # for xoids_for -sub git { $_[0]->{ale}->git } +# don't use ale->git directly since is_dup is called inside +# ale->git->cat_async callbacks +sub git { $_[0]->{git} //= PublicInbox::Git->new($_[0]->{ale}->git->{git_dir}) } sub pause_dedupe { my ($self) = @_; - $self->{ale}->git->cleanup; + git($self)->cleanup; my $lockfh = delete $self->{lockfh}; # from lock_for_scope_fast; my $oidx = delete($self->{oidx}) // return; $oidx->commit_lazy; -- cgit v1.2.3-24-ge0c7