about summary refs log tree commit homepage
path: root/lib/PublicInbox/V2Writable.pm
diff options
context:
space:
mode:
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-04-02 00:04:53 +0000
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-04-02 00:05:40 +0000
commit87425172fb480214c3f72e0174f4f8f15f48d92d (patch)
treea202bc415b37eba1613d23e7b65faef471e1f3af /lib/PublicInbox/V2Writable.pm
parent35ff6bb106909b1c1232666a9792156dfa398ea8 (diff)
downloadpublic-inbox-87425172fb480214c3f72e0174f4f8f15f48d92d.tar.gz
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.
Diffstat (limited to 'lib/PublicInbox/V2Writable.pm')
-rw-r--r--lib/PublicInbox/V2Writable.pm58
1 files changed, 22 insertions, 36 deletions
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);