2015-06-01 24 views
1

嗨我試圖從遠程節點在mnesia中創建一個遊標,例如: 我擁有mnesia數據庫所有者的節點,並在專用服務器計算機中運行重要的進程,另一個節點有一個進程在其他計算機上運行,​​並且必須通過所有項目才能對數據進行簡單的操作。問題是,如果運行在mnesia的同一個節點上,但不能遠程運行,我可以使其他進程工作。 這是我的代碼在本地運行:使用erlang rpc創建與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}]}]}}} 

回答

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?

現在我要解決的光標所有權,因爲我不能從遠程節點執行。

這是錯誤:

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