diff options
author | Eric Wong <e@80x24.org> | 2021-04-24 22:42:59 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2021-04-24 19:00:41 -0400 |
commit | cf2265059f7cc6187fd35bad50fa7febe8facac1 (patch) | |
tree | 61a0716cd1b2a7a1431fe6494ef620d912cbbf63 /lib/PublicInbox/LeiSavedSearch.pm | |
parent | b437cc7f5ad2712d9064c691c5946be80a73eedb (diff) | |
download | public-inbox-cf2265059f7cc6187fd35bad50fa7febe8facac1.tar.gz |
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.
Diffstat (limited to 'lib/PublicInbox/LeiSavedSearch.pm')
-rw-r--r-- | lib/PublicInbox/LeiSavedSearch.pm | 7 |
1 files changed, 5 insertions, 2 deletions
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; |