使用带有mnesia活动的erlang rpc创建游标

时间:2015-06-01 23:58:34

标签: erlang rpc mnesia

您好我试图从远程节点在mnesia中创建游标,例如: 我有一个节点,它是mnesia数据库所有者,并在专用服务器机器中运行重要进程,另一个节点有一个在其他计算机上运行的进程,并且必须通过所有项目对数据进行一些简单的操作。问题是如果在mnesia的同一节点中运行而不是远程运行,我可以使杂项进程工作。 这是我在本地运行的代码:

make_cursor_local() ->
  QD = qlc:sort(mnesia:table(customer, [{traverse, select}])),
  mnesia:activity(async_dirty, fun() -> qlc:cursor(QD) end, mnesia_frag).

get_next_local(Cursor) ->
  Get = fun() -> qlc:next_answers(Cursor,100) end,
  mnesia:activity(async_dirty, Get, mnesia_frag).

del_cursor_local(Cursor) ->
  qlc:delete_cursor(Cursor).

这是我使用rpc的实际代码:

make_cursor() ->
  Sort = rpc:call(?NamespaceNode, mnesia, table, [customer, [{traverse, select}]]),
  QD = rpc:call(?NamespaceNode, qlc, sort, [Sort]),
  CursorCreation = fun() -> qlc:cursor(qlc:sort(Sort)) end,
  Cursor = rpc:call(?NamespaceNode, mnesia, activity, [async_dirty, CursorCreation, mnesia_frag]),
  Cursor.

get_next(Cursor) ->
  Get = fun() -> rpc:call(?NamespaceNode, qlc, next_answers, [Cursor, 100]) end,
  Next = rpc:call(?NamespaceNode, mnesia, activity, [async_dirty, Get, mnesia_frag]),
  Next.

del_cursor(Cursor) ->
  rpc:call(?NamespaceNode, qlc, delete_cursor, [Cursor]).

此代码生成此错误,使make_cursor函数中的mnesia活动调用:

{badrpc,
       {'EXIT',
           {undef,
               [{#Fun<cleaner_app.2.116369932>,[],[]},
                {mnesia_tm,non_transaction,5,
                    [{file,"mnesia_tm.erl"},{line,738}]},
                {rpc,'-handle_call_call/6-fun-0-',5,
                    [{file,"rpc.erl"},{line,205}]}]}}}  {badrpc,{'EXIT',{undef,[{#Fun<misc_app.2.116369932>,[],
                     []},
                    {mnesia_tm,non_transaction,5,
                               [{file,"mnesia_tm.erl"},{line,738}]},
                    {rpc,'-handle_call_call/6-fun-0-',5,
                         [{file,"rpc.erl"},{line,205}]}]}}}

1 个答案:

答案 0 :(得分:0)

我发现远程节点无法执行在另一个节点中创建的匿名函数,因此发布的错误可以通过这种方式解决:

make_cursor() ->
   Sort = rpc:call(?NamespaceNode, mnesia, table, [customer, [{traverse, select}]]),
   QD = rpc:call(?NamespaceNode, qlc, sort, [Sort]),
   rpc:call(?NamespaceNode, mnesia, activity, [sync_transaction, fun qlc:cursor/1, [QD], mnesia_frag]).

我在这里找到了答案what kind of types can be sent on an erlang message?

现在我必须解决Cursor的所有权,因为我无法从远程节点执行它。

这是错误:

{badrpc,
{'EXIT',
    {aborted,
        {not_cursor_owner,
            [{qlc,next_answers,
                 [{qlc_cursor,{<6920.991.0>,<6920.990.0>}},100],
                 [{file,"qlc.erl"},{line,515}]},
             {mnesia_tm,apply_fun,3,[{file,"mnesia_tm.erl"},{line,833}]},
             {mnesia_tm,execute_transaction,5,
                 [{file,"mnesia_tm.erl"},{line,813}]},
             {mnesia,wrap_trans,6,[{file,"mnesia.erl"},{line,394}]},
             {rpc,'-handle_call_call/6-fun-0-',5,
                 [{file,"rpc.erl"},{line,205}]}]}}}}