Size: a a a

2019 October 18

AB

Alexander Bogosyan in ErlangRus
в используемой либе человек делает
case gen_tcp:connect(...) of {error, Reason} -> {stop, Reason} .... end
источник

AB

Alexander Bogosyan in ErlangRus
в init методе gen_statem-а =)
источник

AB

Alexander Bogosyan in ErlangRus
соответственно, любой ретрай коннекта приводит к креш репорту =)
источник

AB

Alexander Bogosyan in ErlangRus
exception exit: {econnrefused,[{gen_statem,init_result,6,[{file,"gen_statem.erl"},{line,722}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,249}]}]}
источник

DZ

Danil Zagoskin in ErlangRus
Alexander Bogosyan
а можно как - то перехватить креш-репорт
смотри в сторону logger:add_handler
там можно написать свой хендлер
источник

DZ

Danil Zagoskin in ErlangRus
Alexander Bogosyan
в используемой либе человек делает
case gen_tcp:connect(...) of {error, Reason} -> {stop, Reason} .... end
если это генсервер в супервизоре, то вместо Reason можно вернуть {shutdown, Reason} — OTP тогда не будет генерировать крешрепорт
источник

В

Вертолетчик in ErlangRus
Alexander Bogosyan
в init методе gen_statem-а =)
А переписать либу нельзя? Просто коннект в ините - как-то некошерно
источник

DZ

Danil Zagoskin in ErlangRus
Alexander Bogosyan
соответственно, любой ретрай коннекта приводит к креш репорту =)
буквально на этой неделе я примерно ту же задачу решил таким образом:
start_link(Name) ->
 GSR = gen_server:start_link(?MODULE, [Name], []),
 % эта штука нужна, чтобы можно было отдавать ошибки запуска без крешрепотров в логах
 case GSR of
   {error, {shutdown, Err}} -> {error, Err};
   _ -> GSR
 end.

init([Name]) ->
 case open(Name) of
   {ok, ...} -> ...;
   {error, Error} -> {stop, {shutdown, Error}}
 end.
источник

DZ

Danil Zagoskin in ErlangRus
Вертолетчик
А переписать либу нельзя? Просто коннект в ините - как-то некошерно
это не всегда так. В некоторых случаях имеет смысл вернуть ошибку тому процессу, который делал обречённый на провал start_link
источник

В

Вертолетчик in ErlangRus
Danil Zagoskin
это не всегда так. В некоторых случаях имеет смысл вернуть ошибку тому процессу, который делал обречённый на провал start_link
Это да, но просто тогда коллер блокируется. А коннект - вещь непредсказуемая. А если нужно много коннектов, то можем получить нормальный такой bottleneck
источник

DZ

Danil Zagoskin in ErlangRus
Вертолетчик
Это да, но просто тогда коллер блокируется. А коннект - вещь непредсказуемая. А если нужно много коннектов, то можем получить нормальный такой bottleneck
и у нас с тобой слишком мало данных, чтобы судить о том, как лучше делать в конкретном случае Александра.
Асинхронный запуск пачки воркеров — сложная штука, которая требует много времени на реализацию, которую сложно отлаживать и которая всё равно иногда будет вести себя как-то странно даже после трёх лет обработки особых случаев
источник

В

Вертолетчик in ErlangRus
Данных мало, согласен. Но это как бы базовые вещи. По крайней мере везде в умных книжках предупреждают: Ребяты, ахтунг! init должен быть быстрым!
источник

AB

Alexander Bogosyan in ErlangRus
Danil Zagoskin
буквально на этой неделе я примерно ту же задачу решил таким образом:
start_link(Name) ->
 GSR = gen_server:start_link(?MODULE, [Name], []),
 % эта штука нужна, чтобы можно было отдавать ошибки запуска без крешрепотров в логах
 case GSR of
   {error, {shutdown, Err}} -> {error, Err};
   _ -> GSR
 end.

init([Name]) ->
 case open(Name) of
   {ok, ...} -> ...;
   {error, Error} -> {stop, {shutdown, Error}}
 end.
да наверное так и сделаю, просто думал может извне можно заткнуть это как-то
источник

AB

Alexander Bogosyan in ErlangRus
Danil Zagoskin
и у нас с тобой слишком мало данных, чтобы судить о том, как лучше делать в конкретном случае Александра.
Асинхронный запуск пачки воркеров — сложная штука, которая требует много времени на реализацию, которую сложно отлаживать и которая всё равно иногда будет вести себя как-то странно даже после трёх лет обработки особых случаев
да я grpc прикручиваю, там используется chatterbox для http/2 соединений и там вот такое: https://github.com/tsloughter/chatterbox/blob/master/src/h2_connection.erl#L182
источник

VS

Vladimir Sekisov in ErlangRus
если поменять исходный код нельзя, то supervisor_bridge
источник

DZ

Danil Zagoskin in ErlangRus
Alexander Bogosyan
да наверное так и сделаю, просто думал может извне можно заткнуть это как-то
ну или такой ебанутый вариант:
пишешь свой модуль-обёртку, который в своём init вызывает оригинальный init, ловит ошибки, а потом делает gen_statem:enter_loop в оригинальный модуль или hibernate с тем же эффектом
источник

DZ

Danil Zagoskin in ErlangRus
хотя вообще выглядит как косяк, о котором автор не думал, и, скорее всего, пример пуллреквест
источник

DF

Denis Fakhrtdinov in ErlangRus
Как удобно отформатирован код.
источник

DZ

Danil Zagoskin in ErlangRus
Denis Fakhrtdinov
Как удобно отформатирован код.
это сарказм?
источник

DF

Denis Fakhrtdinov in ErlangRus
Конечно. Ну или это у меня гитхаб весь код раздолбал.
источник