One of the first things I did in Erlang was implement node migration for a certain type of Ejabberd process similar to the one below, but less general and I entirely failed to implement message relaying. I had a few things going for me:<br>
<br>- the process was a gen_fsm, so there was no mystery about how to obtain its state at a given moment in time. In fact the module in question already had handle_sync_event capable of setting or getting the state as a whole (normally bad from a design standpoint I suppose, but it was helpful here)<br>
<br>- the process was created by a simple_one_for_one supervisor but had no other links or monitors<br><br>- the process did not own any ports or ETS tables<br><br>- no other processes kept direct references to it. Messages sent to it were immediately preceded by a Mnesia lookup to get its PID.<br>
<br>So all I had to do was spawn the process on the new node, push its gen_fsm state, update the Mnesia table to point to the new PID, and kill the old one. There was still a risk of losing messages; a relay would be the right way to handle that I think.<br>
<br>Dan<br><br><div class="gmail_quote">On Tue, Jul 31, 2012 at 4:18 PM, Ali Sabil <span dir="ltr"><<a href="mailto:ali.sabil@gmail.com" target="_blank">ali.sabil@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Hi Tyron,<br>
<br>
You could implement process migration yourself, I remember seeing<br>
something like that implemented in ejabberd:<br>
<a href="https://github.com/esl/ejabberd/blob/master/apps/ejabberd/src/p1_fsm.erl#L557" target="_blank">https://github.com/esl/ejabberd/blob/master/apps/ejabberd/src/p1_fsm.erl#L557</a><br>
<br>
The idea is to spawn another process in the remote node, and use a<br>
handover protocol to coordinate the migration.<br>
<br>
Best,<br>
Ali<br>
<div class="HOEnZb"><div class="h5"><br>
On Tue, Jul 31, 2012 at 8:21 PM, Tyron Zerafa <<a href="mailto:tyron.zerafa@gmail.com">tyron.zerafa@gmail.com</a>> wrote:<br>
> Hey again,<br>
>     I am thinking that a weaker form of such mobility might suffice for my<br>
> project, but I am not sure. In this weaker form, it is enough to transfer<br>
> the code and execution can restart again. I need this primary to implement<br>
> the code-on-demand and remote-evaluation architectures. I do not believe<br>
> that this is so complex in Erlang, in fact if I remember correctly some<br>
> functionality already exists for such.<br>
><br>
><br>
> On Tue, Jul 31, 2012 at 8:15 PM, Gleb Peregud <<a href="mailto:gleber.p@gmail.com">gleber.p@gmail.com</a>> wrote:<br>
>><br>
>> On Tue, Jul 31, 2012 at 8:11 PM, Tyron Zerafa <<a href="mailto:tyron.zerafa@gmail.com">tyron.zerafa@gmail.com</a>><br>
>> wrote:<br>
>> > Hey,<br>
>> >     My primary intention is to implement strong mobility of processes.<br>
>> > Let's<br>
>> > say that process A is running on Node 1, I want to be able to suspend<br>
>> > this<br>
>> > process, transfer it to Node 2 and resume such process from where it<br>
>> > halted.<br>
>> > I believe that in order to achieve such I need to somehow preserve the<br>
>> > stack<br>
>> > trace, memory and other info.<br>
>><br>
>> This task is non-trivial and will require a lot of work with ERTS and<br>
>> whole Erlang VM. Things you have to handle are:<br>
>> - stack<br>
>> - heap<br>
>> - binary refs<br>
>> - monitors<br>
>> - links<br>
>> - ets ownership<br>
>> - port ownership<br>
>> - messages sent to old process pid?<br>
>> - replacing old pid with new in other processes?<br>
>> - replacing old process with "replay" process?<br>
>><br>
>> And I'm sure that those are not all details which will have to be handled.<br>
>><br>
>> Cheers,<br>
>> Gleb<br>
><br>
><br>
><br>
><br>
> --<br>
> Best Regards,<br>
> Tyron Zerafa<br>
><br>
><br>
</div></div><div class="HOEnZb"><div class="h5">> _______________________________________________<br>
> erlang-questions mailing list<br>
> <a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
> <a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
><br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br>