]> Sergey Matveev's repositories - public-inbox.git/commitdiff
v2writable: simplify barrier vs checkpoints
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>
Mon, 2 Apr 2018 00:04:53 +0000 (00:04 +0000)
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>
Mon, 2 Apr 2018 00:05:40 +0000 (00:05 +0000)
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
lib/PublicInbox/V2Writable.pm

index f4f7cddd3dad99bf569b34b657acc8831b357aef..ec965280b1a09761ffffddf92e9ee329e6773f8a 100644 (file)
@@ -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;
index 8e3122abba155e6cd20b7bcd084b4b5665b0053d..479e2b5daafbd25c0868a0a762fea6edee65a794 100644 (file)
@@ -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);