В распределенной на несколько нод системе получил ошибку:
{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 уже не действителен.
Только на это грешу, т.к. сама по себе анонимная функция очень простая.
Примерно понимаю как могу обойти данную ошибку, думаю что достаточно передавать не анонимную функцию, а { модуль, имя экспортируемой функции, аргументы }
и вызывать на удаленной ноде данную локальную функцию.
Но непонятна сама причина данного эксепшена. Помогите установить истину ? кто с таким сталкивался ?
Спасибо.