[erlang-questions] docs on group leaders?
Fred Hebert
mononcqc@REDACTED
Wed Apr 4 23:48:11 CEST 2018
On 04/04, Xavier Noria wrote:
>I have read descriptions about what is a group leader and understand the
>concept, but don't know which role plays exactly in the grand schema of
>things.
>
>I have checked books and online resources but don't get pass their
>functional description. For example, what is the point of having each
>application master become the group leader of its application? When do you
>change group leaders in an Erlang/Elixir application?
>
>Any pointers appreciated!
Group leaders let you redirect I/O to the right endpoint. It is one of
the few properties that is inherited by one process to the other,
creating a chain.
By default, an Erlang node has one group leader called 'user'. This
process owns communication with the stdio channels, and all input
requests and output messages transit through that one.
Then, each shell you start becomes its own group leader. This means that
any function you run from the shell will send all its IO data to that
shell process. When you enter the job mode with ^G and pick a shell (c
<number>), what this does is let a special shell-handling process
(usr_drv if memory serves) to pick which input and output to show. If
you have 50 shells from 50 different users, each one has to send their
traffic to the right endpoint.
As such, a slave node, or a shell from a remote node will set its group
leader to a foreign pid and automatically get all its descendent
processes' IO data rerouted to the right place automatically.
So that handles it for the very interactive side of things.
Each OTP application also has its own process--the application
master--becoming a group leader. By default this has no apparent use,
except for two things.
The first one is allowing each process to know which app it belongs to,
cheating with `application:get_env(Var)', as a shorter form than
`application:get_env(App, Var)`. If the process is started within the
app, it has access to the config; if not, it doesn't have it. This is
the only reason documented in a code comment for the usage of group
leaders.
The second usage is for when the application stops. This starts from the
otp-level, shutting down the supervision tree as normal. Then there's
one final step. Once the whole tree is shut down, the application
master calles 'processes()' to get all the pids on the node, and then
scans their group leaders to find out which pids belong to this specific
application, and then it kills them.
This is a final "garbage collecting" step for application processes.
Both usages are hijacking (or so it seems) the inheritance of group
leaders to track unsupervised children that are running wild out there,
and grouping them within the application family.
I don't know or remember if there's any use for them there aside from
that. It would be easy to imagine redirecting the output of some
applications to remote nodes specifically, on a per-app basis, but
currently the structure of things does not allow that as far as I can
tell.
Regards,
Fred.
More information about the erlang-questions
mailing list