176 |
close($fh); |
close($fh); |
177 |
} |
} |
178 |
|
|
179 |
|
my $merge_digest_mapping; |
180 |
|
|
181 |
sub merge_out { |
sub merge_out { |
182 |
my ( $from_node, $new ) = @_; |
my ( $from_node, $new ) = @_; |
183 |
|
|
203 |
if ( $k1 =~ m{#} ) { |
if ( $k1 =~ m{#} ) { |
204 |
die "ASSERT $k1 $k2" unless $k2 =~ m{^\d+$}; |
die "ASSERT $k1 $k2" unless $k2 =~ m{^\d+$}; |
205 |
#warn "XXX $k1 $k2"; |
#warn "XXX $k1 $k2"; |
|
my $md5 = $remote_digest->{nr_md5}->[$k2]; |
|
|
|
|
|
if ( ! $md5 ) { |
|
|
$missing->{nr_md5}->{$from_node}++; # FIXME die? |
|
|
next; |
|
|
} |
|
206 |
|
|
207 |
if ( my $local_k2 = $digest->{md5_nr}->{$md5} ) { |
if ( defined $merge_digest_mapping->{$from_node}->[ $k2 ] ) { |
208 |
$k2 = $local_k2; |
$k2 = $merge_digest_mapping->{$from_node}->[ $k2 ]; |
|
$local++; |
|
|
} elsif ( my $full = $remote_digest->{md5}->{$md5} ) { |
|
|
$k2 = $digest->to_int( $remote_digest->{md5}->{$md5} ); |
|
|
$remote++; |
|
209 |
} else { |
} else { |
210 |
$missing->{md5}->{$from_node}++; |
|
211 |
|
my $md5 = $remote_digest->{nr_md5}->[$k2]; |
212 |
|
|
213 |
|
if ( ! $md5 ) { |
214 |
|
$missing->{nr_md5}->{$from_node}++; # FIXME die? |
215 |
|
next; |
216 |
|
} |
217 |
|
|
218 |
|
my $local_k2; |
219 |
|
|
220 |
|
if ( $local_k2 = $digest->{md5_nr}->{$md5} ) { |
221 |
|
$local++; |
222 |
|
} elsif ( my $full = $remote_digest->{md5}->{$md5} ) { |
223 |
|
$local_k2 = $digest->to_int( $remote_digest->{md5}->{$md5} ); |
224 |
|
$remote++; |
225 |
|
} else { |
226 |
|
$missing->{md5}->{$from_node}++; |
227 |
|
} |
228 |
|
|
229 |
|
$k2 = $merge_digest_mapping->{$from_node}->[ $k2 ] = $local_k2; |
230 |
|
|
231 |
} |
} |
232 |
} |
} |
233 |
|
|
260 |
|
|
261 |
$t_merge = time - $t_merge; |
$t_merge = time - $t_merge; |
262 |
my $digests = $local + $remote; |
my $digests = $local + $remote; |
263 |
printf STDERR "\n[$port] merge %d in %.4fs %.2f/s digests local: %.1f%% %d/%d\n", $tick, $t_merge, $digests / $t_merge, $local * 100 / $digests, $local, $remote; |
printf STDERR "\n[$port] merge %d in %.4fs %.2f/s digests local: %.1f%% %d/%d\n", $tick, $t_merge, $digests / $t_merge, $local * 100 / ( $digests || 1 ), $local, $remote; |
264 |
push @reports, [ "$tick merged $from_node", $t_merge, $tick / $t_merge ]; |
push @reports, [ "$tick merged $from_node", $t_merge, $tick / $t_merge ]; |
265 |
|
|
266 |
warn "[$port] missing ", dump $missing if $missing; |
warn "[$port] missing ", dump $missing if $missing; |