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