I have something like below in my application.ex
children = [
{Goth, name: MyApp.Goth},
MyApp.SomeService,
MyApp.Endpoint
]
opts = [strategy: :one_for_one, name: MyApp.Supervisor]
Supervisor.start_link(children, opts)
SomeService
looks like this:
defmodule MyApp.SomeService do
use GenServer
def start_link(opts \\ []) do
GenServer.start_link(__MODULE__, opts)
end
def init(args) do
{:ok, _} = Application.ensure_all_started(:goth)
with token <- Goth.fetch!(MyApp.Goth) do
# Use token, i.e. use it to fetch stuff from Google Cloud Secret Manager
end
{:ok, args}
end
end
With the code above I get this error:
** (Mix) Could not start application myapp: exited in: MyApp.Application.start(:normal, [])
** (EXIT) exited in: GenServer.call({:via, Registry, {Goth.Registry, MyApp.Goth}}, :fetch, 5000)
** (EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started
Is the call to Application.ensure_all_started
not enough. Am I using goth and supervisor wrongly?
This is unexpected, the usage seems correct. Could you create a brand new mix project with just goth and verify it works? And then brand new Phoenix project with just goth?
Application.ensure_all_started(:goth)
should not be needed if you add goth to your deps:
defp deps do
[
# ...
{:goth, "~> 1.4"},
# ...
]
end
2 Likes
Application.ensure_all_started(:goth)
was a last ditch effort to make it work but I think it doesn’t matter here.
You are right, brand new mix projects do work for me. When I checked it further it was because of another service which does this:
defmodule MyApp.BadService do
def child_spec(_args) do
children =
with token <- Goth.fetch!(MyApp.Goth) do
for index <- 0..10 do
# create something with Supervisor.child_spec() and token
end
end
%{
id: BadSupervisor,
type: :supervisor,
start: {Supervisor, :start_link, [children, [strategy: :one_for_one]]}
}
end
end
I think the manual supervisor setup here broke something, switching it to use Supervisor
fixed it for me. I wish the error message was able to pinpoint the file though since the service in my original post was the latest addition and it took the blame
I don’t think that’d work. I don’t know off the top my head when exactly child_spec/1 is being called by supervisor, ie whether it say computes all child specs first it calls them as it goes, but I have a feeling it is as if we wrote:
Goth.fetch!(MyGoth)
children = [
{Goth, name: MyGoth},
]
which obviously won’t work
1 Like
Something like this should work right? (Goth.fetch
should be called only after the Goth process started):
In application.ex
children = [
{Goth, name: MyApp.Goth},
MyApp.SomeService,
MyApp.BadService,
MyApp.Endpoint
]
opts = [strategy: :one_for_one, name: MyApp.Supervisor]
Supervisor.start_link(children, opts)
BadService
:
defmodule MyApp.BadService do
use Supervisor
def start_link(init_arg) do
Supervisor.start_link(__MODULE__, init_arg, name: __MODULE__)
end
@impl true
def init(_init_arg) do
children =
with token <- Goth.fetch!(MyApp.Goth) do
for index <- 0..10 do
# use token here
end
end
Supervisor.init(children, strategy: :one_for_one)
end
end
It works for me but I’m not sure if I miss anything. Thank you for helping me get this far!