From: Eric Wong Date: Sat, 24 Apr 2021 22:42:59 +0000 (+0000) Subject: lei_saved_search: avoid reentrancy in ->is_dup X-Git-Tag: v1.7.0~751 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=cf2265059f7cc6187fd35bad50fa7febe8facac1;p=public-inbox.git 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. --- 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;