I've been playing with using postcommit hooks in some code. I couldn't find an example, so looking at the source, I think the right way to set one up is something like:
PHook = {struct, [ {<<"mod">>, <<?MODULE_STRING>>}, {<<"fun">>, <<"notify_change">>}]}, RiakClient:set_bucket(<<?MY_KEY>>, [{postcommit, [PHook]}]), Is there a better way? Also, in debugging my hook, I found that wrapping the hook so I could see exceptions made it much easier. I made the following patch that I think might be useful to others, as well: diff -r e836ea266eca apps/riak_kv/src/riak_kv_put_fsm.erl --- a/apps/riak_kv/src/riak_kv_put_fsm.erl Thu May 13 17:28:01 2010 -0400 +++ b/apps/riak_kv/src/riak_kv_put_fsm.erl Thu May 13 14:50:07 2010 -0700 @@ -314,7 +314,7 @@ invoke_hook(precommit, Mod0, Fun0, undefined, RObj) -> Mod = binary_to_atom(Mod0, utf8), Fun = binary_to_atom(Fun0, utf8), - Mod:Fun(RObj); + wrap_hook(Mod, Fun, RObj); invoke_hook(precommit, undefined, undefined, JSName, RObj) -> case riak_kv_js_manager:blocking_dispatch({{jsfun, JSName}, RObj}) of {ok, <<"fail">>} -> @@ -331,13 +331,22 @@ invoke_hook(postcommit, Mod0, Fun0, undefined, Obj) -> Mod = binary_to_atom(Mod0, utf8), Fun = binary_to_atom(Fun0, utf8), - proc_lib:spawn(fun() -> Mod:Fun(Obj) end); + proc_lib:spawn(fun() -> wrap_hook(Mod,Fun,Obj) end); invoke_hook(postcommit, undefined, undefined, _JSName, _Obj) -> error_logger:warning_msg("Javascript post-commit hooks aren't implemented"); %% NOP to handle all other cases invoke_hook(_, _, _, _, RObj) -> RObj. +wrap_hook(Mod, Fun, Obj)-> + try Mod:Fun(Obj) + catch + EType:X -> + error_logger:error_msg("problem invoking hook ~p:~p -> ~p:~p~n~p~n", + [Mod, Fun, EType, X, erlang:get_stacktrace()]), + fail + end. + merge_robjs(RObjs0,AllowMult) -> RObjs1 = [X || X <- [riak_kv_util:obj_not_deleted(O) || O <- RObjs0], X /= undefined], Bruce _______________________________________________ riak-users mailing list riak-users@lists.basho.com http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com