<div dir="ltr"><div>Bassically, it is a call to SomeMonitor.monitor(action) <br></div><div>which calls this:</div><div>GenServer.call(sm, {:monitor, action}) <br></div><div>which calls this:</div><div>def handle_call({:monitor, action}, {pid, _ref}, state) do<br>    ref = Process.monitor(pid)<br><br>    emit(%{module: __MODULE__, name: :monitor, metadata: %{monitored_action: action}})<br><br>    {:reply, :ok, state}<br>  end.</div><div><br></div><div>in a GenServer named process started by an application's  supervisor.</div><div><br></div><div>Bogdan<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Feb 25, 2022 at 11:26 AM Michał Muskała <<a href="mailto:michal@muskala.eu">michal@muskala.eu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div style="overflow-wrap: break-word;" lang="EN-GB">
<div class="gmail-m_-4886170479505585431WordSection1">
<p class="MsoNormal"><span>Is the sub-process started with spawn_link?<u></u><u></u></span></p>
<p class="MsoNormal"><span><u></u> <u></u></span></p>
<p class="MsoNormal"><span>RPC can start a new process to evaluate the function, which might terminate as soon as it’s finished. If the spawned process is linked to this short-lived RPC process, the spawned process will be
 also terminated through link propagation.<u></u><u></u></span></p>
<p class="MsoNormal"><span><u></u> <u></u></span></p>
<p class="MsoNormal"><span>From the rpc:call documentation:<u></u><u></u></span></p>
<p class="MsoNormal"><span><u></u> <u></u></span></p>
<p class="MsoNormal"><span>> You cannot make <b>any</b> assumptions about the process that will perform the apply(). It may be the calling process itself, an rpc server, another server, or a freshly spawned process.<u></u><u></u></span></p>
<p class="MsoNormal"><span><u></u> <u></u></span></p>
<p class="MsoNormal"><span>Michał.<u></u><u></u></span></p>
<p class="MsoNormal"><span><u></u> <u></u></span></p>
<div style="border-color:rgb(181,196,223) currentcolor currentcolor;border-style:solid none none;border-width:1pt medium medium;padding:3pt 0cm 0cm">
<p class="MsoNormal" style="margin-bottom:12pt"><b><span style="font-size:12pt;color:black">From:
</span></b><span style="font-size:12pt;color:black">erlang-questions <<a href="mailto:erlang-questions-bounces@erlang.org" target="_blank">erlang-questions-bounces@erlang.org</a>> on behalf of Bogdan Andu <<a href="mailto:bog495@gmail.com" target="_blank">bog495@gmail.com</a>><br>
<b>Date: </b>Friday, 25 February 2022 at 08:56<br>
<b>To: </b>Erlang <<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a>><br>
<b>Subject: </b>rpc/erpc behaviour<u></u><u></u></span></p>
</div>
<div>
<div>
<p class="MsoNormal">Hello,<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">While working with rpc and erpc call and cast I noticed<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">a strange behaviour and I don't know if this is intended or not.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Basically, a call to a Module.function on a local node, :'node1', creates a process sub-tree that stays alive as expected.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">However if the same cal to Module.function is performed from a remote node<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">with a rpc or erpc call from ;'node2':<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">(node2)> :rpc.cast(:'node1', Elixir.Module, :function, [args])
<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">the process sub-tree created by Module.function on :'node1' dies .<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">I have tried every variant: :rpc.cast/call, :erpc.cast/call, even
<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">:erpc.send_request/wait_response.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Those calls are made from between nodes running as Elixir nodes.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Nodes are Erlang 24 and Elixir 1.12.2 (:'node2') and Elixir 1.13.0 (:'node1')<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">The solution I founded is to use a Genserver which apparently keeps the
<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">process sub-tree alive.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Is it normal that rpc calls cast ro call to end the function on the remote node even if it has the side effects of starting process sub-tree?<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Why is that happening? Is that normal?<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">From the manual page:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><a href="https://www.erlang.org/doc/man/rpc.html#call-5" target="_blank">https://www.erlang.org/doc/man/rpc.html#call-5</a><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">"... It is used for collecting information on a remote node, or for running a function with some
<b>specific side effects </b>on the remote node."<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Those side effects would mean in my case that the process sub-tree to remain alive to use that as a service<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">but then again, that side effect disappears once the :rpc.cast/call ends.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I made a little test:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">I put a :timer.sleep(10_000) at  the end of Module.function<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">and for 10 seconds the process sub-tree is alive, after that it is killed as<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">the function invoked remotely ends.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I want to invoke that function as a library call, not as a GenServer call.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">How can I do that?<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I want to wrap in GenServer locally the rpc calls to remote node function as a library call.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Cheers,<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Bogdan<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div>
</div>

</blockquote></div>