about summary refs log tree commit homepage
path: root/lib/PublicInbox/Import.pm
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/PublicInbox/Import.pm
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/PublicInbox/Import.pm')
-rw-r--r--lib/PublicInbox/Import.pm58
1 files changed, 37 insertions, 21 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: $!";