Я пытаюсь создать модуль ejabberd, который использует mongodb-erlang в качестве драйвера.
Я делаю это следующим образом:
- ejabberd запускает мой модуль, который запускает дочерний процесс с помощью gen_server
Я запускаю приложение и настройку mongodbпул replset
Replset = {<<"rs1">>, [{localhost, 27017}, {localhost, 27018}]},
PoolSize = gen_mod:get_opt(poolsize, Opts, 2),
Pool = resource_pool:new(mongo:rs_connect_factory(Replset), PoolSize),
, чтобы получить доступ к пулу, я вставляю пул в таблицу ets
try ets:new(mymodule_pool, [named_table, public]) of
mymodule_pool -> ok
catch
_:_ -> alredy_existing
end,
ets:insert(mymodule_pool, {pool, Pool}),
, когда мойejabberd вызывает зарегистрированный хук, я получаю пул и соединение с него
Pool = element(2, lists:nth(1, ets:lookup(mod_log_chat_mongodb_pool, pool))),
{ok, Conn} = resource_pool:get(Pool),
, затем пытаюсь вставить новый документ.Вот где он терпит неудачу
mongo:do(unsafe, master, Conn, Db, fun() ->
mongo:insert(Coll, Doc)
end),
Это ошибка, которую я получаю:
{badarg,
[{ets,
update_counter,
[mongodb_app,
requestid_counter,
1]},
{mongodb_app,
next_requestid,0},
{mongo_connect,
'-messages_binary/2-fun-0-',
3},
{lists,foldl,3},
{mongo_connect,
call,3},
{mongo_query,
find_one,2},
{mongo_query,
command,3},
{mongo_replset,
connect_member,2}]}
И из erlang.log:
=CRASH REPORT==== 25-Jan-2012::16:01:23 ===
crasher:
initial call: mymodule:init/1
pid: <0.289.0>
registered_name: mymodule_localhost
exception exit: {badarg,[{ets,update_counter,
[mongodb_app,requestid_counter,1]},
{mongodb_app,next_requestid,0},
{mongo_connect,'-messages_binary/2-fun-0-',3},
{lists,foldl,3},
{mongo_connect,call,3},
{mongo_query,find_one,2},
{mongo_query,command,3},
{mongo_replset,connect_member,2}]}
in function gen_server:terminate/6
ancestors: [ejabberd_sup,<0.36.0>]
messages: []
links: [<0.210.0>]
dictionary: []
trap_exit: false
status: running
heap_size: 1597
stack_size: 24
reductions: 1182
neighbours:
Я пробовал много разных вещей, но понятия не имею, почему это не удается.В ets: update_counter manual - причина ошибок badarg, описанная следующим образом:
- таблица не имеет типа set или order_set,
- нет объекта ссуществует правильный ключ,
- объект имеет неправильную арность,
- элемент для обновления не является целым числом,
- элемент для обновления также является ключом, или,
- любой из Pos, Incr, Threshold или SetValue не является целым числом
Соответствующий код mongodb_app выглядит следующим образом:
%@doc Create global vars which will be owned by this supervisor (and die with it)
init ([]) ->
ets:new (?MODULE, [named_table, public]),
ets:insert (?MODULE, [
{oid_counter, 0},
{oid_machineprocid, oid_machineprocid()},
{requestid_counter, 0} ]),
{ok, {{one_for_one,3,10}, []}}.
%% API functions
-spec next_requestid () -> mongo_protocol:requestid(). % IO
%@doc Fresh request id
next_requestid() -> ets:update_counter (?MODULE, requestid_counter, 1).
Я надеюсь, что кто-то может помочья за это, я беспомощен: (
Большое спасибо, Майкл