about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-03-19 08:14:43 +0000
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>2018-03-19 08:16:34 +0000
commit2d9a41bf4f3ecddda07128711c41c3eb3411246b (patch)
tree3f201696e186d8a51cdf90bf7a9ca87c931873d3 /lib
parentbafd4084d8e78ef48205e6ce573f1bbe52a669a8 (diff)
downloadpublic-inbox-2d9a41bf4f3ecddda07128711c41c3eb3411246b.tar.gz
This will allow WatchMaildir to use ->barrier operations instead
of reaching inside for nchg.  This also ensures dumb HTTP
clients can see changes to V2 repos immediately.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/Import.pm58
-rw-r--r--lib/PublicInbox/V2Writable.pm7
-rw-r--r--lib/PublicInbox/WatchMaildir.pm2
3 files changed, 39 insertions, 28 deletions
diff --git a/lib/PublicInbox/Import.pm b/lib/PublicInbox/Import.pm
index 6a640e23..12df7d59 100644
--- a/lib/PublicInbox/Import.pm
+++ b/lib/PublicInbox/Import.pm
@@ -148,6 +148,42 @@ sub progress {
         undef;
 }
 
+sub _update_git_info ($$) {
+        my ($self, $do_gc) = @_;
+        # for compatibility with existing ssoma installations
+        # we can probably remove this entirely by 2020
+        my $git_dir = $self->{git}->{git_dir};
+        my @cmd = ('git', "--git-dir=$git_dir");
+        my $index = "$git_dir/ssoma.index";
+        if (-e $index && !$ENV{FAST}) {
+                my $env = { GIT_INDEX_FILE => $index };
+                run_die([@cmd, qw(read-tree -m -v -i), $self->{ref}], $env);
+        }
+        run_die([@cmd, 'update-server-info'], undef);
+        ($self->{path_type} eq '2/38') and eval {
+                require PublicInbox::SearchIdx;
+                my $inbox = $self->{inbox} || $git_dir;
+                my $s = PublicInbox::SearchIdx->new($inbox);
+                $s->index_sync({ ref => $self->{ref} });
+        };
+        eval { run_die([@cmd, qw(gc --auto)], undef) } if $do_gc;
+}
+
+sub barrier {
+        my ($self) = @_;
+
+        # For safety, we ensure git checkpoint is complete before because
+        # the data in git is still more important than what is in Xapian
+        # in v2.  Performance may be gained by delaying the ->progress
+        # call but we lose safety
+        if ($self->{nchg}) {
+                $self->checkpoint;
+                $self->progress('checkpoint');
+                _update_git_info($self, 0);
+                $self->{nchg} = 0;
+        }
+}
+
 # used for v2
 sub get_mark {
         my ($self, $mark) = @_;
@@ -341,28 +377,8 @@ sub done {
         my $pid = delete $self->{pid} or die 'BUG: missing {pid} when done';
         waitpid($pid, 0) == $pid or die 'fast-import did not finish';
         $? == 0 or die "fast-import failed: $?";
-        my $nchg = delete $self->{nchg};
 
-        # for compatibility with existing ssoma installations
-        # we can probably remove this entirely by 2020
-        my $git_dir = $self->{git}->{git_dir};
-        my @cmd = ('git', "--git-dir=$git_dir");
-        my $index = "$git_dir/ssoma.index";
-        if ($nchg && -e $index && !$ENV{FAST}) {
-                my $env = { GIT_INDEX_FILE => $index };
-                run_die([@cmd, qw(read-tree -m -v -i), $self->{ref}], $env);
-        }
-        if ($nchg) {
-                run_die([@cmd, 'update-server-info'], undef);
-                ($self->{path_type} eq '2/38') and eval {
-                        require PublicInbox::SearchIdx;
-                        my $inbox = $self->{inbox} || $git_dir;
-                        my $s = PublicInbox::SearchIdx->new($inbox);
-                        $s->index_sync({ ref => $self->{ref} });
-                };
-
-                eval { run_die([@cmd, qw(gc --auto)], undef) };
-        }
+        _update_git_info($self, 1) if delete $self->{nchg};
 
         $self->{ssoma_lock} or return;
         my $lockfh = delete $self->{lockfh} or die "BUG: not locked: $!";
diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm
index fd9bf615..fbc71c89 100644
--- a/lib/PublicInbox/V2Writable.pm
+++ b/lib/PublicInbox/V2Writable.pm
@@ -263,13 +263,8 @@ sub checkpoint {
 sub barrier {
         my ($self) = @_;
 
-        # For safety, we ensure git checkpoint is complete before because
-        # the data in git is still more important than what is in Xapian.
-        # Performance may be gained by delaying ->progress call but we
-        # lose safety
         if (my $im = $self->{im}) {
-                $im->checkpoint;
-                $im->progress('checkpoint');
+                $im->barrier;
         }
         my $skel = $self->{skel};
         my $parts = $self->{idx_parts};
diff --git a/lib/PublicInbox/WatchMaildir.pm b/lib/PublicInbox/WatchMaildir.pm
index 3da6b276..c72d9396 100644
--- a/lib/PublicInbox/WatchMaildir.pm
+++ b/lib/PublicInbox/WatchMaildir.pm
@@ -91,7 +91,7 @@ sub _done_for_now {
         my ($self) = @_;
         my $importers = $self->{importers};
         foreach my $im (values %$importers) {
-                $im->done if $im->{nchg};
+                $im->barrier;
         }
 
         my $opendirs = $self->{opendirs};