defmodule Edeliver.Relup.Instructions.SoftPurge do
@moduledoc """
Upgrade instruction which replaces `:brutal_purge` with `:soft_purge`
for `:load_module`, `:load`, `:update` and `:remove` relup instructions.
If `:brutal_purge` is used, processes running old code are killed.
If `:soft_purge` is used the release handler will refuse to start
the upgrade.
"""
use Edeliver.Relup.Instruction
def modify_relup(instructions = %Instructions{}, _config = %{}) do
%{instructions|
up_instructions: replace_brutal_purge_with_soft_purge(instructions.up_instructions, []),
down_instructions: replace_brutal_purge_with_soft_purge(instructions.down_instructions, [])
}
end
defp replace_brutal_purge_with_soft_purge([{:load, {module, :brutal_purge, post_purge}}|rest], modified_instructions), do: \
replace_brutal_purge_with_soft_purge(rest, [{:load, {module, :soft_purge, post_purge}}|modified_instructions])
defp replace_brutal_purge_with_soft_purge([{:update, module, change, :brutal_purge, post_purge, dep_mods}|rest], modified_instructions), do: \
replace_brutal_purge_with_soft_purge(rest, [{:update, module, change, :soft_purge, post_purge, dep_mods}|modified_instructions])
defp replace_brutal_purge_with_soft_purge([{:update, module, timeout, change, :brutal_purge, post_purge, dep_mods}|rest], modified_instructions), do: \
replace_brutal_purge_with_soft_purge(rest, [{:update, module, timeout, change, :soft_purge, post_purge, dep_mods}|modified_instructions])
defp replace_brutal_purge_with_soft_purge([{:update, module, mod_type, timeout, change, :brutal_purge, post_purge, dep_mods}|rest], modified_instructions), do: \
replace_brutal_purge_with_soft_purge(rest, [{:update, module, mod_type, timeout, change, :soft_purge, post_purge, dep_mods}|modified_instructions])
defp replace_brutal_purge_with_soft_purge([{:load_module, module, :brutal_purge, post_purge, dep_mods}|rest], modified_instructions), do: \
replace_brutal_purge_with_soft_purge(rest, [{:load_module, module, :brutal_purge, post_purge, dep_mods}|modified_instructions])
defp replace_brutal_purge_with_soft_purge([{:remove, {module, :brutal_purge, post_purge}}|rest], modified_instructions), do: \
replace_brutal_purge_with_soft_purge(rest, [{:remove, {module, :brutal_purge, post_purge}}|modified_instructions])
defp replace_brutal_purge_with_soft_purge([first|rest], modified_instructions), do: \
replace_brutal_purge_with_soft_purge(rest, [first|modified_instructions])
defp replace_brutal_purge_with_soft_purge([], modified_instructions), do: Enum.reverse(modified_instructions)
end