From 2d9a41bf4f3ecddda07128711c41c3eb3411246b Mon Sep 17 00:00:00 2001 From: "Eric Wong (Contractor, The Linux Foundation)" Date: Mon, 19 Mar 2018 08:14:43 +0000 Subject: import: implement barrier operation for v1 repos 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 | 58 ++++++++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 21 deletions(-) (limited to 'lib/PublicInbox/Import.pm') 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: $!"; -- cgit v1.2.3-24-ge0c7