Now I have SASL reports for my app and the following transpires:
2016-04-3011:59:51.496[ERR/connector.ex:43] Received error when listening on TCP port, reason was :closed
2016-04-3011:59:51.496[ERR/SASL] GenServer {:connector, 1} terminating | ** (stop) :error
2016-04-3011:59:51.498[ERR/SASL] Process #PID<0.235.0> terminating
** (exit) :error
(stdlib) gen_server.erl:826: :gen_server.terminate/7
(stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
Initial Call: Connector.init/1
Ancestors: [#PID<0.233.0>, MyMod.Supervisor, #PID<0.181.0>]
2016-04-3011:59:51.498[ERR/SASL] Child {:connection, 1} of Supervisor {:supervisor, 1} shutdown abnormally | ** (exit) :error | Pid: #PID<0.235.0> | Start Call: Connector.start_link(1, #Port<0.7095>)
2016-04-3011:59:51.498[INF/SASL] Application myapp exited: normal
In my application startup I create a TCP listener port:
{ :ok, listenSocket } = :gen_tcp.listen(readUeTcpPort(), [:binary, active: true, packet: :raw, reuseaddr: true])
I then give the listenSocket to each worker child I start:
def addWorker(workerId, listenSocket) do
Supervisor.start_child(MyMod.Supervisor,
supervisor(Worker.Supervisor, [workerId, listenSocket], restart: :transient, id: {:worker, workerId}, shutdown: :infinity))
end
These workers run their init/1 and send themselves a GenServer.call that makes them wait on :gen_tcp.accept. The first worker is dynamically created during the run of my application’s start/2.
Whenever a new client is accepted, the worker immediately calls MyMod.addWorker to start the next process waiting on the listen port.
Now, when I stop the supervisor of the first group of workers, something odd happens. The 2nd worker suddenly drops out of its :gen_tcp.accept call it is sleeping on with an error. Apparently the listenSocket is somehow closed. And somehow this leads to my whole application to quietly shut down with exit :normal.
Any ideas?






















