]> Sergey Matveev's repositories - public-inbox.git/commitdiff
v2: fill alternates with old epochs on init from mirrors
authorEric Wong <e@80x24.org>
Wed, 4 Jul 2018 10:50:25 +0000 (10:50 +0000)
committerEric Wong <e@80x24.org>
Wed, 4 Jul 2018 19:53:30 +0000 (19:53 +0000)
For v2 repositories with multiple epochs, we must not forget
about earlier epochs in clones.  Ensure we update the alternates
file with all known epochs up to the current one.

Reported-by: Eric W. Biederman <ebiederm@xmission.com>
  https://public-inbox.org/meta/871scj2vzi.fsf@xmission.com/

lib/PublicInbox/V2Writable.pm
t/v2mirror.t

index d8d75ec272d809335f91a82ce8b10e5fc1be5516..412eb6a9a4cc0ff3aa9b8ec98c348a042bab6c18 100644 (file)
@@ -495,15 +495,21 @@ sub git_init {
        PublicInbox::Import::run_die(\@cmd);
 
        my $alt = "$all/objects/info/alternates";
-       my $new_obj_dir = "../../git/$epoch.git/objects";
        my %alts;
+       my @add;
        if (-e $alt) {
                open(my $fh, '<', $alt) or die "open < $alt: $!\n";
                %alts = map { chomp; $_ => 1 } (<$fh>);
        }
-       return $git_dir if $alts{$new_obj_dir};
+       foreach my $i (0..$epoch) {
+               my $dir = "../../git/$i.git/objects";
+               push @add, $dir if !$alts{$dir} && -d "$pfx/$i.git";
+       }
+       return $git_dir unless @add;
        open my $fh, '>>', $alt or die "open >> $alt: $!\n";
-       print $fh "$new_obj_dir\n" or die "print >> $alt: $!\n";
+       foreach my $dir (@add) {
+               print $fh "$dir\n" or die "print >> $alt: $!\n";
+       }
        close $fh or die "close $alt: $!\n";
        $git_dir
 }
index 4cd369bd204d3c7ce9497a6a162b9d97ba880727..c0c329ca41defab379b3bd955816f6046638388a 100644 (file)
@@ -45,11 +45,16 @@ To: You <you@example.com>
 Subject: a
 Date: Thu, 01 Jan 1970 00:00:00 +0000
 
+my $old_rotate_bytes = $v2w->{rotate_bytes};
+$v2w->{rotate_bytes} = 500; # force rotating
 for my $i (1..9) {
        $mime->header_set('Message-ID', "<$i\@example.com>");
        $mime->header_set('Subject', "subject = $i");
        ok($v2w->add($mime), "add msg $i OK");
 }
+
+my $epoch_max = $v2w->{epoch_max};
+ok($epoch_max > 0, "multiple epochs");
 $v2w->done;
 
 my %opts = (
@@ -79,11 +84,14 @@ ok(defined $pid, 'forked httpd process successfully');
 my ($host, $port) = ($sock->sockhost, $sock->sockport);
 $sock = undef;
 
-my @cmd = (qw(git clone --mirror -q), "http://$host:$port/v2/0",
-       "$tmpdir/m/git/0.git");
+my @cmd;
+foreach my $i (0..$epoch_max) {
+       @cmd = (qw(git clone --mirror -q), "http://$host:$port/v2/$i",
+               "$tmpdir/m/git/$i.git");
 
-is(system(@cmd), 0, 'cloned OK');
-ok(-d "$tmpdir/m/git/0.git", 'mirror OK');;
+       is(system(@cmd), 0, 'cloned OK');
+       ok(-d "$tmpdir/m/git/$i.git", 'mirror OK');
+}
 
 @cmd = ("$script-init", '-V2', 'm', "$tmpdir/m", 'http://example.com/m',
        'alt@example.com');
@@ -94,14 +102,23 @@ my $mibx = { mainrepo => "$tmpdir/m", address => 'alt@example.com' };
 $mibx = PublicInbox::Inbox->new($mibx);
 is_deeply([$mibx->mm->minmax], [$ibx->mm->minmax], 'index synched minmax');
 
+$v2w->{rotate_bytes} = $old_rotate_bytes;
 for my $i (10..15) {
        $mime->header_set('Message-ID', "<$i\@example.com>");
        $mime->header_set('Subject', "subject = $i");
        ok($v2w->add($mime), "add msg $i OK");
 }
 $v2w->barrier;
-is(system('git', "--git-dir=$tmpdir/m/git/0.git", 'fetch', '-q'), 0,
-       'fetch successful');
+
+sub fetch_each_epoch {
+       foreach my $i (0..$epoch_max) {
+               my $dir = "$tmpdir/m/git/$i.git";
+               is(system('git', "--git-dir=$dir", 'fetch', '-q'), 0,
+                       'fetch successful');
+       }
+}
+
+fetch_each_epoch();
 
 my $mset = $mibx->search->reopen->query('m:15@example.com', {mset => 1});
 is(scalar($mset->items), 0, 'new message not found in mirror, yet');
@@ -131,8 +148,7 @@ like($to_purge, qr/\A[a-f0-9]{40,}\z/, 'read blob to be purged');
 $mset = $ibx->search->reopen->query('m:10@example.com', {mset => 1});
 is(scalar($mset->items), 0, 'purged message gone from origin');
 
-is(system('git', "--git-dir=$tmpdir/m/git/0.git", 'fetch', '-q'), 0,
-       'fetch successful');
+fetch_each_epoch();
 {
        open my $err, '+>', "$tmpdir/index-err" or die "open: $!";
        my $ipid = fork;