Re: erlang cluster partitioned

Dániel Szoboszlay <[email protected]>
Newsgroups gmane.comp.lang.erlang.general
Message-ID <CADcfxomsLkroz+-bgj+gQ3fkHE79+0qpRf5CFx=aiN8YbfBr5w@mail.gmail.com>
>
> We have a set of designated erlang nodes that every other node routinely
> pings and the hope is that they'll all discover the rest of each other
> through them.
>

The discovery of neighbours only happens when establishing connection to a
node. If I understand correctly, you do repeated pings to restore broken
connections too, but that won't work. E.g. if node A and B are connected,
and a freshly started node C pings B, it will learn about A and connect to
it, forming a full mesh. However, if later the connection between A and C
breaks down, but B remains connected to both A and C, pinging B from either
A or C won't help restoring the broken connection.


> Restarting this subset didn't really help.
>
This is strange, restarting a node would imply it makes a new connection to
a central node and from there should be able to discover and connect to the
entire network. Are you sure there is nothing like a firewall on the
network that would prevent island nodes from making outgoing connections to
the non-central nodes, but would let all nodes make outgoing connections to
the island nodes?

We also ran into problems with global registration calls that were stuck on
> those island nodes but we think that's more of a symptom than a cause as we
> ran partitioned.
>
If a global call is stuck, it suggests the global_name_server processes
know about all the nodes, but can't communicate with them. Or maybe the
global_name_server processes run into some kind of deadlock waiting for
each other and thus not handling requests? That could even explain why
restarting the nodes one-by-one didn't help (the neighbour discovery is the
responsibility of gloal_name_servers).

I'd suggest finding out what the global_name_servers are up to if this
problem occurs again. You can check with process_info whether they are
idling (the current function being gen_server:loop/7) or not, then query
the state of idle processes with sys:get_state/1 and the entire call stack
of busy processes with process_info(whereis(global_name_server),
backtrace). Inspecting the global_* ETS tables may also help understanding
the situation.

Cheers,
Daniel

>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.