X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FLeiMirror.pm;h=fca11ccff037cae4d5b1f4b37e609c36733629fa;hb=de39bfcb19571f5c723c03d35a26a7af2e03d993;hp=c83386c61ff4717b9f90b63607818d859639a8e2;hpb=700f2675366ce6cf2cd39a00b5742ba6fea753e9;p=public-inbox.git diff --git a/lib/PublicInbox/LeiMirror.pm b/lib/PublicInbox/LeiMirror.pm index c83386c6..fca11ccf 100644 --- a/lib/PublicInbox/LeiMirror.pm +++ b/lib/PublicInbox/LeiMirror.pm @@ -24,9 +24,9 @@ sub do_finish_mirror { # dwaitpid callback $lei->dclose; } -sub mirror_done { # EOF callback for main daemon +sub _lei_wq_eof { # EOF callback for main daemon my ($lei) = @_; - my $mrr = delete $lei->{mrr} or return; + my $mrr = delete $lei->{wq1} or return $lei->fail; $mrr->wq_wait_old(\&do_finish_mirror, $lei); } @@ -110,7 +110,7 @@ sub _try_config { } return $lei->err("# @$cmd failed (non-fatal)") if $cerr; rename($f, $ce) or return $lei->err("link($f, $ce): $! (non-fatal)"); - my $cfg = PublicInbox::Config::git_config_dump($f); + my $cfg = PublicInbox::Config->git_config_dump($f); my $ibx = $self->{ibx} = {}; for my $sec (grep(/\Apublicinbox\./, @{$cfg->{-section_order}})) { for (qw(address newsgroup nntpmirror)) { @@ -200,6 +200,19 @@ failed to extract epoch number from $src index_cloned_inbox($self, 2); } +# PSGI mount prefixes and manifest.js.gz prefixes don't always align... +sub deduce_epochs ($$) { + my ($m, $path) = @_; + my ($v1_bare, @v2_epochs); + my $path_pfx = ''; + do { + $v1_bare = $m->{$path}; + @v2_epochs = grep(m!\A\Q$path\E/git/[0-9]+\.git\z!, keys %$m); + } while (!defined($v1_bare) && !@v2_epochs && + $path =~ s!\A(/[^/]+)/!/! and $path_pfx .= $1); + ($path_pfx, $v1_bare, @v2_epochs); +} + sub try_manifest { my ($self) = @_; my $uri = URI->new($self->{src}); @@ -229,8 +242,7 @@ sub try_manifest { die "$uri: error decoding `$js': $@" if $@; ref($m) eq 'HASH' or die "$uri unknown type: ".ref($m); - my $v1_bare = $m->{$path}; - my @v2_epochs = grep(m!\A\Q$path\E/git/[0-9]+\.git\z!, keys %$m); + my ($path_pfx, $v1_bare, @v2_epochs) = deduce_epochs($m, $path); if (@v2_epochs) { # It may be possible to have v1 + v2 in parallel someday: $lei->err(<path($_); $uri->clone } @v2_epochs; + @v2_epochs = map { + $uri->path($path_pfx.$_); + $uri->clone + } @v2_epochs; clone_v2($self, \@v2_epochs); - } elsif ($v1_bare) { + } elsif (defined $v1_bare) { clone_v1($self); - } elsif (my @maybe = grep(m!\Q$path\E!, keys %$m)) { - die "E: confused by <$uri>, possible matches:\n@maybe"; } else { - die "E: confused by <$uri>"; + die "E: confused by <$uri>, possible matches:\n\t", + join(', ', sort keys %$m), "\n"; } } @@ -282,13 +296,11 @@ sub start { require PublicInbox::Inbox; require PublicInbox::Admin; require PublicInbox::InboxWritable; - my $op = $lei->workers_start($self, 'lei_mirror', 1, { - '' => [ \&mirror_done, $lei ] - }); - $lei->{mrr} = $self; + my ($op_c, $ops) = $lei->workers_start($self, 1); + $lei->{wq1} = $self; $self->wq_io_do('do_mirror', []); $self->wq_close(1); - while ($op && $op->{sock}) { $op->event_step } + $lei->wait_wq_events($op_c, $ops); } sub ipc_atfork_child {