X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FV2Writable.pm;h=c4368cccc8502616ab8c4c536720d7c17106f596;hb=c4aa293b2320feb805c5afeaa373f608e5bc8618;hp=b516278ed1e56eef418234f3ab0858c72d155b19;hpb=d2f3227c622174b96db8c2dc69dbc1fa3df50fcd;p=public-inbox.git diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm index b516278e..c4368ccc 100644 --- a/lib/PublicInbox/V2Writable.pm +++ b/lib/PublicInbox/V2Writable.pm @@ -50,6 +50,7 @@ sub new { } $nparts = nproc() if ($nparts == 0); + $v2ibx = PublicInbox::InboxWritable->new($v2ibx); my $self = { -inbox => $v2ibx, im => undef, # PublicInbox::Import @@ -67,7 +68,9 @@ sub init_inbox { my ($self, $parallel) = @_; $self->{parallel} = $parallel; $self->idx_init; - $self->git_init(0); + my $max_git = -1; + git_dir_latest($self, \$max_git); + $self->git_init($max_git >= 0 ? $max_git : 0); $self->done; } @@ -135,7 +138,7 @@ sub num_for { warn "<$mid> reused for mismatched content\n"; # try the rest of the mids - foreach my $i (1..$#$mids) { + for(my $i = $#$mids; $i >= 1; $i--) { my $m = $mids->[$i]; $num = $self->{skel}->{mm}->mid_insert($m); if (defined $num) { @@ -191,20 +194,23 @@ sub idx_init { # frequently activated. delete $ibx->{$_} foreach (qw(git mm search)); - $self->lock_acquire; + $ibx->umask_prepare; + $ibx->with_umask(sub { + $self->lock_acquire; - # first time initialization, first we create the skeleton pipe: - my $skel = $self->{skel} = PublicInbox::SearchIdxSkeleton->new($self); + # first time initialization, first we create the skeleton pipe: + my $skel = PublicInbox::SearchIdxSkeleton->new($self); + $self->{skel} = $skel; - # need to create all parts before initializing msgmap FD - my $max = $self->{partitions} - 1; - my $idx = $self->{idx_parts} = []; - for my $i (0..$max) { - push @$idx, PublicInbox::SearchIdxPart->new($self, $i, $skel); - } + # need to create all parts before initializing msgmap FD + my $max = $self->{partitions} - 1; + @{$self->{idx_parts}} = map { + PublicInbox::SearchIdxPart->new($self, $_, $skel); + } (0..$max); - # Now that all subprocesses are up, we can open the FD for SQLite: - $skel->_msgmap_init->{dbh}->begin_work; + # Now that all subprocesses are up, we can open the FD for SQLite: + $skel->_msgmap_init->{dbh}->begin_work; + }); } sub purge_oids { @@ -360,7 +366,6 @@ sub git_init { my ($self, $new) = @_; my $pfx = "$self->{-inbox}->{mainrepo}/git"; my $git_dir = "$pfx/$new.git"; - die "$git_dir exists\n" if -e $git_dir; my @cmd = (qw(git init --bare -q), $git_dir); PublicInbox::Import::run_die(\@cmd); @@ -551,7 +556,7 @@ sub reindex_oid { $num = $$regen--; die "BUG: ran out of article numbers\n" if $num <= 0; my $mm = $self->{skel}->{mm}; - foreach my $mid (@$mids) { + foreach my $mid (reverse @$mids) { if ($mm->mid_set($num, $mid) == 1) { $mid0 = $mid; last; @@ -559,7 +564,11 @@ sub reindex_oid { } if (!defined($mid0)) { my $id = '<' . join('> <', @$mids) . '>'; - warn "Message-Id $id unusable for $num\n"; + warn "Message-ID $id unusable for $num\n"; + foreach my $mid (@$mids) { + defined(my $n = $mm->num_for($mid)) or next; + warn "#$n previously mapped for <$mid>\n"; + } } } @@ -622,6 +631,7 @@ sub reindex { for (my $cur = $max_git; $cur >= 0; $cur--) { die "already reindexing!\n" if $self->{reindex_pipe}; my $git = PublicInbox::Git->new("$pfx/$cur.git"); + -d $git->{git_dir} or next; # missing parts are fine chomp($tip = $git->qx('rev-parse', $head)) unless $tip; my $h = $cur == $max_git ? $tip : $head; my @count = ('rev-list', '--count', $h, '--', 'm'); @@ -643,6 +653,7 @@ sub reindex { die "already reindexing!\n" if delete $self->{reindex_pipe}; my $cmt; my $git_dir = "$pfx/$cur.git"; + -d $git_dir or next; # missing parts are fine my $git = PublicInbox::Git->new($git_dir); my $h = $cur == $max_git ? $tip : $head; my $fh = $self->{reindex_pipe} = $git->popen(@cmd, $h); @@ -658,8 +669,17 @@ sub reindex { } delete $self->{reindex_pipe}; } + my $gaps; + if ($regen && $$regen != 0) { + warn "W: leftover article number ($$regen)\n"; + $gaps = 1; + } my ($min, $max) = $mm_tmp->minmax; - defined $max and die "leftover article numbers at $min..$max\n"; + if (defined $max) { + warn "W: leftover article numbers at $min..$max\n"; + $gaps = 1; + } + warn "W: were old git partitions deleted?\n" if $gaps; my @d = sort keys %$D; if (@d) { warn "BUG: ", scalar(@d)," unseen deleted messages marked\n";