我有一个分布在2个节点上的应用程序。当我停止()第一个节点时,故障转移工作正常,但(有时?)当我重新启动第一个节点时,接管失败,应用程序崩溃,因为start_link返回已经开始。
SUPERVISOR REPORT <0.60.0> 2009-05-20 12:12:01
===============================================================================
Reporting supervisor {local,twitter_server_supervisor}
Child process
errorContext start_error
reason {already_started,<2415.62.0>}
pid undefined
name tag1
start_function {twitter_server,start_link,[]}
restart_type permanent
shutdown 10000
child_type worker
ok
我的应用
start(_Type, Args)->
twitter_server_supervisor:start_link( Args ).
stop( _State )->
ok.
我的主管:
start_link( Args ) ->
supervisor:start_link( {local,?MODULE}, ?MODULE, Args ).
两个节点都使用相同的sys.config文件。
我不理解这个过程不能起作用吗?
答案 0 :(得分:2)
好像你的问题源于Twitter服务器主管试图启动其中一个孩子。由于错误报告抱怨具有start_function的孩子
{twitter_server,start_link,[]}
由于您没有显示该代码,我只能猜测它正在尝试为自己注册一个名称,但已经有一个注册了该名称的进程。
更加猜测,原因显示Pid,Pid有我们试图为自己抓取的名字:
{already_started,<2415.62.0>}
Pid有一个非零的初始整数,如果它为零则意味着它是一个本地进程。从中我推断出您正在尝试注册一个全局名称,并且您已连接到另一个节点,其中已经有一个全名由该名称注册的进程。