… | |
… | |
49 | |
49 | |
50 | ############################################################################# |
50 | ############################################################################# |
51 | # seednodes |
51 | # seednodes |
52 | |
52 | |
53 | our @SEEDS; |
53 | our @SEEDS; |
|
|
54 | our %SEED_CONNECT; |
54 | our $SEED_WATCHER; |
55 | our $SEED_WATCHER; |
55 | |
56 | |
56 | sub seed_connect { |
57 | sub seed_connect { |
57 | my ($seed) = @_; |
58 | my ($seed) = @_; |
58 | |
59 | |
59 | my ($host, $port) = AnyEvent::Socket::parse_hostport $seed |
60 | my ($host, $port) = AnyEvent::Socket::parse_hostport $seed |
60 | or Carp::croak "$seed: unparsable seed address"; |
61 | or Carp::croak "$seed: unparsable seed address"; |
61 | |
62 | |
62 | # ughhh |
63 | # ughhh |
63 | my $tp; $tp = AnyEvent::MP::Transport::mp_connect $host, $port, |
64 | $SEED_CONNECT{$seed} ||= AnyEvent::MP::Transport::mp_connect $host, $port, |
64 | release => \&more_seeding, |
65 | seed => $seed, |
65 | sub { |
66 | sub { |
66 | $tp = shift; |
67 | delete $SEED_CONNECT{$seed}; |
67 | $tp->{keepalive} = $tp; |
68 | after 1, \&more_seeding; |
68 | }, |
69 | }, |
69 | ; |
70 | ; |
70 | } |
71 | } |
71 | |
72 | |
72 | sub more_seeding { |
73 | sub more_seeding { |
73 | return;#d##TODO# |
|
|
74 | return if $nodecnt; |
74 | return if $nodecnt; |
75 | return unless @SEEDS; |
75 | return unless @SEEDS; |
76 | |
76 | |
77 | $AnyEvent::MP::Kernel::WARN->(9, "no nodes connected, seeding."); |
77 | $AnyEvent::MP::Kernel::WARN->(9, "no nodes connected, seeding."); |
78 | |
78 | |
79 | seed_connect $SEEDS[rand @SEEDS]; |
79 | seed_connect $SEEDS[rand @SEEDS]; |
|
|
80 | } |
|
|
81 | |
|
|
82 | sub avoid_seed($) { |
|
|
83 | @SEEDS = grep $_ ne $_[0], @SEEDS; |
80 | } |
84 | } |
81 | |
85 | |
82 | sub set_seeds(@) { |
86 | sub set_seeds(@) { |
83 | @SEEDS = @_; |
87 | @SEEDS = @_; |
84 | |
88 | |
… | |
… | |
205 | mon $node, psub { kil $SELF }; |
209 | mon $node, psub { kil $SELF }; |
206 | |
210 | |
207 | rcv $SELF, |
211 | rcv $SELF, |
208 | addr => sub { |
212 | addr => sub { |
209 | my $addresses = shift; |
213 | my $addresses = shift; |
210 | $AnyEvent::MP::Kernel::WARN->(9, "$node told us it's addresses (@$addresses)."); |
214 | $AnyEvent::MP::Kernel::WARN->(9, "$node told us its addresses (@$addresses)."); |
211 | $addr{$node} = $addresses; |
215 | $addr{$node} = $addresses; |
212 | |
216 | |
213 | # to help listener-less nodes, we broadcast new addresses to them unconditionally |
217 | # to help listener-less nodes, we broadcast new addresses to them unconditionally |
214 | #TODO: should be done by a node finding out about a listener-less one |
218 | #TODO: should be done by a node finding out about a listener-less one |
215 | if (@$addresses) { |
219 | if (@$addresses) { |