Eric Wong <[email protected]> wrote:
> I'm still trying to figure out why OverIdx->adj_counter (via
> next_tid) in the LeiSavedSearch dedupe check occasionally fails
> under CentOS 7.x (but not other systems).

CentOS 7.x ships SQLite 3.7.17, and SQLite prior to 3.8.3 (2014-02-03)
didn't reset its PRNG for generating temporary filenames upon fork.

I can't find a way reset that PRNG via DBD::SQLite, either...

One possible nasty thing I could do is reset TMPDIR upon fork,
but that may leave bugs lingering, too :<

Here's the debugging patch I used to strace what was going on:
(I may just make lei_ok bail out on error...)

diff --git a/lib/PublicInbox/OverIdx.pm b/lib/PublicInbox/OverIdx.pm
index e7c96e14..e1af910c 100644
--- a/lib/PublicInbox/OverIdx.pm
+++ b/lib/PublicInbox/OverIdx.pm
@@ -51,10 +51,22 @@ SELECT val FROM counter WHERE key = ? LIMIT 1
 sub adj_counter ($$$) {
        my ($self, $key, $op) = @_;
        my $dbh = $self->{dbh};
+use PublicInbox::Spawn qw(spawn);
+my $trace = "/tmp/$$.strace";
+open my $err, '>>', $trace;
+my $pid = spawn([qw(strace -f -s4096 -v -p), $$], undef, { 2 => $err });
+select undef, undef, undef, 0.1; 
+
        my $sth = $dbh->prepare_cached(<<"");
 UPDATE counter SET val = val $op 1 WHERE key = ?
 
-       $sth->execute($key);
+       eval { $sth->execute($key) };
+my $err = $@;
+syswrite(STDERR, "$$ $err\n") if $err;
+kill('TERM', $pid);
+waitpid($pid, 0);
+die $err if $err;
+#unlink($trace);
 
        get_counter($dbh, $key);
 }
diff --git a/t/lei-up.t b/t/lei-up.t
index baed6507..9c65a243 100644
--- a/t/lei-up.t
+++ b/t/lei-up.t
@@ -27,7 +27,7 @@ test_lei(sub {
        lei_ok qw(ls-search);
        $s = eml_load('t/utf8.eml')->as_string;
        lei_ok [qw(import -q -F eml -)], undef, { 0 => \$s, %$lei_opt };
-       lei_ok qw(up --all=local);
+       lei_ok qw(up --all=local) or xbail "lei up --all=local failed $?";
 
        gunzip("$home/a.mbox.gz" => \$uc, MultiStream => 1) or
                 xbail "gunzip $GunzipError";

Reply via email to