Skip to content

Commit

Permalink
Merge pull request #898 from operable/kevsmith/restart-emqttd
Browse files Browse the repository at this point in the history
Fix emqttd mgmt;Refine process tree structure

Fixes #897
  • Loading branch information
Kevin Smith committed Aug 3, 2016
2 parents 0cc76c6 + 6ac071b commit 1cfcfe7
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 41 deletions.
35 changes: 5 additions & 30 deletions lib/cog.ex
Expand Up @@ -5,19 +5,11 @@ defmodule Cog do
import Supervisor.Spec, warn: false

def start(_type, _args) do
adapter_supervisor = get_adapter_supervisor!()
children = [worker(Cog.Repo, []),
worker(Cog.BusDriver, [], shutdown: 10000),
worker(Cog.TokenReaper, []),
supervisor(Cog.Relay.RelaySup, []),
supervisor(Cog.Command.CommandSup, []),
supervisor(adapter_supervisor, []),
supervisor(Cog.Endpoint, []),
supervisor(Cog.TriggerEndpoint, []),
supervisor(Cog.ServiceEndpoint, []),
supervisor(Cog.Adapters.Http.Supervisor,[])]

opts = [strategy: :one_for_one, name: Cog.Supervisor]
children = [worker(Cog.BusDriver, [], shutdown: 1000),
worker(Cog.Repo, []),
supervisor(Cog.CoreSup, [])]

opts = [strategy: :one_for_all, name: Cog.Supervisor]
case Supervisor.start_link(children, opts) do
{:ok, top_sup} ->
# Verify the latest schema migration after starting the database worker
Expand Down Expand Up @@ -113,23 +105,6 @@ defmodule Cog do
end
end

defp get_adapter_supervisor!() do
case chat_adapter_module do
{:ok, adapter} ->
Logger.info "Using #{inspect adapter} chat adapter"
supervisor = Module.concat(adapter, "Supervisor")

case Code.ensure_loaded(supervisor) do
{:module, ^supervisor} ->
supervisor
{:error, _} ->
raise RuntimeError, "#{inspect(supervisor)} was not found. Please define a supervisor for the #{inspect(adapter)} adapter"
end
{:error, {:bad_adapter, bad_adapter}} ->
raise RuntimeError, "The adapter is set to #{inspect(bad_adapter)}, but I don't know what that is. Try one of the following values instead: #{Enum.map_join(Map.keys(chat_adapters), ", ", &inspect/1)}"
end
end

defp verify_schema_migration! do
case migration_status do
:ok ->
Expand Down
18 changes: 7 additions & 11 deletions lib/cog/bus_driver.ex
Expand Up @@ -24,27 +24,28 @@ defmodule Cog.BusDriver do
use GenServer

def start_link() do
GenServer.start_link(__MODULE__, [])
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end

def init(_) do
reset_mnesia_data()
case configure_message_bus() do
{:ok, [app_name]} ->
case Application.ensure_all_started(app_name) do
:ok ->
{:ok, _} ->
:erlang.process_flag(:trap_exit, true)
{:ok, app_name}
error ->
error
{:stop, error}
end
error ->
Logger.error("Message bus configuration error: #{inspect error}")
{:stop, :shutdown}
end
end

def terminate(_, app_name) do
Application.stop(app_name)
def terminate(_, _) do
Application.stop(:emqttd)
Application.stop(:esockd)
end

defp configure_message_bus() do
Expand Down Expand Up @@ -123,9 +124,4 @@ defmodule Cog.BusDriver do
end
end

defp reset_mnesia_data() do
mnesia_dir = :mnesia.system_info(:directory) |> String.Chars.to_string
File.rm_rf!(mnesia_dir)
end

end
40 changes: 40 additions & 0 deletions lib/cog/core_sup.ex
@@ -0,0 +1,40 @@
defmodule Cog.CoreSup do
require Logger
use Supervisor

def start_link() do
Supervisor.start_link(__MODULE__, [])
end

def init(_) do
adapter_supervisor = get_adapter_supervisor!()
children = [worker(Cog.TokenReaper, []),
supervisor(Cog.Relay.RelaySup, []),
supervisor(Cog.Command.CommandSup, []),
supervisor(adapter_supervisor, []),
supervisor(Cog.Endpoint, []),
supervisor(Cog.TriggerEndpoint, []),
supervisor(Cog.ServiceEndpoint, []),
supervisor(Cog.Adapters.Http.Supervisor,[])]
{:ok, {%{strategy: :one_for_one, intensity: 10, period: 60}, children}}
end

defp get_adapter_supervisor!() do
case Cog.chat_adapter_module do
{:ok, adapter} ->
Logger.info "Using #{inspect adapter} chat adapter"
supervisor = Module.concat(adapter, "Supervisor")

case Code.ensure_loaded(supervisor) do
{:module, ^supervisor} ->
supervisor
{:error, _} ->
raise RuntimeError, "#{inspect(supervisor)} was not found. Please define a supervisor for the #{inspect(adapter)} adapter"
end
{:error, {:bad_adapter, bad_adapter}} ->
raise RuntimeError, "The adapter is set to #{inspect(bad_adapter)}, but I don't know what that is. Try one of the following values instead: #{Enum.map_join(Map.keys(Cog.chat_adapters), ", ", &inspect/1)}"
end
end


end

0 comments on commit 1cfcfe7

Please sign in to comment.