现在的位置: 首页 > 综合 > 正文

erlang多节点name conflict

2013年03月30日 ⁄ 综合 ⁄ 共 1112字 ⁄ 字号 评论关闭
今天游戏更新出现了一个问题,环境是这样的:顺序启动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立马崩溃了
    

抱歉!评论已关闭.