diff options
author | Fred Hebert <[email protected]> | 2011-08-03 10:47:36 -0400 |
---|---|---|
committer | Fred Hebert <[email protected]> | 2011-08-23 14:31:09 -0400 |
commit | 4f9b938112a80f1c1e210b1a6af40a42f833cfa2 (patch) | |
tree | 9fb8fd96f584107c9592c0be3e603d9020a40b69 /lib/stdlib/doc/src | |
parent | 62f194499810270b488cc46a5e611f0be77f36a7 (diff) | |
download | otp-4f9b938112a80f1c1e210b1a6af40a42f833cfa2.tar.gz otp-4f9b938112a80f1c1e210b1a6af40a42f833cfa2.tar.bz2 otp-4f9b938112a80f1c1e210b1a6af40a42f833cfa2.zip |
fix supervisors restarting temporary children
In the current implementation of supervisors, temporary children
should never be restarted. However, when a temporary child is
restarted as part of a one_for_all or rest_for_one strategy where
the failing process is not the temporary child, the supervisor
still tries to restart it.
Because the supervisor doesn't keep some of the MFA information
of temporary children, this causes the supervisor to hit its
restart limit and crash.
This patch fixes the behaviour by inserting a clause in
terminate_children/2-3 (private function) that will omit temporary
children when building a list of killed processes, to avoid having
the supervisor trying to restart them again.
Only supervisors in need of restarting children used the list, so
the change should be of no impact for the functions that called
terminate_children/2-3 only to kill all children.
The documentation has been modified to make this behaviour
more explicit.
Diffstat (limited to 'lib/stdlib/doc/src')
-rw-r--r-- | lib/stdlib/doc/src/supervisor.xml | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/lib/stdlib/doc/src/supervisor.xml b/lib/stdlib/doc/src/supervisor.xml index 009aa60faa..edd119d37a 100644 --- a/lib/stdlib/doc/src/supervisor.xml +++ b/lib/stdlib/doc/src/supervisor.xml @@ -150,9 +150,12 @@ child_spec() = {Id,StartFunc,Restart,Shutdown,Type,Modules} <p><c>Restart</c> defines when a terminated child process should be restarted. A <c>permanent</c> child process should always be restarted, a <c>temporary</c> child process should - never be restarted and a <c>transient</c> child process - should be restarted only if it terminates abnormally, i.e. - with another exit reason than <c>normal</c>.</p> + never be restarted (even when the supervisor's restart strategy + is <c>rest_for_one</c> or <c>one_for_all</c> and a sibling's + death causes the temporary process to be terminated) and a + <c>transient</c> child process should be restarted only if + it terminates abnormally, i.e. with another exit reason + than <c>normal</c>.</p> </item> <item> <p><c>Shutdown</c> defines how a child process should be |