ejabberd_riak删除功能

时间:2016-05-20 15:29:50

标签: erlang ejabberd riak riak-cs

我正在建立一个ejabbered + riak集群,我必须在文件ejabberd/src/ejabberd_riak.erl中使用基本的riak(get,put,delete ..)函数

  1. put,get,get_by_index等函数运行良好,使用文件中模块的用法我可以弄清楚是什么。

  2. 我遇到了函数delete_by_index以及get_keys_by_index的问题,无论如何都是由delete_by_index调用的。

  3. 执行此操作时抛出的错误 - >

    ejabberd_riak:get_keys_by_index(game <<"language">>,       
    term_to_binary("English")).
    {error,<<"Phase 0: invalid module named in PhaseSpec function:\n must be a valid module name (failed to load ejabberd_r"...>>}
    (ejabberd@172.43.12.133)57> 12:28:55.177 [error] database error:
    ** Function: get_keys_by_index
    ** Table: game
    ** Index = <<"language">>
    ** Key: <<131,107,0,7,69,110,103,108,105,115,104>>
    ** Error: Phase 0: invalid module named in PhaseSpec function:
    must be a valid module name (failed to load ejabberd_riak: nofile)
    

1 个答案:

答案 0 :(得分:1)

您可能应该在riak端加载ejabberd_riak

您目前正在使用riak作为单独的erlang应用程序,通过protobuf与数据库进行通信。在此配置中,您具有在ejabbered和riak应用程序中加载的独立(相互之间)模块集。 ejabberd_riak模块在​​ejabberd应用程序中加载,但不在riak应用程序中加载。

但是get_by_index使用了需要在riak端加载ejabberd_riak的mapred

-spec get_keys_by_index(atom(), binary(),
                        any()) -> {ok, [any()]} | {error, any()}.
%% @doc Returns a list of primary keys of objects indexed by `Key'.
get_keys_by_index(Table, Index, Key) ->
    {NewIndex, NewKey} = encode_index_key(Index, Key),
    Bucket = make_bucket(Table),
    case catch riakc_pb_socket:mapred(
         get_random_pid(),
         {index, Bucket, NewIndex, NewKey},
         [{map, {modfun, ?MODULE, map_key}, none, true}]) of
         %%               ^^^^^^
         %%       here is the problem 
        {ok, [{_, Keys}]} ->
            {ok, Keys};
    {ok, []} ->
        {ok, []};
        {error, _} = Error ->
            log_error(Error, get_keys_by_index, [{table, Table},
                                                 {index, Index},
                                                 {key, Key}]),
            Error
    end.

您可以自定义您的riak并将ejabberd_riak添加到riak应用程序中(但您不需要在riak端启动整个ejabberd应用程序)

使用monckeypatching方法,您应该将ejabberd_riak.erl,ejabberd.hrl,logger.hrl复制到riak/deps/riak_kv/src。然后重建riak。您应该在整个群集上分发文件,因为在每个群集节点上执行map阶段。