Skip to content

Commit bb5c93b

Browse files
committed
feat: epmdless clustering
1 parent c5ac441 commit bb5c93b

File tree

21 files changed

+233
-25
lines changed

21 files changed

+233
-25
lines changed

apps/engine/test/test_helper.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
Application.ensure_all_started(:snowflake)
22
Application.ensure_all_started(:refactorex)
3-
{"", 0} = System.cmd("epmd", ~w(-daemon))
3+
44
random_number = :rand.uniform(500)
55

66
with :nonode@nohost <- Node.self() do
77
{:ok, _pid} =
8-
:net_kernel.start(:"testing-#{random_number}@127.0.0.1", %{name_domain: :longnames})
8+
:net_kernel.start(:"expert-manager-testing-#{random_number}", %{name_domain: :shortnames})
99
end
1010

1111
Engine.Module.Loader.start_link(nil)

apps/expert/lib/expert/application.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ defmodule Expert.Application do
6565
end
6666

6767
children = [
68+
{Forge.NodePortMapper, []},
6869
document_store_child_spec(),
6970
{DynamicSupervisor, Expert.Project.DynamicSupervisor.options()},
7071
{DynamicSupervisor, name: Expert.DynamicSupervisor},

apps/expert/lib/expert/engine_node.ex

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,30 @@ defmodule Expert.EngineNode do
2828
@dialyzer {:nowarn_function, start: 3}
2929

3030
def start(%__MODULE__{} = state, paths, from) do
31-
this_node = inspect(Node.self())
32-
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-
]
43-
44-
case Expert.Port.open_elixir(state.project, args: args) do
31+
this_node = to_string(Node.self())
32+
dist_port = Forge.EPMD.dist_port()
33+
34+
args =
35+
[
36+
"--erl",
37+
"-start_epmd false",
38+
"--sname",
39+
Project.node_name(state.project),
40+
"--cookie",
41+
state.cookie,
42+
"--no-halt",
43+
"-e",
44+
"Forge.NodePortMapper.register(); IO.puts(\"ok\")"
45+
| path_append_arguments(paths)
46+
]
47+
48+
env =
49+
[
50+
{"EXPERT_PARENT_NODE", this_node},
51+
{"EXPERT_PARENT_PORT", to_string(dist_port)}
52+
]
53+
54+
case Expert.Port.open_elixir(state.project, args: args, env: env) do
4555
{:error, :no_elixir, message} ->
4656
GenLSP.error(Expert.get_lsp(), message)
4757
Expert.terminate("Failed to find an elixir executable, shutting down", 1)
@@ -134,7 +144,7 @@ defmodule Expert.EngineNode do
134144

135145
defp start_net_kernel(%Project{} = project) do
136146
manager = Project.manager_node_name(project)
137-
:net_kernel.start(manager, %{name_domain: :longnames})
147+
:net_kernel.start(manager, %{name_domain: :shortnames})
138148
end
139149

140150
defp ensure_apps_started(node) do
@@ -294,7 +304,7 @@ defmodule Expert.EngineNode do
294304

295305
@impl true
296306
def handle_call({:start, paths}, from, %State{} = state) do
297-
:ok = :net_kernel.monitor_nodes(true, node_type: :visible)
307+
:ok = :net_kernel.monitor_nodes(true, node_type: :all)
298308
Process.send_after(self(), :maybe_start_timeout, @start_timeout)
299309

300310
case State.start(state, paths, from) do
@@ -365,7 +375,8 @@ defmodule Expert.EngineNode do
365375
end
366376

367377
@impl true
368-
def handle_info({_port, {:data, _message}}, %State{} = state) do
378+
def handle_info({_port, {:data, message}}, %State{} = state) do
379+
Logger.debug("Node port message: #{to_string(message)}")
369380
{:noreply, state}
370381
end
371382

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
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+
-epmd_module Elixir.XPForge.EPMD
13+
-start_epmd 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.XPForge.EPMD

apps/expert/test/engine/build_test.exs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ defmodule Engine.BuildTest do
4242
|> Project.workspace_path()
4343
|> File.rm_rf()
4444

45+
{:ok, _} = start_supervised(Forge.NodePortMapper)
4546
{:ok, _} = start_supervised({EngineSupervisor, project})
4647
{:ok, _, _} = EngineNode.start(project)
4748
EngineApi.register_listener(project, self(), [:all])
@@ -650,6 +651,7 @@ defmodule Engine.BuildTest do
650651

651652
describe ".exs files" do
652653
setup do
654+
start_supervised!({Forge.NodePortMapper, []})
653655
start_supervised!(Engine.Dispatch)
654656
start_supervised!(Engine.ModuleMappings)
655657
start_supervised!(Build.CaptureServer)

apps/expert/test/engine/code_intelligence/definition_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ defmodule Expert.Engine.CodeIntelligence.DefinitionTest do
4343
end
4444

4545
setup_all do
46+
{:ok, _} = start_supervised({Forge.NodePortMapper, []})
4647
project = project(:navigations)
4748
start_supervised!({Document.Store, derive: [analysis: &Forge.Ast.analyze/1]})
4849
{:ok, _} = start_supervised({EngineSupervisor, project})

apps/expert/test/engine/engine_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ defmodule EngineTest do
99
import Forge.Test.Fixtures
1010

1111
def start_project(%Project{} = project) do
12+
start_supervised!({Forge.NodePortMapper, []})
1213
start_supervised!({Expert.EngineSupervisor, project})
1314
assert {:ok, _, _} = EngineNode.start(project)
1415
:ok

apps/expert/test/expert/engine_node_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ defmodule Expert.EngineNodeTest do
1010

1111
setup do
1212
project = project()
13+
start_supervised!({Forge.NodePortMapper, []})
1314
start_supervised!({EngineSupervisor, project})
1415
{:ok, %{project: project}}
1516
end

apps/expert/test/expert/project/node_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ defmodule Expert.Project.NodeTest do
1111
setup do
1212
project = project()
1313

14+
{:ok, _} = start_supervised({Forge.NodePortMapper, []})
1415
{:ok, _} = start_supervised({DynamicSupervisor, Expert.Project.DynamicSupervisor.options()})
1516
{:ok, _} = start_supervised({Expert.Project.Supervisor, project})
1617

0 commit comments

Comments
 (0)