142 |
sub merge_out { |
sub merge_out { |
143 |
my ( $from_node, $new ) = @_; |
my ( $from_node, $new ) = @_; |
144 |
|
|
145 |
warn "### merge $from_node"; |
my $remote_digest = Sack::Digest->new( port => $from_node ); |
|
|
|
|
my $from_port = $from_node; |
|
|
$from_port =~ s{.+:(\d+)$}{$1}; |
|
|
|
|
|
my $remote_digest = Sack::Digest->new( port => $from_port ); |
|
146 |
my ( $local, $remote ) = ( 0, 0 ); |
my ( $local, $remote ) = ( 0, 0 ); |
147 |
|
|
148 |
|
my $tick = 0; |
149 |
|
print STDERR "[$port] merge $from_node"; |
150 |
|
|
151 |
foreach my $k1 ( keys %$new ) { |
foreach my $k1 ( keys %$new ) { |
152 |
|
|
153 |
foreach my $k2 ( keys %{ $new->{$k1} } ) { |
foreach my $k2 ( keys %{ $new->{$k1} } ) { |
157 |
if ( $k1 =~ m{#} ) { |
if ( $k1 =~ m{#} ) { |
158 |
die "ASSERT $k1 $k2" unless $k2 =~ m{^\d+$}; |
die "ASSERT $k1 $k2" unless $k2 =~ m{^\d+$}; |
159 |
#warn "XXX $k1 $k2"; |
#warn "XXX $k1 $k2"; |
160 |
my $md5 = $remote_digest->{nr_md5}->[$k2] || warn "[$port] no2md5 $n not found in $from_port\n"; |
my $md5 = $remote_digest->{nr_md5}->[$k2] || warn "[$port] no2md5 $n not found in $from_node\n"; |
161 |
if ( my $local_k2 = $digest->{md5_nr}->{$md5} ) { |
if ( my $local_k2 = $digest->{md5_nr}->{$md5} ) { |
162 |
$k2 = $local_k2; |
$k2 = $local_k2; |
163 |
$local++; |
$local++; |
185 |
} else { |
} else { |
186 |
die "can't merge $k2 [$ref] from ",dump($n), " into ", dump($out->{$k1}->{$k2}); |
die "can't merge $k2 [$ref] from ",dump($n), " into ", dump($out->{$k1}->{$k2}); |
187 |
} |
} |
188 |
|
|
189 |
|
if ( $tick++ % 1000 == 0 ) { |
190 |
|
print STDERR "."; |
191 |
|
} elsif ( $tick % 10000 == 0 ) { |
192 |
|
print STDERR $tick; |
193 |
|
} |
194 |
} |
} |
195 |
} |
} |
196 |
|
|
197 |
warn "[$port] merge local $local remote $remote from $from_port\n"; |
print STDERR "$tick\n"; |
198 |
|
|
199 |
|
warn "[$port] merge local $local remote $remote from $from_node\n"; |
200 |
warn "## merge out ", dump $out if $debug; |
warn "## merge out ", dump $out if $debug; |
201 |
} |
} |
202 |
|
|