Update/fix Omnibot.Irc.route_msg/2 to spawn a new task for each module, instead of a single task for all modules

Previously, if a message was supposed to be handled by 3 modules, they
would all be handled, synchronously, in the same process. If any of them
crashed, it would affect any other modules that needed to be processed
ahead of it.

Now, a new task is spun up for each module, so module handlers are now
indpendent.

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2020-06-13 20:56:02 -04:00
parent 5719e9e279
commit a627842717

View File

@@ -30,8 +30,15 @@ defmodule Omnibot.Irc do
defp route_msg(irc, msg) do defp route_msg(irc, msg) do
channel = Msg.channel(msg) channel = Msg.channel(msg)
State.channel_modules(channel) State.channel_modules(channel)
|> Enum.each(fn {module, _} -> module.on_msg(irc, msg) end) |> Enum.each(fn {module, _} ->
# Create a new task for each module
{:ok, _task} = Task.Supervisor.start_child(
Omnibot.RouterSupervisor,
fn -> module.on_msg(irc, msg) end
)
end)
end end
## Server callbacks ## Server callbacks
@@ -76,11 +83,7 @@ defmodule Omnibot.Irc do
msg = Msg.parse(line) msg = Msg.parse(line)
# Send the message to the router # Send the message to the router
irc = self() route_msg(self(), msg)
{:ok, _task} = Task.Supervisor.start_child(
Omnibot.RouterSupervisor,
fn -> route_msg(irc, msg) end
)
{:noreply, socket} {:noreply, socket}
end end
end end