diff options
author | kballou <kballou@devnulllabs.io> | 2016-10-31 03:23:48 -0600 |
---|---|---|
committer | kballou <kballou@devnulllabs.io> | 2016-10-31 04:03:09 -0600 |
commit | 3bcdc01d8de970905bf923e5cddc7a567d12de0e (patch) | |
tree | 740f36c7e5e78916c21be306e92d8e2f7c36dcad /lib | |
parent | 6ce4db4dfa1a5a137a83e4f7f56340a763d23fee (diff) | |
download | octochat-0.3.0.tar.gz octochat-0.3.0.tar.xz |
Level up our echo serverv0.3.0
This should enable upgrade process to retain connections
* Replace our simple task supervisor with a custom `simple_one_for_one`
supervisor
* Upgrade our echo server to use a `GenServer` behaviour
Diffstat (limited to 'lib')
-rw-r--r-- | lib/octochat/acceptor.ex | 6 | ||||
-rw-r--r-- | lib/octochat/server_supervisor.ex | 24 | ||||
-rw-r--r-- | lib/octochat/servers/echo.ex | 28 | ||||
-rw-r--r-- | lib/octochat/supervisor.ex | 2 |
4 files changed, 42 insertions, 18 deletions
diff --git a/lib/octochat/acceptor.ex b/lib/octochat/acceptor.ex index 5730ee4..28d14be 100644 --- a/lib/octochat/acceptor.ex +++ b/lib/octochat/acceptor.ex @@ -14,11 +14,7 @@ defmodule Octochat.Acceptor do defp loop_acceptor(socket) do {:ok, client} = :gen_tcp.accept(socket) - {:ok, pid} = Task.Supervisor.start_child( - Octochat.TaskSupervisor, - Octochat.Echo, - :serve, - [client]) + {:ok, pid} = Octochat.ServerSupervisor.start_server(client) :ok = :gen_tcp.controlling_process(client, pid) loop_acceptor(socket) end diff --git a/lib/octochat/server_supervisor.ex b/lib/octochat/server_supervisor.ex new file mode 100644 index 0000000..d412ca5 --- /dev/null +++ b/lib/octochat/server_supervisor.ex @@ -0,0 +1,24 @@ +defmodule Octochat.ServerSupervisor do + @moduledoc """ + Simple One-for-One Supervisor for socket connections + """ + + use Supervisor + + def start_link() do + Supervisor.start_link(__MODULE__, :ok, name: __MODULE__) + end + + def init(:ok) do + children = [ + worker(Octochat.Echo, [], restart: :temporary) + ] + + supervise(children, strategy: :simple_one_for_one) + end + + def start_server(socket) do + Supervisor.start_child(__MODULE__, [socket]) + end + +end diff --git a/lib/octochat/servers/echo.ex b/lib/octochat/servers/echo.ex index da04876..bea9864 100644 --- a/lib/octochat/servers/echo.ex +++ b/lib/octochat/servers/echo.ex @@ -2,23 +2,27 @@ defmodule Octochat.Echo do @moduledoc """ Octochat Echo server """ + use GenServer require Logger - def serve(socket) do - socket - |> read_line() - |> write_line!(socket) + def start_link(socket) do + GenServer.start_link(__MODULE__, socket) + end - serve(socket) + def init(socket) do + :ok = :inet.setopts(socket, active: true) + {:ok, %{socket: socket}} + end + + def handle_info({:tcp, _, msg}, state = %{socket: socket}) do + msg + |> write_line!(socket) + {:noreply, state} end - defp read_line(socket) do - case :gen_tcp.recv(socket, 0) do - {:ok, line} -> line - {:error, reason} -> - Logger.error(reason) - Process.exit(self, :normal) - end + def handle_info({:tcp_closed, _}, state) do + Logger.info("#{__MODULE__}: Connection closing") + {:stop, :normal, %{}} end defp write_line!(line, socket) do diff --git a/lib/octochat/supervisor.ex b/lib/octochat/supervisor.ex index d551628..9882942 100644 --- a/lib/octochat/supervisor.ex +++ b/lib/octochat/supervisor.ex @@ -11,7 +11,7 @@ defmodule Octochat.Supervisor do def init(_) do children = [ - supervisor(Task.Supervisor, [[name: Octochat.TaskSupervisor]]), + supervisor(Octochat.ServerSupervisor, []), worker(Task, [Octochat.Acceptor, :accept, []]) ] |