badfun для анонимной функции.

66 views
Skip to first unread message

begemot_sun

unread,
Dec 19, 2015, 5:47:28 AM12/19/15
to Erlang по-русски
В распределенной на несколько нод системе получил ошибку:
{badfun, Fun}. Полез в документацию узнать что же это за такой зверек badfun.
Нашел только:

{badfun,F} - Something is wrong with a fun F.

Что опечалило.
отловил ошибку с помощью try/catch и попытался получить информацию о функции:

fun_info: [{pid,<17188.31720.7>},
{module,mod_muc_room},
{new_index,57},
{new_uniq,<<124,172,48,204,170,4,158,148,54,43,135,189,253,237,
249,58>>},
{index,57},
{uniq,65364358},
{name,[]},
{arity,2},
{env,[]},
{type,local}]



собственно видно что эта функция пришла с другой ноды (pid у ней не локальный), знаю место генерации этой функции.
Непонятна причина для данной ошибки, C код Erlang на эту тему ничего не прояснил:


https://github.com/erlang/otp/search?l=c&q=badfun&utf8=%E2%9C%93



Так в документации в fun_info cказано:
The following elements are only present in the list if Fun is local:{pid, Pid}
Pid is the process identifier of the process that originally created the fun.

Т.е. PId как минимум должен быть локальным, но он у меня от удаленного процесса.


Сама функция генерируется в spawn и отправляется в виде сообщения на другую ноду, после отправки процесс умирает, соотвественно pid уже не действителен.
Только на это грешу, т.к. сама по себе анонимная функция очень простая.
Примерно понимаю как могу обойти данную ошибку, думаю что достаточно передавать не анонимную функцию, а { модуль, имя экспортируемой функции, аргументы }
и вызывать на удаленной ноде данную локальную функцию.


Но непонятна сама причина данного эксепшена. Помогите установить истину ? кто с таким сталкивался ?


Спасибо.

Aleksey Kluchnikov

unread,
Dec 19, 2015, 7:23:03 AM12/19/15
to erlang-russian
Отам отправляется не функция а некий указательно функцию. Чтобы работало на другой ноде должен быть идентичный бинарник модуля с этой функцией. Вобщем все должно быть скомпилено с одних сырцов

19 декабря 2015 г., 13:47 пользователь begemot_sun <logu...@gmail.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "Erlang по-русски".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес erlang-russia...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес erlang-...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Sergey Loguntsov

unread,
Dec 19, 2015, 7:59:50 AM12/19/15
to erlang-...@googlegroups.com
Да, спасибо, я это знаю. Весь вопрос в том, что компилированный код на
нодах был одинаковым (я не могу, к сожалению, точно это утверждать).
Есть еще какие-то причины для такой ошибки ?

19 декабря 2015 г., 15:23 пользователь Aleksey Kluchnikov
<kluchn...@gmail.com> написал:
Reply all
Reply to author
Forward
0 new messages