From dfba6b53268cea9ebe107dadeac95bc0dde9cae2 Mon Sep 17 00:00:00 2001 From: Eishun Kondoh Date: Wed, 6 Jun 2018 20:13:21 +0900 Subject: [PATCH] tres/message_handler_sup: Fix to use supervisor instead of dynamic_supervisor --- bin/enum_gen | Bin 1423527 -> 1424376 bytes lib/tres/controller.ex | 14 +++++++++++++- lib/tres/message_handler_sup.ex | 28 +++++++++++++++++++++------- lib/tres/secure_channel.ex | 32 +++++++++++++------------------- 4 files changed, 47 insertions(+), 27 deletions(-) diff --git a/bin/enum_gen b/bin/enum_gen index bdee2a64f390d1a6c897b06e4d24947f7847128e..755d865087f977283ca90add8d18863ce5faf07e 100755 GIT binary patch delta 34224 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

tcR@M}79N}ad#$K6 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 E0O$<&i2wiq diff --git a/lib/tres/controller.ex b/lib/tres/controller.ex index 49723fa..62cd4ed 100644 --- a/lib/tres/controller.ex +++ b/lib/tres/controller.ex @@ -1,6 +1,6 @@ defmodule Tres.Controller do def controller_helpers do - quote do + quote location: :keep do import Tres.SwitchRegistry, only: [ send_message: 2, @@ -11,6 +11,18 @@ defmodule Tres.Controller do use Tres.Messages use Tres.MessageHelper + + def handler_spec(dpid) do + {cb_mod, cb_args} = Tres.Utils.get_callback_module() + %{ + id: {__MODULE__, dpid}, + start: {cb_mod, :start_link, [[dpid, cb_args]]}, + restart: :permanent, + shutdown: 5000, + type: :worker, + modules: [__MODULE__] + } + end end end diff --git a/lib/tres/message_handler_sup.ex b/lib/tres/message_handler_sup.ex index 2c83ade..562b476 100644 --- a/lib/tres/message_handler_sup.ex +++ b/lib/tres/message_handler_sup.ex @@ -1,22 +1,36 @@ defmodule Tres.MessageHandlerSup do - use DynamicSupervisor + use Supervisor def start_link() do - DynamicSupervisor.start_link(__MODULE__, [], name: __MODULE__) + Supervisor.start_link(__MODULE__, [], name: __MODULE__) end def init(_init_args) do - DynamicSupervisor.init(strategy: :one_for_one) + children = [] + Supervisor.init( + children, + strategy: :one_for_one, + max_restarts: 5, + max_seconds: 10 + ) end - def start_child({dpid, aux_id}) do - {cb_mod, cb_args} = Tres.Utils.get_callback_module() - DynamicSupervisor.start_child(__MODULE__, {cb_mod, [{dpid, aux_id}, cb_args]}) + def start_child(dpid) do + {cb_mod, _cb_args} = Tres.Utils.get_callback_module() + child_spec = cb_mod.handler_spec(dpid) + Supervisor.start_child(__MODULE__, child_spec) + end + + def terminate_child(dpid) do + {cb_mod, _cb_args} = Tres.Utils.get_callback_module() + child_spec = cb_mod.handler_spec(dpid) + _ = Supervisor.terminate_child(__MODULE__, child_spec[:id]) + _ = Supervisor.delete_child(__MODULE__, child_spec[:id]) end @spec count_handlers() :: non_neg_integer() def count_handlers do - count_value = DynamicSupervisor.count_children(__MODULE__) + count_value = Supervisor.count_children(__MODULE__) count_value[:active] end end diff --git a/lib/tres/secure_channel.ex b/lib/tres/secure_channel.ex index a688963..05e723d 100644 --- a/lib/tres/secure_channel.ex +++ b/lib/tres/secure_channel.ex @@ -612,50 +612,44 @@ defmodule Tres.SecureChannel do {:stop, :normal, %{state_data | socket: nil}} end - defp close_connection(:handler_error = disconnected_reason, state_data) do + defp close_connection(:handler_error, state_data) do debug("connection terminated: Got handler error") - %State{handler_pid: handler_pid} = state_data - send(handler_pid, {:switch_disconnected, disconnected_reason}) + Tres.MessageHandlerSup.terminate_child({state_data.datapath_id, state_data.aux_id}) {:stop, :normal, %{state_data | socket: nil}} end - defp close_connection(:ping_failed = disconnected_reason, state_data) do + defp close_connection(:ping_failed, state_data) do debug("connection terminated: Exceeded to max_ping_fail_count") - %State{handler_pid: handler_pid} = state_data - send(handler_pid, {:switch_disconnected, disconnected_reason}) + Tres.MessageHandlerSup.terminate_child({state_data.datapath_id, state_data.aux_id}) {:stop, :normal, %{state_data | socket: nil}} end - defp close_connection({:main_closed = disconnected_reason, reason}, state_data) do + defp close_connection({:main_closed, reason}, state_data) do debug("connection terminated: Main connection down by #{inspect(reason)}") - %State{handler_pid: handler_pid} = state_data - send(handler_pid, {:switch_disconnected, disconnected_reason}) + Tres.MessageHandlerSup.terminate_child({state_data.datapath_id, state_data.aux_id}) {:stop, :normal, %{state_data | socket: nil}} end - defp close_connection({:handler_down = _disconnected_reason, reason}, state_data) do + defp close_connection({:handler_down, reason}, state_data) do debug("connection terminated: Handler process down by #{inspect(reason)}") {:stop, :normal, %{state_data | socket: nil}} end - defp close_connection({:trap_detected = disconnected_reason, reason}, state_data) do + defp close_connection({:trap_detected, reason}, state_data) do debug("connection terminated: Trapped by #{inspect(reason)}") - %State{handler_pid: handler_pid} = state_data - send(handler_pid, {:switch_disconnected, disconnected_reason}) + Tres.MessageHandlerSup.terminate_child({state_data.datapath_id, state_data.aux_id}) {:stop, :normal, %{state_data | socket: nil}} end - defp close_connection(:tcp_closed = disconnected_reason, state_data) do + defp close_connection(:tcp_closed, state_data) do debug("connection terminated: TCP Closed by peer") - %State{handler_pid: handler_pid} = state_data - send(handler_pid, {:switch_disconnected, disconnected_reason}) + Tres.MessageHandlerSup.terminate_child({state_data.datapath_id, state_data.aux_id}) {:stop, :normal, %{state_data | socket: nil}} end - defp close_connection({:tcp_error, reason} = disconnected_reason, state_data) do + defp close_connection({:tcp_error, reason}, state_data) do debug("connection terminated: TCP Error occured: #{inspect(reason)}") - %State{handler_pid: handler_pid} = state_data - send(handler_pid, {:switch_disconnected, disconnected_reason}) + Tres.MessageHandlerSup.terminate_child({state_data.datapath_id, state_data.aux_id}) {:stop, :normal, %{state_data | socket: nil}} end end