Erlang поглощение не удалось после успешного переключения - PullRequest
1 голос
/ 20 мая 2009

У меня есть приложение, распределенное по 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.

Что я не понимаю в этом процессе, что вышеупомянутое не должно работать?

1 Ответ

2 голосов
/ 21 июля 2009

Похоже, ваша проблема возникла из-за того, что администратор сервера Twitter пытается запустить одного из его дочерних элементов. Так как сообщение об ошибке жалуется на ребенка с функцией start_function

{twitter_server,start_link,[]}

И поскольку вы не показываете этот код, я могу только догадываться, что он пытается зарегистрировать имя для себя, но уже существует процесс, зарегистрированный с этим именем.

Еще более догадываясь, причина показывает Pid, ​​Pid, ​​у которого есть имя, которое мы пытались найти для себя:

{already_started,<2415.62.0>}

Pid там имеет ненулевое начальное целое число, если оно было равно нулю, это означает, что это локальный процесс. Из чего я делаю вывод, что вы пытаетесь зарегистрировать глобальное имя, и вы подключены к другому узлу, где уже существует процесс, глобально зарегистрированный под этим именем.

...