From fa04201baae9d1043e37cf8ef4e5a33fdd0498ff Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 1 Oct 2022 00:33:15 +0000 Subject: lei: force --jobs=1,1 for SQLite < 3.8.3 SQLite prior to 3.8.3 did not reset its PRNG for generating unique temporary file names, so it would barf on t/lei-up.t occasionally due to O_EXCL -> EEXIST conflicts. This fixes occasional test failures under CentOS 7.x which ships SQLite 3.7.17. --- lib/PublicInbox/LeiQuery.pm | 4 +++- lib/PublicInbox/LeiUp.pm | 5 +++-- lib/PublicInbox/OverIdx.pm | 12 ++++++++++++ 3 files changed, 18 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/PublicInbox/LeiQuery.pm b/lib/PublicInbox/LeiQuery.pm index c998e5c0..df9c32b3 100644 --- a/lib/PublicInbox/LeiQuery.pm +++ b/lib/PublicInbox/LeiQuery.pm @@ -1,4 +1,4 @@ -# Copyright (C) 2021 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ # handles "lei q" command and provides internals for @@ -6,6 +6,7 @@ package PublicInbox::LeiQuery; use strict; use v5.10.1; +use PublicInbox::OverIdx; sub prep_ext { # externals_each callback my ($lxs, $exclude, $loc) = @_; @@ -17,6 +18,7 @@ sub _start_query { # used by "lei q" and "lei up" require PublicInbox::LeiOverview; PublicInbox::LeiOverview->new($self) or return; my $opt = $self->{opt}; + PublicInbox::OverIdx::fork_ok($opt); my ($xj, $mj) = split(/,/, $opt->{jobs} // ''); (defined($xj) && $xj ne '' && $xj !~ /\A[1-9][0-9]*\z/) and die "`$xj' search jobs must be >= 1\n"; diff --git a/lib/PublicInbox/LeiUp.pm b/lib/PublicInbox/LeiUp.pm index b8a98360..5ad21451 100644 --- a/lib/PublicInbox/LeiUp.pm +++ b/lib/PublicInbox/LeiUp.pm @@ -1,4 +1,4 @@ -# Copyright (C) 2021 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ # "lei up" - updates the result of "lei q --save" @@ -7,7 +7,7 @@ use strict; use v5.10.1; # n.b. we use LeiInput to setup IMAP auth use parent qw(PublicInbox::IPC PublicInbox::LeiInput); -use PublicInbox::LeiSavedSearch; +use PublicInbox::LeiSavedSearch; # OverIdx use PublicInbox::DS; use PublicInbox::PktOp; use PublicInbox::LeiFinmsg; @@ -75,6 +75,7 @@ sub redispatch_all ($$) { my $upq = [ (@{$self->{o_local} // []}, @{$self->{o_remote} // []}) ]; return up1($lei, $upq->[0]) if @$upq == 1; # just one, may start MUA + PublicInbox::OverIdx::fork_ok($lei->{opt}); # FIXME: this is also used per-query, see lei->_start_query my $j = $lei->{opt}->{jobs} || do { my $n = $self->detect_nproc // 1; diff --git a/lib/PublicInbox/OverIdx.pm b/lib/PublicInbox/OverIdx.pm index e7c96e14..a49ca6db 100644 --- a/lib/PublicInbox/OverIdx.pm +++ b/lib/PublicInbox/OverIdx.pm @@ -670,4 +670,16 @@ sub vivify_xvmd { $smsg->{-vivify_xvmd} = \@vivify_xvmd; } +sub fork_ok { + return 1 if $DBD::SQLite::sqlite_version >= 3008003; + my ($opt) = @_; + my @j = split(/,/, $opt->{jobs} // ''); + state $warned; + grep { $_ > 1 } @j and $warned //= warn('DBD::SQLite version is ', + $DBD::SQLite::sqlite_version, + ", need >= 3008003 (3.8.3) for --jobs > 1\n"); + $opt->{jobs} = '1,1'; + undef; +} + 1; -- cgit v1.2.3-24-ge0c7