【发布时间】:2012-02-18 18:54:19
【问题描述】:
我正在尝试创建一个使用 mongodb-erlang 作为驱动程序的 ejabberd 模块。
我这样做如下:
- 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 或 ordered_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).
希望有人能帮帮我,我很无奈:(
非常感谢, 迈克尔
【问题讨论】: