From e66bce633b449abdb8220f88c3cba7f04b1ae5a7 Mon Sep 17 00:00:00 2001 From: Connor Rigby Date: Mon, 11 Dec 2017 19:15:02 -0800 Subject: [PATCH] Refresh token more often if disconnected --- lib/farmbot/bootstrap/auth_task.ex | 19 ++++++++++++++++--- lib/farmbot/bot_state/transport/amqp/amqp.ex | 14 ++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/lib/farmbot/bootstrap/auth_task.ex b/lib/farmbot/bootstrap/auth_task.ex index 5f454c20..c4c7ef39 100644 --- a/lib/farmbot/bootstrap/auth_task.ex +++ b/lib/farmbot/bootstrap/auth_task.ex @@ -12,6 +12,10 @@ defmodule Farmbot.Bootstrap.AuthTask do GenServer.start_link(__MODULE__, [], [name: __MODULE__]) end + def force_refresh do + GenServer.call(__MODULE__, :force_refresh) + end + def init([]) do timer = Process.send_after(self(), :refresh, @refresh_time) {:ok, timer, :hibernate} @@ -32,10 +36,19 @@ defmodule Farmbot.Bootstrap.AuthTask do refresh_timer(self()) {:error, reason} -> Logger.error(1, "Token failed to reauthorize: #{auth_task} - #{email} - #{server} #{inspect reason}") - refresh_timer(self()) + refresh_timer(self(), 30_000) end end + def handle_call(:force_refresh, _, old_timer) do + Logger.info 1, "Forcing a token refresh." + if Process.read_timer(old_timer) do + Process.cancel_timer(old_timer) + end + send self(), :refresh + {:reply, :ok, nil} + end + defp restart_transports do :ok = Supervisor.terminate_child(Farmbot.Bootstrap.Supervisor, Farmbot.BotState.Transport.Supervisor) case Supervisor.restart_child(Farmbot.Bootstrap.Supervisor, Farmbot.BotState.Transport.Supervisor) do @@ -46,8 +59,8 @@ defmodule Farmbot.Bootstrap.AuthTask do end end - defp refresh_timer(pid) do - timer = Process.send_after(pid, :refresh, @refresh_time) + defp refresh_timer(pid, ms \\ @refresh_time) do + timer = Process.send_after(pid, :refresh, ms) {:noreply, timer, :hibernate} end diff --git a/lib/farmbot/bot_state/transport/amqp/amqp.ex b/lib/farmbot/bot_state/transport/amqp/amqp.ex index d26bb1a9..a4c78ef4 100644 --- a/lib/farmbot/bot_state/transport/amqp/amqp.ex +++ b/lib/farmbot/bot_state/transport/amqp/amqp.ex @@ -48,6 +48,20 @@ defmodule Farmbot.BotState.Transport.AMQP do end end + def terminate(_reason, state) do + if state.chan do + AMQP.Channel.close(state.chan) + end + + if state.conn do + AMQP.Connection.close(state.conn) + end + + if Process.whereis(Farmbot.Bootstrap.AuthTask) do + Farmbot.Bootstrap.AuthTask.force_refresh() + end + end + def handle_events(events, {pid, _}, state) do case Process.info(pid)[:registered_name] do Farmbot.Logger -> handle_log_events(events, state)