<html><head></head><body>"A "stop all nodes, send code to all nodes, restart all nodes" solution is<br>
easy to implement and pretty foolproof."<br>
<br>
Where did 9 9ines availability with erlang go then? If you have to stop nodes.<br>
<br>
How do you do code changes without stopping all nodes? <br>
<br>
The bit that inspired my about erlang is ability to deploy your code in small batches and evolve your system as you learn. Mashes well with "let it crash" in my understanding: Let it crash, as in don't try to predict what will go wrong, learn from things going wrong, and adapt (change code) fast.<br>
<br><br><div class="gmail_quote">On September 2, 2016 10:45:12 AM EDT, Joe Armstrong <erlang@gmail.com> wrote:<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<pre class="k9mail">I posted some information about why things are as they are:<br /><br /><a href="http://erlang.org/pipermail/erlang-questions/2016-July/089809.html">http://erlang.org/pipermail/erlang-questions/2016-July/089809.html</a><br /><br />The reason is historical - In the first distributed erlang all nodes<br />accessed a common file store - this is no longer true when the nodes<br />have separated stores.<br /><br />"All you have to do" (TM) is make sure all nodes have the same<br />code before sending funs around. This is not easy in the general case,<br />since all the code the fun calls also needs to be copied, and all the<br />code it calls and so on. If the code is in more than two versions or<br />changing in different places in the system at the same time this sould<br />be very tricky.<br /><br />A "stop all nodes, send code to all nodes, restart all nodes" solution is<br />easy to implement and pretty foolproof.<br /><br />Not elegant but it gets the job
done.<br /><br />/Joe<br /><br />On Fri, Sep 2, 2016 at 9:09 AM, Matthias Lang <matthias@corelatus.se> wrote:<br /><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #729fcf; padding-left: 1ex;"> Hi,<br /><br /> Thanks Nathaniel for pointing out that this is a dupe of a<br /> stackoverflow question. It's good form to indicate when you're<br /> aware of previous discussion and, perhaps, why you're not satisifed.<br /><br /> My guess is OP isn't satisifed because<br /><br />   a) The two top-voted stack overflow answers gloss over the<br />      difference between funs defined in the shell and funs<br />      defined in code.<br /><br />   b) Neither of the top-voted answers deals with the question the<br />      OP opens with.<br /><br /> Kresten's blog post, which is linked from the stack overflow comments,<br /> is good, but it causes confusion for people who don't read it<br /> carefully. One source of confusion is that it gives an
example of a<br /> fun which _does_ include the definition, says that the definition<br /> isn't included and then, seven paragraphs later, explains that the<br /> first example did actually include the definition.<br /><br /> Similarly, Joe has a blog post which was up on Hacker News (again?)<br /> just a few days ago with an example which borders on being overly cute:<br /><br />   <a href="http://joearms.github.io/2013/11/21/My-favorite-erlang-program.html">http://joearms.github.io/2013/11/21/My-favorite-erlang-program.html</a><br /><br /> this similarly creates the impression that all you have to do is send<br /> a fun to server and you're done, not even giving a nod to the problem<br /> that you need to get the code to all 1171 nodes he wants to run the<br /> code on.<br /><br /> ---<br /><br /><br /> I'd like to wrap up with a proper answer, the sort that Richard<br /> Carlsson might write, but I don't have time for that. It would:<br /><br />   - cover the difference between
funs defined in the shell, funs which<br />     contain actual code and/or variables and funs which are pure<br />     references, e.g. fun io:fwrite/2<br /><br />   - comment on the OP's mis-use of the word "definition" and cleaning<br />     up other language sloppiness to avoid disagreements and confusion<br />     caused by misunderstanding.<br /><br />   - talk about how it's nice that the concept of funs is the same across<br />     lots of different uses, i.e. passing to lists:filter/2, sending<br />     to a local process, sending to a remote process and spawning, and<br />     that the cost of getting a fairly harmless surprise or two in the<br />     distributed case is low compared to the benefit of the concept being<br />     so simple.<br /><br />   - speculate on the possibility of an Erlang system which<br />     automaticaly distributes code when you send a fun. It seems<br />     possible, the fun includes information about where it came from.<br /><br />     My
guess is that there's a simple, sane, useful case of<br />     distributed Erlang, which the case where you make sure all nodes<br />     have the same code from the start.<br /><br />     Then there's the case where nodes don't all have the same code,<br />     and that case is messy and complicated. There are problems such as<br />     "what do you do if the fun refers to a different version of a module<br />     which is already loaded on the receiving node?". This feels like<br />     research, not "getting things done", and I'm into the latter.<br /><br /> Matthias<br /><br /><hr /><br /><br /> Date: 01. September 2016<br /> From: nesvarbu Pavarde <perkrovos@gmail.com><br /> To erlang-questions@erlang.org<br /> Subject: [erlang-questions] What is the point of Spawn(Node, Fun) if Node has to have the same module loadable as a client node?<br /><br /><br /><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #ad7fa8; padding-left: 1ex;">
Why create illusion that you are sending a Fun to remote node to execute in<br /> a new process? If client node has to have same module loadable with the Fun<br /> defined as a server node anyway. Why not only spawn(Node, M, F, A) then,<br /> which makes it clear that you are sending a definition of a function call,<br /> not Fun itself.<br /> I am experimenting with distributed Erlang and want it to pass clojures<br /> around "willy nilly", even through network. "Code is data" kinda thing.<br /></blockquote><br /><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #ad7fa8; padding-left: 1ex;"><hr /><br /> erlang-questions mailing list<br /> erlang-questions@erlang.org<br /> <a href="http://erlang.org/mailman/listinfo/erlang-questions">http://erlang.org/mailman/listinfo/erlang-questions</a><br /></blockquote><hr /><br /> erlang-questions mailing list<br /> erlang-questions@erlang.org<br /> <a
href="http://erlang.org/mailman/listinfo/erlang-questions">http://erlang.org/mailman/listinfo/erlang-questions</a><br /></blockquote></pre></blockquote></div></body></html>