我正在尝试创建一个使用mongodb-erlang作为驱动程序的ejabberd模块。
我这样做如下:
我启动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错误的原因描述如下:
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).
我希望有人可以帮助我,我很无奈:(
非常感谢, 迈克尔
答案 0 :(得分:1)
我快速浏览了mongodb_app,我怀疑其中有两件事。
我怀疑的第一件事是mongodb_app实际上并没有运行。在调试或实时模式下运行它,并确保mongodb_app在列表中。 应用:which_applications()
。如果不是,请确保应用程序:start(mongodb_app)处于 你的模块启动。如果那是在你的模块启动功能,那么它 可能是时候检查应用程序的返回值:start(mongodb_app)。
我怀疑的第二件事是ets表有问题。调查表的状态 ETS:信息(mongdb_app)。和ets:tab2list(mongdb_app)。
mongdb_app:init()将表声明为公共表 不应该有任何拥有过程问题。我不知道还有什么 建议除了调试mongodb_app ets表的状态和 从你在那里找到的任何线索回到你的代码中。