From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 3B86E1F5AE for ; Sat, 18 Jul 2020 06:36:32 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] msgmap: fix atfork_* callbacks Date: Sat, 18 Jul 2020 06:36:32 +0000 Message-Id: <20200718063632.6739-1-e@yhbt.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Noticed while reindexing a largish v2 inbox in parallel on an SSD which required checkpointing and respawning shard workers. Fixes: f06e84220e5566e7 ("over+msgmap: do not store filename after DBI->connect") --- lib/PublicInbox/Msgmap.pm | 17 ++++++++--------- t/msgmap.t | 6 ++++++ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/PublicInbox/Msgmap.pm b/lib/PublicInbox/Msgmap.pm index 38ec7858..9d2ef0dc 100644 --- a/lib/PublicInbox/Msgmap.pm +++ b/lib/PublicInbox/Msgmap.pm @@ -238,22 +238,21 @@ sub DESTROY { sub atfork_parent { my ($self) = @_; - $self->{pid} or die "not a temporary clone\n"; - my $dbh = $self->{dbh} and die "tmp_clone dbh not prepared for parent"; - $self->{filename} = $dbh->sqlite_db_filename; - $dbh = $self->{dbh} = PublicInbox::Over::dbh_new($self, 1); + $self->{pid} or die 'BUG: not a temporary clone'; + $self->{dbh} and die 'BUG: tmp_clone dbh not prepared for parent'; + defined($self->{filename}) or die 'BUG: {filename} not defined'; + my $dbh = $self->{dbh} = PublicInbox::Over::dbh_new($self, 1); $dbh->do('PRAGMA synchronous = OFF'); } sub atfork_prepare { my ($self) = @_; - $self->{pid} or die "not a temporary clone\n"; - $self->{pid} == $$ or - die "BUG: atfork_prepare not called from $self->{pid}\n"; - my $dbh = $self->{dbh} or die "temporary clone not open\n"; + my $pid = $self->{pid} or die 'BUG: not a temporary clone'; + $pid == $$ or die "BUG: atfork_prepare not called by $pid"; + my $dbh = $self->{dbh} or die 'BUG: temporary clone not open'; # must clobber prepared statements - %$self = (filename => $dbh->sqlite_db_filename, pid => $$); + %$self = (filename => $dbh->sqlite_db_filename, pid => $pid); } sub skip_artnum { diff --git a/t/msgmap.t b/t/msgmap.t index f78070cc..1d7d1e87 100644 --- a/t/msgmap.t +++ b/t/msgmap.t @@ -64,4 +64,10 @@ my $tmp = $d->tmp_clone; is_deeply([$d->minmax], [$tmp->minmax], 'Cloned temporary DB matches'); ok($tmp->mid_delete('spam@2'), 'temporary DB is writable'); +is(eval { + $tmp->atfork_prepare; + $tmp->atfork_parent; + 'ok' +}, 'ok', 'atfork_* work on tmp_clone'); + done_testing();