Драйвер mongodb-erlang: mongo: do не работает из-за mongodb: next_requestid -> ets: update_counter завершается неудачно с badarg - PullRequest
0 голосов
/ 25 января 2012

Я пытаюсь создать модуль ejabberd, который использует mongodb-erlang в качестве драйвера.

Я делаю это следующим образом:

  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),
    

Это ошибка, которую я получаю:

    {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). 

Я надеюсь, что кто-то может помочья за это, я беспомощен: (

Большое спасибо, Майкл

1 Ответ

1 голос
/ 25 января 2012

Я быстро взглянул на mongodb_app и подозреваю одну из двух вещей.

Первое, что я подозреваю, это то, что mongodb_app на самом деле не работает. Запустите это в режиме отладки или в режиме реального времени и убедитесь, что mongodb_app находится в списке. применение: which_applications ()

.

Если это не так, убедитесь, что приложение: start (mongodb_app) находится в запуск вашего модуля. Если это в вашей функции запуска модуля, то это вероятно, пришло время проверить возвращаемое значение приложения: start (mongodb_app).

Во-вторых, я подозреваю, что есть проблема с таблицей ets. Изучите статус таблицы с помощью етсь: Информация (mongdb_app). и т. д .: tab2list (mongdb_app).

mongdb_app: init () объявляет таблицу как открытую, поэтому не должно быть никаких проблем с процессом владения. Я не уверен что еще предложить кроме отладки состояние таблицы mongodb_app ets и возвращаясь к своему коду из любых подсказок, которые вы там найдете.

...