Good afternoon,
I am writing to ask for some help regarding a pre-commit hook in Riak
2.1.1. I am locally running a 5 node Riak dev cluster (
https://github.com/xing/riak-dev-cluster) on a Mac and am having trouble
with a pre-commit hook. I have added the "add_paths" to my advanced.config:
[
Riak KV config
{riak_kv,
[
%% Paths to custom erlang modules.
{add_paths, ["/tmp/ls/custom_modules"]}
]}
].
and then copied the compiled beam to this directory. I then issued a curl
PUT to add the pre-commit to the bucket props:
curl -XPUT -H "Content-Type: application/json" -d
'{"props":{"precommit":[{"mod":"rr_pre_commit","fun":"set_process_datetime_index"}]}}'
http://127.0.0.1:11098/buckets/LS\~News/props
and am able to confirm it worked when I do a GET on the bucket properties.
The bucket already had a single key stored in it and when I do another PUT
on that object (hoping to get the pre-commit to fire), I get the following
error:
{error,badarg,
[{erlang,iolist_to_binary,
[{hook_crashed,
{rr_pre_commit,set_process_datetime_index,error,
function_clause}}],
[]},
{wrq,append_to_response_body,2,[{file,"src/wrq.erl"},{line,215}]},
{riak_kv_wm_object,handle_common_error,3,
[{file,"src/riak_kv_wm_object.erl"},{line,1178}]},
{webmachine_resource,resource_call,3,
[{file,"src/webmachine_resource.erl"},{line,186}]},
{webmachine_resource,do,3,
[{file,"src/webmachine_resource.erl"},{line,142}]},
{webmachine_decision_core,resource_call,1,
[{file,"src/webmachine_decision_core.erl"},{line,48}]},
{webmachine_decision_core,accept_helper,1,
[{file,"src/webmachine_decision_core.erl"},{line,616}]},
{webmachine_decision_core,decision,1,
[{file,"src/webmachine_decision_core.erl"},{line,521}]}]}}
I am able to run the pre-commit function when I attach to the Riak
shell and add the paths manually (code:add_patha) but not when it
triggers via a PUT. Also, in my pre-commit hook module/function I am
using the riak erlang client to access the object metadata. Is this
module compiled into Riak or do I also need to add a path for this?
The pre-commit module/function is below:
set_process_datetime_index(Obj) ->
case is_deleted(Obj) of
true ->
Obj;
_ ->
MD = riakc_obj:get_update_metadata(Obj),
case riakc_obj:get_user_metadata_entry(MD,
<<"process_messagedate">>) of
%% if user "process messagedate" metadata is not found
notfound ->
%% add it
MD2 =
riakc_obj:set_user_metadata_entry(MD,{<<"process_messagedate">>,format_date_index(calendar:local_time())}),
%% and modify the message_date 2i index
MD3 = riakc_obj:set_secondary_index(MD2,{{binary_index,
<<"messagedate">>}, [format_date_index(calendar:local_time())]}),
riakc_obj:update_metadata(Obj,MD3);
_ ->
%% otherwise, don't do anything as we have already
stored the process time
Obj
end
end.
is_deleted(Obj)->
case dict:find(<<"X-Riak-Deleted">>,riakc_obj:get_metadata(Obj)) of
{ok,_} ->
true;
_ ->
false
end.
Any help or advice is appreciated.
Geoff
_______________________________________________
riak-users mailing list
[email protected]
http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com