【问题标题】:Creating cursor with erlang rpc with mnesia activity使用带有 mnesia 活动的 erlang rpc 创建光标
【发布时间】:2015-08-15 14:32:27
【问题描述】:

您好,我正在尝试从远程节点在 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}]}]}}}

【问题讨论】:

    标签: erlang rpc mnesia


    【解决方案1】:

    我发现远程节点无法执行在另一个节点中创建的匿名函数,所以贴出的错误可以这样解决:

    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?

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

    这是错误:

    {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}]}]}}}}
    

    【讨论】:

      猜你喜欢
      • 2013-02-11
      • 2014-06-06
      • 2012-03-26
      • 2013-07-03
      • 2011-03-10
      • 2011-06-01
      • 2017-10-01
      • 2015-07-09
      • 1970-01-01
      相关资源
      最近更新 更多