여기에 무슨 일이 일어나고 있는지 이해하려고합니다 : 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}]
자식의 'start_link' 함수에서'gen_server : call'을하고 있습니까? –
예. gen_server가 이미 실행 된 후에 수행해야하는 늦은 초기화가 필요합니다. –
대신'init' 함수에서이 작업을 수행하지 않으시겠습니까? 여기서 죽은 자물쇠에 대한 위험이있을 수 있습니다 ... –