Skip to content

Commit 9cfb5cc

Browse files
authored
feat: epmdless deployments (#167)
1 parent 16c21e0 commit 9cfb5cc

File tree

4 files changed

+65
-22
lines changed

4 files changed

+65
-22
lines changed

apps/expert/lib/expert/engine_node.ex

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,21 @@ defmodule Expert.EngineNode do
2929

3030
def start(%__MODULE__{} = state, paths, from) do
3131
this_node = inspect(Node.self())
32+
dist_port = Expert.EPMD.dist_port()
3233

33-
args = [
34-
"--name",
35-
Project.node_name(state.project),
36-
"--cookie",
37-
state.cookie,
38-
"--no-halt",
39-
"-e",
40-
"Node.connect(#{this_node})"
41-
| path_append_arguments(paths)
42-
]
34+
args =
35+
[
36+
"--erl",
37+
"-start_epmd false -erl_epmd_port #{dist_port} -dist_listen false",
38+
"--name",
39+
Project.node_name(state.project),
40+
"--cookie",
41+
state.cookie,
42+
"--no-halt",
43+
"-e",
44+
"Node.connect(#{this_node}); IO.puts(\"ok\")"
45+
| path_append_arguments(paths)
46+
]
4347

4448
port = Expert.Port.open_elixir(state.project, args: args)
4549

@@ -110,7 +114,6 @@ defmodule Expert.EngineNode do
110114
use GenServer
111115

112116
def start(project) do
113-
:ok = ensure_epmd_started()
114117
start_net_kernel(project)
115118

116119
node_name = Project.node_name(project)
@@ -134,16 +137,6 @@ defmodule Expert.EngineNode do
134137
:rpc.call(node, Engine, :ensure_apps_started, [])
135138
end
136139

137-
defp ensure_epmd_started do
138-
case System.cmd("epmd", ~w(-daemon)) do
139-
{"", 0} ->
140-
:ok
141-
142-
_ ->
143-
{:error, :epmd_failed}
144-
end
145-
end
146-
147140
if Mix.env() == :test do
148141
# In test environment, Expert depends on the Engine app, so we look for it
149142
# in the expert build path.
@@ -278,7 +271,7 @@ defmodule Expert.EngineNode do
278271

279272
@impl true
280273
def handle_call({:start, paths}, from, %State{} = state) do
281-
:ok = :net_kernel.monitor_nodes(true, node_type: :visible)
274+
:ok = :net_kernel.monitor_nodes(true, node_type: :all)
282275
Process.send_after(self(), :maybe_start_timeout, @start_timeout)
283276
state = State.start(state, paths, from)
284277
{:noreply, state}

apps/expert/lib/expert/epmd.ex

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
defmodule Expert.EPMD do
2+
def dist_port do
3+
:persistent_term.get(:expert_dist_port, nil)
4+
end
5+
6+
# EPMD callbacks
7+
8+
def register_node(name, port), do: register_node(name, port, :inet)
9+
10+
def register_node(name, port, family) do
11+
:persistent_term.put(:expert_dist_port, port)
12+
13+
# We don't care if EPMD is not running
14+
case :erl_epmd.register_node(name, port, family) do
15+
{:error, _} -> {:ok, -1}
16+
{:ok, _} = ok -> ok
17+
end
18+
end
19+
20+
defdelegate start_link(), to: :erl_epmd
21+
defdelegate port_please(name, host), to: :erl_epmd
22+
defdelegate port_please(name, host, timeout), to: :erl_epmd
23+
defdelegate listen_port_please(name, host), to: :erl_epmd
24+
defdelegate address_please(name, host, family), to: :erl_epmd
25+
defdelegate names(host_name), to: :erl_epmd
26+
end

apps/expert/rel/remote.vm.args.eex

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
## Customize flags given to the VM: https://www.erlang.org/doc/man/erl.html
2+
## -mode/-name/-sname/-setcookie are configured via env vars, do not set them here
3+
4+
## Increase number of concurrent ports/sockets
5+
##+Q 65536
6+
7+
## Tweak GC to run more often
8+
##-env ERL_FULLSWEEP_AFTER 10
9+
10+
## Enable deployment without epmd
11+
## (requires changing both vm.args and remote.vm.args)
12+
-start_epmd false -dist_listen false

apps/expert/rel/vm.args.eex

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
## Customize flags given to the VM: https://www.erlang.org/doc/man/erl.html
2+
## -mode/-name/-sname/-setcookie are configured via env vars, do not set them here
3+
4+
## Increase number of concurrent ports/sockets
5+
##+Q 65536
6+
7+
## Tweak GC to run more often
8+
##-env ERL_FULLSWEEP_AFTER 10
9+
10+
## Enable deployment without epmd
11+
## (requires changing both vm.args and remote.vm.args)
12+
-start_epmd false -epmd_module Elixir.XPExpert.EPMD

0 commit comments

Comments
 (0)