… | |
… | |
230 | |
230 | |
231 | ($NODE{$noderef} || add_node $noderef) |
231 | ($NODE{$noderef} || add_node $noderef) |
232 | ->kill ("$portid", @_); |
232 | ->kill ("$portid", @_); |
233 | } |
233 | } |
234 | |
234 | |
|
|
235 | sub _nodename { |
|
|
236 | require POSIX; |
|
|
237 | (POSIX::uname ())[1] |
|
|
238 | } |
|
|
239 | |
235 | sub resolve_node($) { |
240 | sub resolve_node($) { |
236 | my ($noderef) = @_; |
241 | my ($noderef) = @_; |
237 | |
242 | |
238 | my $cv = AE::cv; |
243 | my $cv = AE::cv; |
239 | my @res; |
244 | my @res; |
… | |
… | |
250 | $noderef = $DEFAULT_PORT unless length $noderef; |
255 | $noderef = $DEFAULT_PORT unless length $noderef; |
251 | |
256 | |
252 | my $idx; |
257 | my $idx; |
253 | for my $t (split /,/, $noderef) { |
258 | for my $t (split /,/, $noderef) { |
254 | my $pri = ++$idx; |
259 | my $pri = ++$idx; |
|
|
260 | |
|
|
261 | $t = length $t ? _nodename . ":$t" : _nodename |
|
|
262 | if $t =~ /^\d*$/; |
255 | |
263 | |
256 | if ($t =~ /^\d*$/) { |
264 | my ($host, $port) = AnyEvent::Socket::parse_hostport $t, "aemp=$DEFAULT_PORT" |
257 | require POSIX; |
265 | or Carp::croak "$t: unparsable transport descriptor"; |
258 | my $nodename = (POSIX::uname ())[1]; |
|
|
259 | |
266 | |
260 | $cv->begin; |
267 | $cv->begin; |
261 | AnyEvent::Socket::resolve_sockaddr $nodename, $t || "aemp=$DEFAULT_PORT", "tcp", 0, undef, sub { |
268 | AnyEvent::Socket::resolve_sockaddr $host, $port, "tcp", 0, undef, sub { |
262 | for (@_) { |
269 | for (@_) { |
263 | my ($service, $host) = AnyEvent::Socket::unpack_sockaddr $_->[3]; |
270 | my ($service, $host) = AnyEvent::Socket::unpack_sockaddr $_->[3]; |
264 | push @res, [ |
271 | push @res, [ |
265 | $pri += 1e-5, |
272 | $pri += 1e-5, |
266 | AnyEvent::Socket::format_hostport AnyEvent::Socket::format_address $host, $service |
273 | AnyEvent::Socket::format_hostport AnyEvent::Socket::format_address $host, $service |
267 | ]; |
|
|
268 | } |
|
|
269 | $cv->end; |
|
|
270 | }; |
|
|
271 | |
|
|
272 | # my (undef, undef, undef, undef, @ipv4) = gethostbyname $nodename; |
|
|
273 | # |
|
|
274 | # for (@ipv4) { |
|
|
275 | # push @res, [ |
|
|
276 | # $pri, |
|
|
277 | # AnyEvent::Socket::format_hostport AnyEvent::Socket::format_address $_, $t || $DEFAULT_PORT, |
|
|
278 | # ]; |
274 | ]; |
279 | # } |
|
|
280 | } else { |
|
|
281 | my ($host, $port) = AnyEvent::Socket::parse_hostport $t, "aemp=$DEFAULT_PORT" |
|
|
282 | or Carp::croak "$t: unparsable transport descriptor"; |
|
|
283 | |
|
|
284 | $cv->begin; |
|
|
285 | AnyEvent::Socket::resolve_sockaddr $host, $port, "tcp", 0, undef, sub { |
|
|
286 | for (@_) { |
|
|
287 | my ($service, $host) = AnyEvent::Socket::unpack_sockaddr $_->[3]; |
|
|
288 | push @res, [ |
|
|
289 | $pri += 1e-5, |
|
|
290 | AnyEvent::Socket::format_hostport AnyEvent::Socket::format_address $host, $service |
|
|
291 | ]; |
|
|
292 | } |
|
|
293 | $cv->end; |
|
|
294 | } |
275 | } |
|
|
276 | $cv->end; |
295 | } |
277 | }; |
296 | } |
278 | } |
297 | |
279 | |
298 | $cv->end; |
280 | $cv->end; |
299 | |
281 | |
300 | $cv |
282 | $cv |
301 | } |
283 | } |
302 | |
284 | |
303 | sub initialise_node(@) { |
285 | sub initialise_node(@) { |
304 | my ($noderef, @others) = @_; |
286 | my ($noderef, @others) = @_; |
305 | |
287 | |
306 | my $profile = defined $noderef ? {} : \%AnyEvent::MP::Config::CFG; |
288 | my $profile = AnyEvent::MP::Config::find_profile |
|
|
289 | +(defined $noderef ? $noderef : _nodename); |
307 | |
290 | |
308 | $noderef = $profile->{noderef} |
291 | $noderef = $profile->{noderef} |
309 | unless defined $noderef; |
292 | if exists $profile->{noderef}; |
310 | |
293 | |
311 | @others = @{ $profile->{seeds} } |
294 | @others = @{ $profile->{seeds} }; |
312 | unless @others; |
|
|
313 | |
295 | |
314 | if ($noderef =~ /^slave\/(.*)$/) { |
296 | if ($noderef =~ /^slave\/(.*)$/) { |
315 | $SLAVE = AE::cv; |
297 | $SLAVE = AE::cv; |
316 | my $name = $1; |
298 | my $name = $1; |
317 | $name = $NODE unless length $name; |
299 | $name = $NODE unless length $name; |