jonasbhjulstad

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

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.

Where Next?

Popular in Questions Top

_russellb
I want to try my hand at web scraping. What tools/libraries do I need to use. I’m hoping to turn this into something professional so don’...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
jaysoifer
Is there a way to rollback a specific migration and only that one (“skipping” all the other ones)? Would mix ecto.rollback -v 200809061...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
srinivasu
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call t...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New
marick
I had some trouble figuring out how to make many-to-many associations work. Once I got it working, I wrote a blog post. Because I’m a nov...
New

Other popular topics Top

marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1144 53690 245
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 36128 110
New
boundedvariable
I am going through the kafka architecture. All the features what the kafka is providing are already in Erlang. I would like hear your opi...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New

We're in Beta

About us Mission Statement