ejabberd_riak 删除功能

ejabberd_riak delete functions

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

  1. 函数 put、get、get_by_index 等工作很好,使用文件中的模块我可以弄清楚什么是什么。

  2. 我遇到了函数 delete_by_index 和 get_keys_by_index 的问题,该函数由 delete_by_index 调用。

我这样做时抛出的错误->

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)

你应该在 riak 端加载 ejabberd_riak

您目前正在使用 riak 作为单独的 erlang 应用程序,通过 protobuf 与数据库通信。在此配置中,您在 ejabbered 和 riak 应用程序中加载了独立(彼此)的模块集。 ejabberd_riak 模块已加载到 ejabberd 应用程序中,但未加载到 riak 应用程序中。

但是 get_by_index 使用需要 ejabberd_riak 在 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 阶段在每个集群节点上执行。