1

我正在建立一个 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 调用。

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

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)
4

1 回答 1

1

您可能应该ejabberd_riak在 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阶段是在每个集群节点上执行的。

于 2016-05-20T20:33:02.007 回答