I just set up a precommit hook function in dev environment (KV 2.1.4) which
doesn't seem to be triggering off at all. The object is being stored in the
bucket, but the precommit logic is not kicking off. I checked couple of
things as listed below but came up with no error - so, it is a
head-scratcher why precommit hook is not triggering:

> - Verify precommit is set in bucket properties - snippet from curl query
> for bucket props below:
> "precommit":[{"mod":"precommit","fun":"pre_uuid"}]
>
> - check there is no error in logs
>
> - check riak-console for commit errors:
> $ ./riak1/bin/riak-admin status|grep commit
> postcommit_fail : 0
> precommit_fail : 0
>
> - Run the precommit function manually on Riak console itself with a riak
> object (that the hook failed to trigger on), and verify it works



Also, there is no sasl-error.log. "sasl = on" doesn't work in 2.1.4 because
it fails with bad_config error. So, I am assuming sasl logging is enabled
by default.

Here is what precommit function does:
- For the object (an immutable log append of JSON), calculate the location
of a LWW bucket, and update a easily calculated key with that JSON body. It
works fine from Riak console itself. Code below - we call pre_uuid in
precommit hook - both precommit.beam (where the function is) and
rutils.beam have been copied to the relevant location as set in riak
config, are accessible through Riak console and work fine if manually
executed on an object:

%% Preprocess JSON, and copy to a LWW bucket type
> preprocessJ(RObj,B,Choplen) ->
>   Bn = {rutils:calcBLWWType(RObj),B}, %%this returns the location of LWW
> bucket - works fine in riak console
>   %% We store uuid map in <username> key - we take out timestamp of length
> 32 including "_"
>   K = riak_object:key(RObj),
>   Kn = binary:part(K,0,byte_size(K) - Choplen),
>   NObj =
> riak_object:new(Bn,Kn,riak_object:get_value(RObj),riak_object:get_metadata(RObj)),
>   {ok, C} = riak:local_client(),
>   case C:put(NObj) of
>     ok -> RObj;
>     _ -> {fail,<<"Error when trying to process in precommit hook">>}
>   end.
>
> pre_uuid(RObj) -> preprocessJ(RObj,<<"uuid_latest">>,32).


Below is a manual execution from riak console of precommit function - first
we execute it to confirm it is returning the original object:

> (riak1@127.0.0.1)5> precommit:pre_uuid(O1).
> {r_object,{<<"test_kv_wo">>,<<"uuid_log">>},
>           <<"ahmed_2016-05-10T20%3a47%3a47.346299Z">>,
>           [{r_content,{dict,3,16,16,8,80,48,
>
> {[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
>
> {{[],[],[],[],[],[],[],[],[],[],[[...]|...],[],...}}},
>
> <<"{\"uname\":\"ahmed\",\"uuid\":\"df8c10e0-381d-5f65-bf43-cb8b4cb806fc\",\"timestamp\":\"2016-05-"...>>}],
>           [{<<0>>,{1,63630132467}}],
>           {dict,1,16,16,8,80,48,
>                 {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],...},
>                 {{[],[],[],[],[],[],[],[],[],[],[],[],[],...}}},
>           undefined}


Now, we check if the object has been written to test_lww/uuid_latest bucket
type:

> (riak1@127.0.0.1)6>
> C:get({<<"test_lww">>,<<"uuid_latest">>},<<"ahmed">>).

{ok,{r_object,{<<"hnm_fsm_lww">>,<<"uuid_latest">>},
>               <<"ahmed">>,
>               [{r_content,{dict,4,16,16,8,80,48,
>                                 {[],[],[],[],[],[],[],[],[],[],[],[],...},
>                                 {{[],[],[],[],[],[],[],[],[],[],...}}},
>
> <<"{\"uname\":\"ahmed\",\"uuid\":\"df8c10e0-381d-5f65-bf43-cb8b4cb806fc\",\"timestamp\":\""...>>}],
>               [{<<153,190,230,200,210,126,212,127,0,0,156,65>>,
>                 {1,63630148036}}],
>               {dict,1,16,16,8,80,48,
>                     {[],[],[],[],[],[],[],[],[],[],[],[],[],...},
>                     {{[],[],[],[],[],[],[],[],[],[],[],...}}},
>               undefined}}


Will appreciate pointer on how to debug precommit hook.
_______________________________________________
riak-users mailing list
riak-users@lists.basho.com
http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com

Reply via email to