ejabberd_riak 删除功能
ejabberd_riak delete functions
我正在设置一个 ejabbered + riak 集群,我必须在其中使用文件中的基本 riak(get、put、delete..)函数 ejabberd/src/ejabberd_riak.erl
函数 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)
你应该在 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
阶段在每个集群节点上执行。
我正在设置一个 ejabbered + riak 集群,我必须在其中使用文件中的基本 riak(get、put、delete..)函数 ejabberd/src/ejabberd_riak.erl
函数 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)
你应该在 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
阶段在每个集群节点上执行。