3 |
use warnings; |
use warnings; |
4 |
use strict; |
use strict; |
5 |
|
|
6 |
our $VERSION = '0.03'; |
our $VERSION = '0.04'; |
7 |
|
|
8 |
use Time::HiRes qw(time); |
use Time::HiRes qw(time); |
9 |
use Data::Dump qw(dump); |
use Data::Dump qw(dump); |
139 |
} |
} |
140 |
|
|
141 |
sub merge_out { |
sub merge_out { |
142 |
my $new = shift; |
my ( $from_node, $new ) = @_; |
143 |
|
|
144 |
|
warn "### merge $from_node"; |
145 |
|
|
146 |
|
my $from_port = $from_node; |
147 |
|
$from_port =~ s{.+:(\d+)$}{$1}; |
148 |
|
|
149 |
|
my $remote_digest = Sack::Digest->new( port => $from_port ); |
150 |
|
my ( $local, $remote ) = ( 0, 0 ); |
151 |
|
|
152 |
foreach my $k1 ( keys %$new ) { |
foreach my $k1 ( keys %$new ) { |
153 |
|
|
154 |
foreach my $k2 ( keys %{ $new->{$k1} } ) { |
foreach my $k2 ( keys %{ $new->{$k1} } ) { |
155 |
|
|
156 |
my $n = delete $new->{$k1}->{$k2}; |
my $n = delete $new->{$k1}->{$k2}; |
|
my $ref = ref $out->{$k1}->{$k2}; |
|
157 |
|
|
158 |
|
if ( $k1 =~ m{#} ) { |
159 |
|
die "ASSERT $k1 $k2" unless $k2 =~ m{^\d+$}; |
160 |
|
#warn "XXX $k1 $k2"; |
161 |
|
my $md5 = $remote_digest->{nr_md5}->[$k2] || warn "[$port] no2md5 $n not found in $from_port\n"; |
162 |
|
if ( my $local_k2 = $digest->{md5_nr}->{$md5} ) { |
163 |
|
$k2 = $local_k2; |
164 |
|
$local++; |
165 |
|
} else { |
166 |
|
$k2 = $digest->to_int( $remote_digest->{md5}->{$md5} ); |
167 |
|
$remote++; |
168 |
|
} |
169 |
|
} |
170 |
|
|
171 |
|
my $ref = ref $out->{$k1}->{$k2}; |
172 |
|
#warn "XXXX $k1 $k2 $ref"; |
173 |
if ( ! defined $out->{$k1}->{$k2} ) { |
if ( ! defined $out->{$k1}->{$k2} ) { |
174 |
$out->{$k1}->{$k2} = $n; |
$out->{$k1}->{$k2} = $n; |
175 |
} elsif ( $k1 =~ m{\+} ) { |
} elsif ( $k1 =~ m{\+} ) { |
189 |
} |
} |
190 |
} |
} |
191 |
|
|
192 |
|
warn "[$port] merge local $local remote $remote from $from_port\n"; |
193 |
warn "## merge out ", dump $out if $debug; |
warn "## merge out ", dump $out if $debug; |
194 |
} |
} |
195 |
|
|
237 |
my $s = length $o; |
my $s = length $o; |
238 |
$o = thaw $o; |
$o = thaw $o; |
239 |
warn "[$port] merge $node $s bytes\n"; |
warn "[$port] merge $node $s bytes\n"; |
240 |
merge_out $o; |
merge_out $node => $o; |
241 |
} |
} |
242 |
} |
} |
243 |
} |
} |