Erlang热重装和坏人

时间:2012-10-23 21:07:00

标签: erlang

我有一个设置,其中我有四个服务器运行实例,每个服务器盒两个实例。我的服务器涉及大量传递匿名函数并在不同的线程上运行它们(可能在不同的服务器上)。

今天我做了一个代码重新加载,其中包括更改其中一个实例上的某些静态函数的内容(计划按顺序执行每个实例)。在重新加载时,我遇到了badfun错误的雪崩。该盒子上的另一个实例也开始喷出类似的错误。另一个盒子上的两个实例我们似乎没有受到影响。

我找到了这篇文章: http://www.javalimit.com/2010/05/passing-funs-to-other-erlang-nodes.html 这似乎意味着这些错误的原因是匿名函数在两个节点之间有不同的版本,因此它破坏了。但是,在测试中我无法重现此错误。此外,我已经多次重新加载代码而没有看到这样的东西。然而,这是我第一次重新加载每个盒子两个实例(以前它是每盒一个实例)。有没有人对为什么会发生这种情况有任何见解,也许是如何防止它(没有杀死所有东西并重新启动它,这是我必须要做的)。

1 个答案:

答案 0 :(得分:3)

为了识别funs,erlang vm对代码进行哈希处理并将其包含在有趣的标识符中。正是这个标识符被发送到另一个节点,当尝试访问远程端的那种乐趣时,它无法找到该哈希的乐趣。

要看到这个实际操作,请带一段带有匿名乐趣的代码并将其加载到一个vm中,然后编辑乐趣并将新代码加载到单独的vm中。然后尝试将原始乐趣发送到第二个vm并执行它。