2009-05-20 36 views
1

我有一個應用程序分佈在2個節點上。當我暫停()第一個節點時,故障轉移完美,但是(有時候?)當我重新啓動第一個節點時,接管失敗並且應用程序崩潰,因爲start_link返回已經開始。成功故障轉移後Erlang接管失敗

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文件。

我對這個過程有什麼不瞭解,上述不應該起作用?

+1

我可以問你哪裏有這麼好格式的sasl主管報告?它比默認更可讀。你能分享到它的鏈接或它的來源? – gleber 2009-05-21 00:51:12

回答

2

這似乎是你的問題源於Twitter服務器主管試圖啓動其一個孩子。由於錯誤報告抱怨與start_function孩子

{twitter_server,start_link,[]} 

而且因爲你沒有顯示的代碼,我只能猜測,它正試圖爲自己註冊一個名稱,但已經有與註冊過程名稱。

甚至更​​多的猜測,之所以顯示一個PID,有我們想抓我們爲自己的名PID:

{already_started,<2415.62.0>} 

將PID那裏有一個非0的初始整數,如果是零這意味着它是一個本地進程。從中我推斷出您正在嘗試註冊一個全局名稱,並且您已連接到另一個節點,而該節點已經有一個以該名稱全局註冊的進程。