16 |
my $lsn = IO::Socket::INET->new(Listen => 1, LocalPort => $listen_port, Reuse => 1) or exit; |
my $lsn = IO::Socket::INET->new(Listen => 1, LocalPort => $listen_port, Reuse => 1) or exit; |
17 |
my $sel = IO::Select->new($lsn); |
my $sel = IO::Select->new($lsn); |
18 |
|
|
19 |
|
my $info; |
20 |
|
sub info { |
21 |
|
my $port = shift; |
22 |
|
push @{ $info->{$port} }, [ @_ ]; |
23 |
|
} |
24 |
|
|
25 |
sub fork_node { |
sub fork_node { |
26 |
my ( $port, $host ) = @_; |
my ( $port, $host ) = @_; |
27 |
|
|
28 |
if ( my $pid = fork ) { |
if ( my $pid = fork ) { |
29 |
# parent |
# parent |
30 |
|
info $port => 'forked', $pid; |
31 |
return $port; |
return $port; |
32 |
|
|
33 |
} elsif ( ! defined $pid ) { |
} elsif ( ! defined $pid ) { |
55 |
if ($sock == $lsn) { |
if ($sock == $lsn) { |
56 |
my $new = $lsn->accept; |
my $new = $lsn->accept; |
57 |
$sel->add($new); |
$sel->add($new); |
58 |
$session->{$new} = $new->peerhost; |
$session->{$new} = $new->peerport; |
59 |
warn "[socket] connect\n"; |
warn "[socket] connect\n"; |
60 |
Storable::store_fd( { ping => 1 }, $new ); |
Storable::store_fd( { ping => 1 }, $new ); |
61 |
|
info 0 => 'ping', $new->peerport; |
62 |
} else { |
} else { |
63 |
my $data = eval { Storable::fd_retrieve( $sock ) }; |
my $data = eval { Storable::fd_retrieve( $sock ) }; |
64 |
if ( $@ ) { |
if ( $@ ) { |
69 |
} else { |
} else { |
70 |
warn "<<<< ", dump($data), $/; |
warn "<<<< ", dump($data), $/; |
71 |
if ( $data->{repl} ) { |
if ( $data->{repl} ) { |
72 |
Storable::store_fd( { repl => $data }, $sock ); |
my $response = { repl => $$, info => $info }; |
73 |
|
Storable::store_fd( $response, $sock ); |
74 |
|
} elsif ( $data->{ping} ) { |
75 |
|
$info->{_peer_port}->{$sock->peerport} = $data->{port}; |
76 |
|
info $data->{port} => 'peer port', $sock->peerport; |
77 |
} |
} |
78 |
} |
} |
79 |
} |
} |