Fault-tolerance and distributed system
Scott Lystig Fritchie
fritchie@REDACTED
Sat Nov 30 19:57:23 CET 2002
>>>>> "hs" == Hal Snyder <hal@REDACTED> writes:
hs> Scott's example shows application but not supervision.
Wow, I forgot that I wrote that. Nowadays, I simply use old .rel and
.app files from earlier projects as templates for new projects.
Mailing list archives are a wonderful thing.
I've put a dumb, brute-force, but functional supervisor example at
http://www.snookles.com/erlang/misc/supervisor_example.tar.gz. After
extracting the source:
1. Change directory to the "src" subdirectory.
2. Run GNU make (or compatible): "make" or "gmake' or however it's
installed on your system.
3. Run "erl -pz ../ebin -boot foo" to start the "foo" application.
4. At the Erlang prompt, execute "appmon:start()."
The "foo" application has a single supervisor the monitors two
worker processes, both of which are generic servers that implement
simple integer counters. Each worker also spawn_links three
processes in order to make the appmon process tree look more
interesting.
Note that there are a bunch of io:format() debugging messages that
(hopefully) demonstrate how arguments are passed from start
functions to init functions.
5. Use commands like "increment:get1(counter1)." and
"increment:get_many(counter2, 100000)" to communicate with the two
counter servers.
6. Run "appmon:start()." to start the application monitor
application. A GUI window will pop up.
Click on the "foo" button. To demonstrate that the supervisors
are working correctly, click the "Kill" button and then the
"counter1" or "counter2" boxes. If either dies, the supervisor
will kill all children and then restart them. Note that the PIDs
of the counters' "children" change and that the SASL application
will spit out some messages to the console.
Killing one of the unnamed "child" processes will kill the "parent"
counter process because the counter process is not trapping process
exits ... which will then cause the foo_example_sup supervisor to
react.
One of the three "child" processes will exit after 15 seconds, but
because it exits with a 'normal' status, its parent is not killed.
Killing foo_example_sup will result in shutting down the
application because there is nobody to restart it.
Now, I can wait for Lennart or other OTP guru to criticise my example!
:-)
-Scott
More information about the erlang-questions
mailing list