--- trunk/bin/sack.pl 2009/09/24 13:46:16 46 +++ trunk/bin/sack.pl 2009/09/25 09:38:48 55 @@ -3,7 +3,7 @@ use warnings; use strict; -our $VERSION = '0.03'; +our $VERSION = '0.04'; use Time::HiRes qw(time); use Data::Dump qw(dump); @@ -44,7 +44,7 @@ chomp( my $pwd = `pwd` ); $prefix = "$pwd/$prefix"; } - $prefix =~ s{^(.*)/srv/Sack/[\./]+bin.+$}{$1}; + $prefix =~ s{^(.*)/srv/Sack/.+$}{$1}; warn "# prefix $prefix"; $SIG{INT} = sub { @@ -139,15 +139,37 @@ } sub merge_out { - my $new = shift; + my ( $from_node, $new ) = @_; + + warn "### merge $from_node"; + + my $from_port = $from_node; + $from_port =~ s{.+:(\d+)$}{$1}; + + my $remote_digest = Sack::Digest->new( port => $from_port ); + my ( $local, $remote ) = ( 0, 0 ); foreach my $k1 ( keys %$new ) { foreach my $k2 ( keys %{ $new->{$k1} } ) { my $n = delete $new->{$k1}->{$k2}; - my $ref = ref $out->{$k1}->{$k2}; + if ( $k1 =~ m{#} ) { + die "ASSERT $k1 $k2" unless $k2 =~ m{^\d+$}; +#warn "XXX $k1 $k2"; + my $md5 = $remote_digest->{nr_md5}->[$k2] || warn "[$port] no2md5 $n not found in $from_port\n"; + if ( my $local_k2 = $digest->{md5_nr}->{$md5} ) { + $k2 = $local_k2; + $local++; + } else { + $k2 = $digest->to_int( $remote_digest->{md5}->{$md5} ); + $remote++; + } + } + + my $ref = ref $out->{$k1}->{$k2}; +#warn "XXXX $k1 $k2 $ref"; if ( ! defined $out->{$k1}->{$k2} ) { $out->{$k1}->{$k2} = $n; } elsif ( $k1 =~ m{\+} ) { @@ -167,6 +189,7 @@ } } + warn "[$port] merge local $local remote $remote from $from_port\n"; warn "## merge out ", dump $out if $debug; } @@ -214,7 +237,7 @@ my $s = length $o; $o = thaw $o; warn "[$port] merge $node $s bytes\n"; - merge_out $o; + merge_out $node => $o; } } } @@ -343,6 +366,7 @@ __HELP__ } elsif ( $cmd =~ m{^(vi|\\e|o)}i ) { #system "vi out/*"; + $digest->sync; system "bin/storableedit.pl", (glob('out/*.storable'))[0]; } elsif ( $cmd =~ m{^i(?:nfo)?\s?(.+)?$}i ) { info; @@ -352,6 +376,9 @@ exit; } elsif ( $cmd =~ m{^(v|r)}i ) { run_views; + } elsif ( $cmd =~ m{^n(ode)?\s*(\d+)}i ) { + push @nodes, $1; + info; } elsif ( $cmd ) { warn "UNKNOWN ", dump $cmd; }