global singleton gen_server

Roberto Ostinelli ostinelli@REDACTED
Thu Dec 16 20:49:55 CET 2021

That's what I was going for.

But I found out why my solution doesn't work: unfortunately I cannot use
global's registration, because I'm using the erl flags `-connect_all false
-kernel dist_auto_connect never` as I need to control the way nodes connect
to each other:

If this is not desired, command-line flag -connect_all false can be used
(see also erl(1)). In this case, the name registration service cannot be
used, but the lock mechanism still works.

On Thu, Dec 16, 2021 at 8:09 PM Vyacheslav Levytskyy <v.levytskyy@REDACTED>

> I have similar problem, and didn't find an ultimate solution yet. My
> current approach is to register the singleton gen_server using {via,
> my_global_module, my_regname(...)} rather than {global, ?MODULE}. In
> "my_global_module" I control how a conflict is resolved between running
> server and a new one. In the "resolve" callback of global:register_name I'm
> able to query for each of gen_server's version and decide which of two
> gen_server lives and which is to shut down. This helps also in case of
> rolling updates.
> Best regards,
> Vyacheslav
> On 16.12.2021 19:34, Roberto Ostinelli wrote:
> Not necessarily. By the time your first gen_server start you might already
> have more than one node in your cluster.
> I'm ok having other nodes joining later on, I'm trying to avoid a clash
> where multiple nodes execute the "cluster init" code
> On Thu, Dec 16, 2021 at 3:48 PM Roger Lipscombe <roger@REDACTED>
> wrote:
>> Define "cluster start". In normal operation, there's nothing stopping
>> another node from joining the cluster at some arbitrary later time,
>> even days later. The first node to come up is a degenerate, single
>> node cluster, no?
>> On Thu, 16 Dec 2021 at 11:00, Roberto Ostinelli <ostinelli@REDACTED>
>> wrote:
>> >
>> > Dear all,
>> > I'm trying to run an operation only once on cluster start but there's
>> clearly something that I'm missing in the global module (see other related
>> question here [1]).
>> >
>> > Therefore this time I'm trying to have a single global gen_server which
>> I start directly from application start/2 callback with:
>> > gen_server:start_link({global, ?MODULE}, ?MODULE, [], Options).
>> >
>> > Nodes are already connected at that point (I can see them with
>> nodes()), however for some reason this registration works on all the nodes
>> and I find myself with multiple gen_server registered globally.
>> >
>> > What is the proper way to register a global singleton gen_server at
>> cluster level on application start? mY need is to run an operation only
>> _once_ a cluster boots up.
>> >
>> > [1]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the erlang-questions mailing list