Erlang热重载和坏函数

5
我有一个配置,其中有四个服务器实例运行,每个服务器箱有两个实例。我的服务器涉及传递匿名函数并在不同线程上运行它们(可能在不同的服务器上)。
今天我进行了一次代码重新加载,其中涉及更改一个实例的某些静态函数的内容(计划逐个实例执行)。在运行重新加载时,我被一堆badfun错误所困扰。该盒子上的另一个实例也开始喷出类似的错误。另一台服务器的两个实例似乎没有受到影响。
我找到了这篇文章:http://www.javalimit.com/2010/05/passing-funs-to-other-erlang-nodes.html,它似乎暗示这些错误的原因是两个节点之间的匿名函数版本不同,因此断开连接。然而,在测试中我无法重现此错误。此外,我以前多次重新加载代码而没有看到这样的情况。但是,这是我第一次使用每个盒子两个实例(以前是一个实例每个盒子)。有人了解为什么会发生这种情况,并可能知道如何防止它吗(而无需杀死并重新启动所有内容,这是我不得不做的事情)?
1个回答

3
为了识别fun,Erlang VM对代码进行哈希,并将该哈希值合并到fun标识符中。正是这个标识符发送到其他节点,当尝试在远程节点上访问该fun时,它找不到具有该哈希值的fun。
要查看此示例,请取一段带有匿名fun的代码并将其加载到一个VM中,然后编辑fun并将新代码加载到单独的VM中,然后尝试将原始fun发送到第二个VM并执行它。

是的,在测试中我确实设法让它工作了。我猜其中一个实例上的代码已经落后于两次重新加载以上了? - Mediocre Gopher
当您没有遇到错误时,一个节点上的版本也会存在于另一个节点上,作为主要或次要版本。 - Lukas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接