我正在建立一个ejabbered + riak集群,我必须在文件ejabberd/src/ejabberd_riak.erl中使用基本的riak(get,put,delete ..)函数
put,get,get_by_index等函数运行良好,使用文件中模块的用法我可以弄清楚是什么。
我遇到了函数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)
答案 0 :(得分:1)
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
阶段。