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: 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/V2Writable.pm | 58 ++++++++++++++++--------------------------- 1 file changed, 22 insertions(+), 36 deletions(-) (limited to 'lib/PublicInbox/V2Writable.pm') 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); -- cgit v1.2.3-24-ge0c7