global singleton gen_server

Vyacheslav Levytskyy v.levytskyy@REDACTED
Thu Dec 16 20:09:18 CET 2021

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,

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