jonasbhjulstad
Bringing child nodes up on network
Hi!
I’ve been able to setup child nodes, but I’m trying to get them online. The intention is to make the nodes act as separate computers, such that I can broadcast messages to them via udp.
Code I’ve been using for parent node:
Node.start(:master@localhost, :shortnames)
(When running :longnames, I get a name error when initializing child nodes)
Code for initializing child nodes:
defmodule Child_Nodes do
def init child_names do
:os.cmd('epmd -daemon')
for child_name <- child_names do
{:ok, node} = start_child child_name
load_code node
end
end
def project_module_path do
Path.absname('_build/dev/ebin') |>
to_charlist()
end
def start_child name do
:slave.start(:localhost, name)
end
def load_code node do
:rpc.block_call(node, :code, :add_paths, [:code.get_path()])
:rpc.block_call(node, :code, :add_paths, [project_module_path()])
end
end
This allows me to run my projects code on the child_nodes and access them using Node.ping(). However, each node are going to find eachother over udp using this module, with different ports:
defmodule Broadcasting do
@broadcast_timeout 1000
@localhost {10, 0, 0, 68}
#Node-name format: OrderHandler_<port>@<address>
def init port do
{:ok, socket} = :gen_udp.open(port, [active: true, broadcast: true])
Task.async fn -> broadcast socket, port end
IO.puts "Node at port #{port} initialized"
listen socket, port
end
def broadcast socket, port do
:gen_udp.send(socket, {255,255,255,255}, port, to_string(port))
:timer.sleep(@broadcast_timeout)
broadcast socket, port
end
def listen socket, port do
local_msg = to_string(port)
receive do
{:udp, _socket, _address, port, ^local_msg} ->
IO.inspect port
IO.puts "localmsg"
listen socket, port
{:udp, _socket, address, remote_port, _msg} ->
string_address = ip_to_string(address)
IO.puts "new node added at port: #{port}"
#"OrderHandler_" <> to_string(remote_port) <> "@" <> string_address |> String.to_atom |> Node.ping
#localhost-version
"OrderHandler_" <> to_string(remote_port) <> "@localhost" |> String.to_atom |> Node.ping
end
end
def ip_to_string ip do
:inet.ntoa(ip) |> to_string()
end
end
Is it possible to bring all child nodes online?
First Post!
ityonemo
What is going to call this broadcasting module? A task? I think this is a place you should use gen_servers.
Also, the nodes have to be on the same layer-2 network that supports udp broadcasting and most major cloud providers don’t support this.
You might need to give beam.smp special setuid permissions (CAP_NET_RAW iirc) for it to be able to broadcast.
Finally you may run out of udp connections if you’re using nf_conntrack on Ubuntu 18.04.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








