From 87425172fb480214c3f72e0174f4f8f15f48d92d Mon Sep 17 00:00:00 2001 From: "Eric Wong (Contractor, The Linux Foundation)" Date: Mon, 2 Apr 2018 00:04:53 +0000 Subject: [PATCH] v2writable: simplify barrier vs checkpoints searchidx_checkpoint was too convoluted and confusing. Since barrier is mostly the same thing; use that instead and add an fsync option for the overview DB. --- lib/PublicInbox/OverIdxFork.pm | 15 ++++----- lib/PublicInbox/V2Writable.pm | 58 +++++++++++++--------------------- 2 files changed, 28 insertions(+), 45 deletions(-) diff --git a/lib/PublicInbox/OverIdxFork.pm b/lib/PublicInbox/OverIdxFork.pm index f4f7cddd..ec965280 100644 --- a/lib/PublicInbox/OverIdxFork.pm +++ b/lib/PublicInbox/OverIdxFork.pm @@ -135,9 +135,12 @@ sub barrier_init { sub barrier_wait { my ($self) = @_; - my $bw = $self->{barrier_wait} or return; - my $l = $bw->getline; - $l eq "barrier_done\n" or die "bad response from barrier_wait: $l\n"; + if (my $bw = $self->{barrier_wait}) { + my $l = $bw->getline; + $l eq "barrier_done\n" or die "bad response from barrier_wait: $l\n"; + } else { + $self->commit_lazy; + } } sub remote_commit { @@ -174,10 +177,4 @@ sub remote_close { } } -sub commit_fsync { - my ($self) = @_; - return if $self->{w}; # don't bother; main parent can also call this - $self->SUPER::commit_fsync; -} - 1; diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm index 8e3122ab..479e2b5d 100644 --- a/lib/PublicInbox/V2Writable.pm +++ b/lib/PublicInbox/V2Writable.pm @@ -303,24 +303,39 @@ sub purge { sub done { my ($self) = @_; - my $locked = defined $self->{idx_parts}; my $im = delete $self->{im}; $im->done if $im; # PublicInbox::Import::done - $self->searchidx_checkpoint(0); - $self->lock_release if $locked; + + if (my $mm = delete $self->{mm}) { + $mm->{dbh}->commit; + } + + # order matters, we can only close {over} after all partitions + # are done because the partitions also write to {over} + my $parts = delete $self->{idx_parts}; + if ($parts) { + $_->remote_commit for @$parts; + $_->remote_close for @$parts; + } + + my $over = $self->{over}; + $over->remote_commit; + $over->remote_close; + $self->{transact_bytes} = 0; + $self->lock_release if $parts; } sub checkpoint { my ($self) = @_; my $im = $self->{im}; $im->checkpoint if $im; # PublicInbox::Import::checkpoint - $self->searchidx_checkpoint(1); + $self->barrier(1); } # issue a write barrier to ensure all data is visible to other processes # and read-only ops. Order of data importance is: git > SQLite > Xapian sub barrier { - my ($self) = @_; + my ($self, $fsync) = @_; if (my $im = $self->{im}) { $im->barrier; @@ -339,42 +354,13 @@ sub barrier { $_->remote_barrier foreach @$parts; $over->barrier_wait; # wait for each Xapian partition + $over->commit_fsync if $fsync; $dbh->begin_work; } $self->{transact_bytes} = 0; } -sub searchidx_checkpoint { - my ($self, $more) = @_; - - # order matters, we can only close {over} after all partitions - # are done because the partitions also write to {over} - if (my $parts = $self->{idx_parts}) { - foreach my $idx (@$parts) { - $idx->remote_commit; # propagates commit to over - $idx->remote_close unless $more; - } - delete $self->{idx_parts} unless $more; - } - - if (my $mm = $self->{mm}) { - my $dbh = $mm->{dbh}; - $dbh->commit; - if ($more) { - $dbh->begin_work; - } else { - delete $self->{mm}; - } - } - my $over = $self->{over}; - $over->remote_commit; - if (!$more) { - $over->remote_close; - } - $self->{transact_bytes} = 0; -} - sub git_init { my ($self, $new) = @_; my $pfx = "$self->{-inbox}->{mainrepo}/git"; @@ -435,7 +421,7 @@ sub importer { } else { $self->{im} = undef; $im->done; - $self->searchidx_checkpoint(1); + $self->barrier(1); $im = undef; my $git_dir = $self->git_init(++$self->{max_git}); my $git = PublicInbox::Git->new($git_dir); -- 2.44.0