Skip to content

Commit

Permalink
Properly purge
Browse files Browse the repository at this point in the history
  • Loading branch information
chrismccord committed Jun 17, 2024
1 parent 131a753 commit a54be5a
Showing 1 changed file with 38 additions and 32 deletions.
70 changes: 38 additions & 32 deletions lib/flame/code_sync.ex
Original file line number Diff line number Diff line change
Expand Up @@ -197,14 +197,7 @@ defmodule FLAME.CodeSync do

File.rm(target_tmp_path)

# purge any deleted modules
for mod <- pkg.purge_modules do
if pkg.verbose && !Enum.empty?(pkg.purge_modules),
do: log_verbose("purging #{inspect(pkg.purge_modules)}")

:code.purge(mod)
:code.delete(mod)
end
purge(pkg, pkg.purge_modules, "deleted modules")

# delete any deleted code paths, and prune empty dirs
for del_path <- pkg.deleted_paths do
Expand All @@ -217,8 +210,6 @@ defmodule FLAME.CodeSync do
:code.del_path(String.to_charlist(ebin_dir))
end
end

if pkg.verbose && !Enum.empty?(reloaded), do: log_verbose("reloaded #{inspect(reloaded)}")
end

# start any synced apps
Expand Down Expand Up @@ -257,32 +248,38 @@ defmodule FLAME.CodeSync do
end

defp add_code_paths_from_tar(%PackagedStream{} = pkg, extract_dir) do
pkg.changed_paths
|> Enum.reduce({_consolidated = [], _regular = [], _beams = []}, fn rel_path,
{cons, reg, beams} ->
init = %{cons_paths: [], reg_paths: [], beams_paths: [], purge_mods: [], seen: MapSet.new()}

Enum.reduce(pkg.changed_paths, init, fn rel_path, acc ->
new_seen = MapSet.put(acc.seen, rel_path)
dir = extract_dir |> Path.join(rel_path) |> Path.dirname()

# purge consolidated protocols
with "consolidated" <- Path.basename(dir),
[mod_str, ""] <- rel_path |> Path.basename() |> String.split(".beam") do
mod = Module.concat([mod_str])
if pkg.verbose, do: log_verbose("purging consolidated protocol #{inspect(mod)}")
:code.purge(mod)
:code.delete(mod)
{[dir | cons], reg, beams}
else
_ ->
case pkg.sync_beam_hashes do
%{^rel_path => _} -> {cons, reg, [dir | beams]}
%{} -> {cons, [dir | reg], beams}
end
new_purge =
case rel_path |> Path.basename() |> String.split(".beam") do
[mod_str, ""] -> [Module.concat([mod_str]) | acc.purge_mods]
_ -> acc.purge_mods
end

cond do
MapSet.member?(acc.seen, rel_path) ->
acc

Path.basename(dir) == "consolidated" ->
%{acc | cons_paths: [dir | acc.cons_paths], purge_mods: new_purge, seen: new_seen}

pkg.sync_beam_hashes[rel_path] ->
%{acc | beams_paths: [dir | acc.beams_paths], purge_mods: new_purge, seen: new_seen}

true ->
%{acc | reg_paths: [dir | acc.reg_paths], new_purge: new_purge, seen: new_seen}
end
end)
|> then(fn {cons, reg, beams} ->
# consolidated already in reverse order, which is what we want for prepend
consolidated = Enum.uniq(cons)
regular = Enum.uniq(reg)
sync_beams = Enum.uniq(beams)
|> then(fn %{cons_paths: cons, reg_paths: reg, beams_paths: beams, purge_mods: purge} ->
consolidated = Enum.reverse(cons)
regular = Enum.reverse(reg)
sync_beams = Enum.reverse(beams)

purge(pkg, purge, "updated beams")

if pkg.verbose do
if !Enum.empty?(consolidated),
Expand All @@ -303,4 +300,13 @@ defmodule FLAME.CodeSync do
defp log_verbose(msg) do
Logger.info("[CodeSync #{inspect(node())}] #{msg}")
end

defp purge(%PackagedStream{} = pkg, mods, kind) do
if pkg.verbose && !Enum.empty?(mods), do: log_verbose("purging #{kind} #{inspect(mods)}")

Enum.each(mods, fn mod when is_atom(mod) ->
:code.purge(mod)
:code.delete(mod)
end)
end
end

0 comments on commit a54be5a

Please sign in to comment.