]> Sergey Matveev's repositories - public-inbox.git/commitdiff
import: implement barrier operation for v1 repos
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>
Mon, 19 Mar 2018 08:14:43 +0000 (08:14 +0000)
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>
Mon, 19 Mar 2018 08:16:34 +0000 (08:16 +0000)
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.

lib/PublicInbox/Import.pm
lib/PublicInbox/V2Writable.pm
lib/PublicInbox/WatchMaildir.pm

index 6a640e2360674fce2491f76b21c0ea6ec39c735d..12df7d598fc71d38088d4aeaebd0ed6d8ed3e37d 100644 (file)
@@ -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: $!";
index fd9bf615c66da24d88abd7bf2b091cd561dbf85a..fbc71c89584c5accb9497606728bdcde3b2fd289 100644 (file)
@@ -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};
index 3da6b276ffa13b5e5e1e3d39e81d81ba43607b11..c72d93962481f2a34384573e2d43ecd709eeeb90 100644 (file)
@@ -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};