ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP.pm
(Generate patch)

Comparing AnyEvent-MP/MP.pm (file contents):
Revision 1.77 by elmex, Thu Sep 3 07:57:30 2009 UTC vs.
Revision 1.82 by root, Mon Sep 7 18:42:09 2009 UTC

41 41
42 bin/aemp - stable. 42 bin/aemp - stable.
43 AnyEvent::MP - stable API, should work. 43 AnyEvent::MP - stable API, should work.
44 AnyEvent::MP::Intro - explains most concepts. 44 AnyEvent::MP::Intro - explains most concepts.
45 AnyEvent::MP::Kernel - mostly stable. 45 AnyEvent::MP::Kernel - mostly stable.
46 AnyEvent::MP::Global - stable API, protocol not yet final. 46 AnyEvent::MP::Global - stable but incomplete, protocol not yet final.
47 47
48 stay tuned. 48stay tuned.
49 49
50=head1 DESCRIPTION 50=head1 DESCRIPTION
51 51
52This module (-family) implements a simple message passing framework. 52This module (-family) implements a simple message passing framework.
53 53
61 61
62=over 4 62=over 4
63 63
64=item port 64=item port
65 65
66A port is something you can send messages to (with the C<snd> function). 66Not to be confused with a TCP port, a "port" is something you can send
67messages to (with the C<snd> function).
67 68
68Ports allow you to register C<rcv> handlers that can match all or just 69Ports allow you to register C<rcv> handlers that can match all or just
69some messages. Messages send to ports will not be queued, regardless of 70some messages. Messages send to ports will not be queued, regardless of
70anything was listening for them or not. 71anything was listening for them or not.
71 72
158 159
159=item $nodeid = node_of $port 160=item $nodeid = node_of $port
160 161
161Extracts and returns the node ID from a port ID or a node ID. 162Extracts and returns the node ID from a port ID or a node ID.
162 163
164=item configure $profile, key => value...
165
163=item configure key => value... 166=item configure key => value...
164 167
165Before a node can talk to other nodes on the network (i.e. enter 168Before a node can talk to other nodes on the network (i.e. enter
166"distributed mode") it has to configure itself - the minimum a node needs 169"distributed mode") it has to configure itself - the minimum a node needs
167to know is its own name, and optionally it should know the addresses of 170to know is its own name, and optionally it should know the addresses of
174 177
175=item step 1, gathering configuration from profiles 178=item step 1, gathering configuration from profiles
176 179
177The function first looks up a profile in the aemp configuration (see the 180The function first looks up a profile in the aemp configuration (see the
178L<aemp> commandline utility). The profile name can be specified via the 181L<aemp> commandline utility). The profile name can be specified via the
179named C<profile> parameter. If it is missing, then the nodename (F<uname 182named C<profile> parameter or can simply be the first parameter). If it is
180-n>) will be used as profile name. 183missing, then the nodename (F<uname -n>) will be used as profile name.
181 184
182The profile data is then gathered as follows: 185The profile data is then gathered as follows:
183 186
184First, all remaining key => value pairs (all of which are conveniently 187First, all remaining key => value pairs (all of which are conveniently
185undocumented at the moment) will be interpreted as configuration 188undocumented at the moment) will be interpreted as configuration
472 475
473Monitor the given port and do something when the port is killed or 476Monitor the given port and do something when the port is killed or
474messages to it were lost, and optionally return a guard that can be used 477messages to it were lost, and optionally return a guard that can be used
475to stop monitoring again. 478to stop monitoring again.
476 479
480In the first form (callback), the callback is simply called with any
481number of C<@reason> elements (no @reason means that the port was deleted
482"normally"). Note also that I<< the callback B<must> never die >>, so use
483C<eval> if unsure.
484
485In the second form (another port given), the other port (C<$rcvport>)
486will be C<kil>'ed with C<@reason>, if a @reason was specified, i.e. on
487"normal" kils nothing happens, while under all other conditions, the other
488port is killed with the same reason.
489
490The third form (kill self) is the same as the second form, except that
491C<$rvport> defaults to C<$SELF>.
492
493In the last form (message), a message of the form C<@msg, @reason> will be
494C<snd>.
495
496Monitoring-actions are one-shot: once messages are lost (and a monitoring
497alert was raised), they are removed and will not trigger again.
498
499As a rule of thumb, monitoring requests should always monitor a port from
500a local port (or callback). The reason is that kill messages might get
501lost, just like any other message. Another less obvious reason is that
502even monitoring requests can get lost (for example, when the connection
503to the other node goes down permanently). When monitoring a port locally
504these problems do not exist.
505
477C<mon> effectively guarantees that, in the absence of hardware failures, 506C<mon> effectively guarantees that, in the absence of hardware failures,
478after starting the monitor, either all messages sent to the port will 507after starting the monitor, either all messages sent to the port will
479arrive, or the monitoring action will be invoked after possible message 508arrive, or the monitoring action will be invoked after possible message
480loss has been detected. No messages will be lost "in between" (after 509loss has been detected. No messages will be lost "in between" (after
481the first lost message no further messages will be received by the 510the first lost message no further messages will be received by the
482port). After the monitoring action was invoked, further messages might get 511port). After the monitoring action was invoked, further messages might get
483delivered again. 512delivered again.
484 513
485Note that monitoring-actions are one-shot: once messages are lost (and a 514Inter-host-connection timeouts and monitoring depend on the transport
486monitoring alert was raised), they are removed and will not trigger again. 515used. The only transport currently implemented is TCP, and AnyEvent::MP
516relies on TCP to detect node-downs (this can take 10-15 minutes on a
517non-idle connection, and usually around two hours for idle conenctions).
487 518
488In the first form (callback), the callback is simply called with any 519This means that monitoring is good for program errors and cleaning up
489number of C<@reason> elements (no @reason means that the port was deleted 520stuff eventually, but they are no replacement for a timeout when you need
490"normally"). Note also that I<< the callback B<must> never die >>, so use 521to ensure some maximum latency.
491C<eval> if unsure.
492
493In the second form (another port given), the other port (C<$rcvport>)
494will be C<kil>'ed with C<@reason>, if a @reason was specified, i.e. on
495"normal" kils nothing happens, while under all other conditions, the other
496port is killed with the same reason.
497
498The third form (kill self) is the same as the second form, except that
499C<$rvport> defaults to C<$SELF>.
500
501In the last form (message), a message of the form C<@msg, @reason> will be
502C<snd>.
503
504As a rule of thumb, monitoring requests should always monitor a port from
505a local port (or callback). The reason is that kill messages might get
506lost, just like any other message. Another less obvious reason is that
507even monitoring requests can get lost (for example, when the connection
508to the other node goes down permanently). When monitoring a port locally
509these problems do not exist.
510 522
511Example: call a given callback when C<$port> is killed. 523Example: call a given callback when C<$port> is killed.
512 524
513 mon $port, sub { warn "port died because of <@_>\n" }; 525 mon $port, sub { warn "port died because of <@_>\n" };
514 526
609the package, then the package above the package and so on (e.g. 621the package, then the package above the package and so on (e.g.
610C<MyApp::Chat::Server>, C<MyApp::Chat>, C<MyApp>) until the function 622C<MyApp::Chat::Server>, C<MyApp::Chat>, C<MyApp>) until the function
611exists or it runs out of package names. 623exists or it runs out of package names.
612 624
613The init function is then called with the newly-created port as context 625The init function is then called with the newly-created port as context
614object (C<$SELF>) and the C<@initdata> values as arguments. 626object (C<$SELF>) and the C<@initdata> values as arguments. It I<must>
627call one of the C<rcv> functions to set callbacks on C<$SELF>, otherwise
628the port might not get created.
615 629
616A common idiom is to pass a local port, immediately monitor the spawned 630A common idiom is to pass a local port, immediately monitor the spawned
617port, and in the remote init function, immediately monitor the passed 631port, and in the remote init function, immediately monitor the passed
618local port. This two-way monitoring ensures that both ports get cleaned up 632local port. This two-way monitoring ensures that both ports get cleaned up
619when there is a problem. 633when there is a problem.
620 634
635C<spawn> guarantees that the C<$initfunc> has no visible effects on the
636caller before C<spawn> returns (by delaying invocation when spawn is
637called for the local node).
638
621Example: spawn a chat server port on C<$othernode>. 639Example: spawn a chat server port on C<$othernode>.
622 640
623 # this node, executed from within a port context: 641 # this node, executed from within a port context:
624 my $server = spawn $othernode, "MyApp::Chat::Server::connect", $SELF; 642 my $server = spawn $othernode, "MyApp::Chat::Server::connect", $SELF;
625 mon $server; 643 mon $server;
639 657
640sub _spawn { 658sub _spawn {
641 my $port = shift; 659 my $port = shift;
642 my $init = shift; 660 my $init = shift;
643 661
662 # rcv will create the actual port
644 local $SELF = "$NODE#$port"; 663 local $SELF = "$NODE#$port";
645 eval { 664 eval {
646 &{ load_func $init } 665 &{ load_func $init }
647 }; 666 };
648 _self_die if $@; 667 _self_die if $@;
844L<AnyEvent::MP::Kernel> - more, lower-level, stuff. 863L<AnyEvent::MP::Kernel> - more, lower-level, stuff.
845 864
846L<AnyEvent::MP::Global> - network maintainance and port groups, to find 865L<AnyEvent::MP::Global> - network maintainance and port groups, to find
847your applications. 866your applications.
848 867
868L<AnyEvent::MP::LogCatcher> - simple service to display log messages from
869all nodes.
870
849L<AnyEvent>. 871L<AnyEvent>.
850 872
851=head1 AUTHOR 873=head1 AUTHOR
852 874
853 Marc Lehmann <schmorp@schmorp.de> 875 Marc Lehmann <schmorp@schmorp.de>

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines