Provided by: erlang-manpages_20.2.2+dfsg-1ubuntu2_all bug

NAME

       global_group - Grouping nodes to global name registration groups.

DESCRIPTION

       This  module makes it possible to partition the nodes of a system into global groups. Each
       global group has its own global namespace, see global(3erl).

       The main advantage of dividing systems into global groups  is  that  the  background  load
       decreases  while  the  number of nodes to be updated is reduced when manipulating globally
       registered names.

       The Kernel configuration parameter global_groups  defines  the  global  groups  (see  also
       kernel(7) and config(5)):

       {global_groups, [GroupTuple :: group_tuple()]}

       For  the  processes  and  nodes  to run smoothly using the global group functionality, the
       following criteria must be met:

         * An instance of the global group server, global_group, must be running  on  each  node.
           The processes are automatically started and synchronized when a node is started.

         * All  involved  nodes must agree on the global group definition, otherwise the behavior
           of the system is undefined.

         * All nodes in the system must belong to exactly one global group.

       In the following descriptions, a group node is a node belonging to the same  global  group
       as the local node.

DATA TYPES

       group_tuple() =
           {GroupName :: group_name(), [node()]} |
           {GroupName :: group_name(),
            PublishType :: publish_type(),
            [node()]}

              A GroupTuple without PublishType is the same as a GroupTuple with PublishType equal
              to normal.

       group_name() = atom()

       publish_type() = hidden | normal

              A node started with command-line flag -hidden (see erl(1)) is said to be  a  hidden
              node.  A  hidden  node establishes hidden connections to nodes not part of the same
              global group, but normal (visible) connections to nodes part  of  the  same  global
              group.

              A  global  group  defined  with  PublishType equal to hidden is said to be a hidden
              global group. All nodes in a hidden global group are hidden nodes, whether they are
              started with command-line flag -hidden or not.

       name() = atom()

              A registered name.

       where() = {node, node()} | {group, group_name()}

EXPORTS

       global_groups() -> {GroupName, GroupNames} | undefined

              Types:

                 GroupName = group_name()
                 GroupNames = [GroupName]

              Returns a tuple containing the name of the global group that the local node belongs
              to, and the list of all other known group names. Returns  undefined  if  no  global
              groups are defined.

       info() -> [info_item()]

              Types:

                 info_item() =
                     {state, State :: sync_state()} |
                     {own_group_name, GroupName :: group_name()} |
                     {own_group_nodes, Nodes :: [node()]} |
                     {synched_nodes, Nodes :: [node()]} |
                     {sync_error, Nodes :: [node()]} |
                     {no_contact, Nodes :: [node()]} |
                     {other_groups, Groups :: [group_tuple()]} |
                     {monitoring, Pids :: [pid()]}
                 sync_state() = no_conf | synced

              Returns a list containing information about the global groups. Each list element is
              a tuple. The order of the tuples is undefined.

                {state, State}:
                  If the local node is part of a global group, State is equal to  synced.  If  no
                  global groups are defined, State is equal to no_conf.

                {own_group_name, GroupName}:
                  The name (atom) of the group that the local node belongs to.

                {own_group_nodes, Nodes}:
                  A list of node names (atoms), the group nodes.

                {synced_nodes, Nodes}:
                  A  list  of  node  names, the group nodes currently synchronized with the local
                  node.

                {sync_error, Nodes}:
                  A list of node names, the group nodes with which the local node has  failed  to
                  synchronize.

                {no_contact, Nodes}:
                  A  list  of  node  names,  the  group  nodes  to  which  there are currently no
                  connections.

                {other_groups, Groups}:
                  Groups is a list of tuples {GroupName, Nodes}, specifying the name and nodes of
                  the other global groups.

                {monitoring, Pids}:
                  A  list  of  pids,  specifying the processes that have subscribed to nodeup and
                  nodedown messages.

       monitor_nodes(Flag) -> ok

              Types:

                 Flag = boolean()

              Depending on Flag, the calling process starts subscribing (Flag equal to  true)  or
              stops subscribing (Flag equal to false) to node status change messages.

              A  process  that has subscribed receives the messages {nodeup, Node} and {nodedown,
              Node} when a group node connects or disconnects, respectively.

       own_nodes() -> Nodes

              Types:

                 Nodes = [Node :: node()]

              Returns the names of all group nodes, regardless of their current status.

       registered_names(Where) -> Names

              Types:

                 Where = where()
                 Names = [Name :: name()]

              Returns a list of all names that are globally registered on the specified  node  or
              in the specified global group.

       send(Name, Msg) -> pid() | {badarg, {Name, Msg}}

       send(Where, Name, Msg) -> pid() | {badarg, {Name, Msg}}

              Types:

                 Where = where()
                 Name = name()
                 Msg = term()

              Searches  for  Name,  globally registered on the specified node or in the specified
              global group, or (if argument Where is not  provided)  in  any  global  group.  The
              global  groups  are  searched  in  the  order  that  they  appear  in  the value of
              configuration parameter global_groups.

              If Name is found, message Msg is sent to the corresponding pid. The pid is also the
              return  value  of  the  function.  If  the  name is not found, the function returns
              {badarg, {Name, Msg}}.

       sync() -> ok

              Synchronizes the group nodes, that is, the global name servers on the group  nodes.
              Also  checks  the  names  globally  registered  in  the  current  global  group and
              unregisters them on any known node not part of the group.

              If synchronization is not possible, an error report is sent  to  the  error  logger
              (see also error_logger(3erl).

              Returns   {error,  {'invalid  global_groups  definition',  Bad}}  if  configuration
              parameter global_groups has an invalid value Bad.

       whereis_name(Name) -> pid() | undefined

       whereis_name(Where, Name) -> pid() | undefined

              Types:

                 Where = where()
                 Name = name()

              Searches for Name, globally registered on the specified node or  in  the  specified
              global  group,  or  (if  argument  Where  is not provided) in any global group. The
              global groups are  searched  in  the  order  that  they  appear  in  the  value  of
              configuration parameter global_groups.

              If  Name is found, the corresponding pid is returned. If the name is not found, the
              function returns undefined.

NOTES

         * In the situation where a node has lost its connections to other nodes  in  its  global
           group,  but  has  connections  to nodes in other global groups, a request from another
           global group can produce an incorrect or misleading result. For example, the  isolated
           node can have inaccurate information about registered names in its global group.

         * Function send/2,3 is not secure.

         * Distribution  of  applications is highly dependent of the global group definitions. It
           is not recommended that an application is distributed over many global groups, as  the
           registered  names  can  be moved to another global group at failover/takeover. Nothing
           prevents this to be done, but the application code must then handle the situation.

SEE ALSO

       global(3erl), erl(1)