You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
23:24:54.246 [info] global: Name conflict terminating {:singleton, #PID<18487.303.0>}
But what is unexpected is that not only the singleton process is terminated, but the whole application on one of the nodes:
23:25:47.517 [info] Application wpc5_singleton exited: killed
And one of the nodes basically is left in a state where my own application is not running, only the “libraries” continue running.
I have a Phoenix application running across multiple nodes, and I want this Singleton process to run on a single node and be used by all nodes. However, I see that the only node that says running is the one running the Singleton process.
defmodulePento.ApplicationdouseApplication@impltruedefstart(_type,_args)dochildren=[PentoWeb.Telemetry,Pento.Repo,{DNSCluster,query: Application.get_env(:pento,:dns_cluster_query)||:ignore},{Phoenix.PubSub,name: Pento.PubSub},# Start the Finch HTTP client for sending emails{Finch,name: Pento.Finch},{Singleton.Supervisor,name: Pento.Singleton},# Start to serve requests, typically the last entryPentoWeb.Endpoint,]opts=[strategy: :one_for_one,name: Pento.Supervisor]Supervisor.start_link(children,opts)# start singleton service for the global click counterSingleton.start_child(Pento.Singleton,Pento.Guesses.CounterServer,[],Pento.Guesses.CounterServer)end...end
I think the reason could be that Application.start callback expects the return value to be {:ok, pid} of the top supervisor.
In the example above the Singleton {:ok, pid} is returned instead. It seems that changing the code to return the app supervisor pid resolves the issue.
defmodulePento.ApplicationdouseApplication@impltruedefstart(_type,_args)dochildren=[PentoWeb.Telemetry,Pento.Repo,{DNSCluster,query: Application.get_env(:pento,:dns_cluster_query)||:ignore},{Phoenix.PubSub,name: Pento.PubSub},# Start the Finch HTTP client for sending emails{Finch,name: Pento.Finch},{Singleton.Supervisor,name: Pento.Singleton},# Start to serve requests, typically the last entryPentoWeb.Endpoint,]opts=[strategy: :one_for_one,name: Pento.Supervisor]app_supervisor=Supervisor.start_link(children,opts)Singleton.start_child(Pento.Singleton,Pento.Guesses.CounterServer,[],Pento.Guesses.CounterServer)app_supervisorend...end
Activity
RodolfoSilva commentedon Feb 15, 2024
@jclement have you tried putting Singleton.Supervisor as the last children?
Abdallahj94 commentedon Apr 28, 2024
@jclement have you managed to solve this? we're facing the same issue
vhyza commentedon Jul 7, 2024
Hello @jclement and @Abdallahj94,
I think the reason could be that Application.start callback expects the return value to be
{:ok, pid}of the top supervisor.In the example above the Singleton
{:ok, pid}is returned instead. It seems that changing the code to return the app supervisor pid resolves the issue.