您的位置:首页 > 其它

erlang多节点name conflict

2013-07-18 22:51 183 查看
今天游戏更新出现了一个问题,环境是这样的:顺序启动S1、S2、S3三个游戏服务器节点,能够正常工作。接着启动一个中央后台节点A,S1、S2、S3每隔几十秒的时间就会与节点A通信一次(使用erlang的进程通信方式),结果很快S2、S3崩溃了,S1能够正常工作。

查看到S2上的错误报如下:

(s2@192.168.0.1)1>
=CRASH REPORT==== 18-Jul-2013::11:21:46 ===
crasher:
initial call: application_master:init/4
pid: <0.48.0>
registered_name: []
exception exit: killed
in function application_master:terminate/2 (application_master.erl, line
229)
ancestors: [<0.47.0>]
messages: []
links: [<0.6.0>]
dictionary: []
trap_exit: true
status: running
heap_size: 1597
stack_size: 24
reductions: 4422
neighbours:
(g002@192.168.51.99)1>
=INFO REPORT==== 18-Jul-2013::11:21:46 ===
application: game_server
exited: killed
type: temporary

上面的错误信息无法看出端倪,接着在节点A上的发现如下错误信息 :
=INFO REPORT==== 18-Jul-2013::11:21:46 ===
global: Name conflict terminating {waitforstart,<6533.49.0>}
** at node s2@192.168.0.1 **

这个错误信息提示的很明显了,全局的命名waitforstart有冲突。搜索了下代码果然发现了全局的注册函数
global:register_name(waitforstart, self())
将S1,S2,S3的代码修改一下,注册互不相同的全局名字,测试一切都正常了。

疑问?
命名的冲突是发生在S1,S2,S3节点上的,看起来跟节点A没有什么关系啊?
这是由于A未启动之前,S1,S2,S3之间没有任何的通信,所以不会去检测是否有全局的名字冲突。
可以做一个简单的测试来证明这个问题,启动S1,S2 不启动A,在S2上执行下面的命令
net_adm:ping('s1@192.168.0.1').
结果s2立马崩溃了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: