terminate и завершение вокрера супервизором

71 views
Skip to first unread message

sui

unread,
Dec 20, 2012, 2:42:19 AM12/20/12
to erlang-...@googlegroups.com
Для меня стало новостью, что при завершении gen_fsm-а (или gen_server ) супервизором колбек terminate не вызывается. И бывают случаи когда в terminate нужно подчистить неиспользуемые объекты. Пришлось сделать как то так:

% супервизор
init
([Opt]) ->
   
{ok, {{simple_one_for_one, 500, 15},
               
[{tt, {?MODULE, create_tt_fun, [Opt]},
                         permanent
, 60000, worker, []}]}}


% воркер
init
([]) ->
    process_flag
(trap_exit, true)
...

handle_info
({'EXIT', Pid, normal}, StateName, StateData) ->
   
if
       
Pid =:= self() -> {stop, normal, StateData};
       
true           -> {next_state, StateName, StateData}
   
end
;
handle_info
({'EXIT', _Pid, Why}, _StateName, StateData) ->
   
{stop, {shutdown, Why}, StateData}
;


при этом это не решает проблемы когда воркер завершается по какой нибудь такой ошибке:
=ERROR REPORT==== 20-Dec-2012::07:59:10 ===
Error in process <0.19630.0> with exit value: {{badmatch,{error,badarg}},...


есть ли какие то другие способы решения этой проблемы?

Anton Fedorov

unread,
Dec 20, 2012, 2:49:18 AM12/20/12
to erlang-...@googlegroups.com
когда убивают -- это аварийное сдыхание, в том числе, и от некорректного state'а.
terminate работает со state'ом, а если он некорректный - чего наворотит?
поэтому и не вызывается. минимизируйте side эффекты, и чистку с той стороны делать.

В письме от Чтв, 20 Дек 2012, 14:42 sui пишет:
> --
> --
> Страница рассылки: http://groups.google.com/group/erlang-russian
> Новости: http://erlanger.ru
> Чат: xmpp://erl...@conference.jabber.ru
> Чат для оффтопа: xmpp://erlang...@conference.jabber.ru
> Правила, действующие в чате и рассылке:
> http://erlanger.ru/ru/erlang-at-conference-jabber-ru
>
> Написать письмо: erlang-...@googlegroups.com
> Отписаться: erlang-russia...@googlegroups.com
>
>
>


--
Regards,
Anton Fedorov
Call2ru service
E-Mail: datac...@call2ru.com
Jabber: datac...@call2ru.com
Skype: datacompboy
ICQ: 272-35-262
Mobile: +7-913-925-7974 [SMS 24h, Call 05:00-19:00 MSKT (GMT+3)]

sui

unread,
Dec 20, 2012, 2:55:37 AM12/20/12
to erlang-...@googlegroups.com
"чистку с той стороны" - плохо представляю как это)

Anton Fedorov

unread,
Dec 20, 2012, 3:02:28 AM12/20/12
to erlang-...@googlegroups.com
Ну смотрим. Надо подчистить tcp коннекты? Они сами закроются когда процесс сдохнет.
Надо ets? Тоже само сдохнет.
Получили у кого-то какой-то ресурс на пользование? Пусть он на нас
подписывается, и если мы сдыхаем -- очищает.
И так далее.

Что именно чистить-то надо?

В письме от Чтв, 20 Дек 2012, 14:55 sui пишет:
>> > Чат: xmpp://erl...@conference.jabber.ru <javascript:>
>> > Чат для оффтопа: xmpp://erlang...@conference.jabber.ru <javascript:>
>> > Правила, действующие в чате и рассылке:
>> > http://erlanger.ru/ru/erlang-at-conference-jabber-ru
>> >
>> > Написать письмо: erlang-...@googlegroups.com <javascript:>
>> > Отписаться: erlang-russia...@googlegroups.com <javascript:>
>> >
>> >
>> >
>>
>>
>> --
>> Regards,
>> Anton Fedorov
>> Call2ru service
>> E-Mail: datac...@call2ru.com <javascript:>
>> Jabber: datac...@call2ru.com <javascript:>

sui

unread,
Dec 20, 2012, 3:09:18 AM12/20/12
to erlang-...@googlegroups.com
аа, ну обычно так и происходит конечно.
Но вот возник такой случай. В модуле используется http://www.erlang.org/doc/man/ssh.html  подчистить эти конекты можно только вызовом

lists:foreach(fun(Channel) -> ssh_connection:close(ConnectionRef,Channel) end, Channels),
ssh:close(ConnectionRef),

иначе там остается куча всего.

Слинковываться в данном случае несчем.

Anton Fedorov

unread,
Dec 20, 2012, 3:17:05 AM12/20/12
to erlang-...@googlegroups.com
Уже не первый проблем с этим модулем...
Я бы добавил прослойку, которая бы подписывалась и линковала. И чистила.

В письме от Чтв, 20 Дек 2012, 15:09 sui пишет:

Max Lapshin

unread,
Dec 20, 2012, 3:40:44 AM12/20/12
to erlang-...@googlegroups.com
Верно говорят: нельзя рассчитывать на вызов terminate. Он имеет полное право не вызваться.

sui

unread,
Dec 20, 2012, 6:05:56 AM12/20/12
to erlang-...@googlegroups.com
да я мельком глянул сорцы. там для каждого подключения создается процесс, который удерживается супервизором аппликейшена ssh, если линковаться с этим процессом, может каша получиться. все же правельнее закрывать соединение через документированные функции.
Reply all
Reply to author
Forward
0 new messages