mongodb-erlang驱动程序:mongo:由于mongodb而失败:next_requestid - > ets:update_counter因badarg而失败

时间:2012-01-25 15:27:45

标签: mongodb erlang ejabberd

我正在尝试创建一个使用mongodb-erlang作为驱动程序的ejabberd模块。

我这样做如下:

  1. ejabberd启动我的模块,该模块使用gen_server启动子进程
  2. 我启动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),
    
  3. 要访问池,我将池插入ets表

    try ets:new(mymodule_pool, [named_table, public]) of
            mymodule_pool -> ok
    catch
            _:_ -> alredy_existing
    end,
    ets:insert(mymodule_pool, {pool, Pool}),
    
  4. 当我的注册钩子被ejabberd调用时,我从中获取池和连接

    Pool = element(2, lists:nth(1, ets:lookup(mod_log_chat_mongodb_pool, pool))),
    {ok, Conn} = resource_pool:get(Pool),
    
  5. 然后我尝试插入新文档。这是失败的地方

    mongo:do(unsafe, master, Conn, Db, fun() ->
            mongo:insert(Coll, Doc)
    end),
    
  6. 这是我得到的错误:

        {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,
    • 没有存在右键的对象,
    • 该对象具有错误的arity,
    • 要更新的元素不是整数,
    • 要更新的元素也是键,或
    • 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). 
    

    我希望有人可以帮助我,我很无奈:(

    非常感谢, 迈克尔

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表的状态和 从你在那里找到的任何线索回到你的代码中。