Блокирует ли супервизор вызовы при перезапуске детей? - PullRequest
2 голосов
/ 30 марта 2011

Я пытаюсь понять, что здесь происходит:

У меня есть супервизор, который циклически перезапускает одного клиента без запуска механизма MaxR, MaxT. Клиент просто падает достаточно медленно, чтобы не вызвать ограничение скорости.

Был бы другой механизм, использующий supervisor:which_children/1 и delete_child/2, start_child/2 для адаптации набора детей к реальности (его сканирование для USB-устройств, пытающихся найти одного ребенка-супервизора на каждое устройство).

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

Чтобы узнать, что происходит, я позвонил supervisor:which_children/1 из оболочки, и похоже, что вызов просто блокирует и никогда не возвращается.

Может ли быть так, что вызовы супервизору блокируются, когда он занят попыткой перезапустить ребенка?

Добавление:

похоже, что сбой происходит при запуске ребенка:

=SUPERVISOR REPORT==== 29-Mar-2011::21:36:20 ===
     Supervisor: {local,gateway_sup}
     Context:    start_error
     Reason:     {'EXIT',{timeout,{gen_server,call,[<0.155.0>,late_init]}}}
     Offender:   [{pid,<0.76.0>},
              {name,gw_3_5},
              {mfa,{channel,start_link,
                            [[{gateways,[{left,108},{right,103}]}],
                             {3,5}]}},
              {restart_type,transient},
              {shutdown,10000},
              {child_type,worker}]

1 Ответ

1 голос
/ 30 марта 2011

Ответ на вопрос, помимо обсуждения, таков:

При перезапуске дочернего элемента, который выходит из строя во время запуска, супервизор зацикливается внутри своего процесса (это внутренний сервер gen_server), не обрабатывая какие-либо вызовы API к нему.

Так что особенно плохо, если ограничение супервизора настроено так, что оно не сработает при ошибках запуска дочерних элементов.У меня медленный запуск (особенно при ошибке) в моем примере.

Так что, если супервизор зацикливается, пытаясь перезапустить ребенка, он недоступен для любых обращений к нему ... что обычно плохо.

...