basho / riak

Riak is a decentralized datastore from Basho Technologies.

Home Page:http://docs.basho.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Post-commit hook not triggered on Riak 3.0.9

pingenglj opened this issue · comments

Hi, Ive installed Riak 3.0.9, and am trying to add a postcommit hook:

cat > post_commit.erl << EOF
-module(post_commit).
-export([post/1]).

post(RiakObject) ->
  ssl:start(),
  application:start(inets),
  httpc:request(get,
      {"http://10.0.0.11:8000/", []}, [], []).    <----- Running a local API here
EOF
/usr/lib/riak/erts-10.7/bin/erlc post_commit.erl # must compile with riak erlc
sudo mv ./post_commit.beam /tmp/riak/
riak admin bucket-type create watch '{"props": {"postcommit": ["post_commit"]}}'
riak admin bucket-type activate watch

I have the following in /etc/riak/advanced.config, and did a riak chkconfig and riak restart after I made this change:

...
  {riak_kv, 
    [{add_paths, ["/tmp/riak/"]}]
  },
...

When I manually run the Erlang hook I see a response on my API running at port 8000: post_commit:post("").
However, when I add some data into a bucket, I don't see anything:

curl -X PUT http://10.0.0.11:8098/types/watch/buckets/some-bucket/keys/test.json -H "Content-type: application/json" --data-binary @test.json

I cannot see any indication in the logs that the postcommit is triggered/executed (or if there is some error), the bucket props show it being there though, and bucket is active:

curl -X GET http://10.0.0.11:8098/types/watch/buckets/some-bucket/props
{"props":{"name":"some-bucket","active":true,"allow_mult":true,"basic_quorum":false,"big_vclock":50,"chash_keyfun":{"mod":"riak_core_util","fun":"chash_std_keyfun"},"claimant":"riak@10.0.0.11","dvv_enabled":true,"dw":"quorum","last_write_wins":false,"linkfun":{"mod":"riak_kv_wm_link_walker","fun":"mapreduce_linkfun"},"n_val":3,"node_confirms":0,"notfound_ok":true,"old_vclock":86400,"postcommit":["post_commit"],"pr":0,"precommit":[],"pw":0,"r":"quorum","rw":"quorum","small_vclock":50,"sync_on_write":"backend","w":"quorum","young_vclock":20}}

Am I missing anything?

If I look at /var/log/riak/run_erl.log I do see some indication of disabling hooks, but Im unsure if it is relevant for enabling postcommit hooks:

==> /var/log/riak/run_erl.log <==
run_erl [17359] Mon Dec 27 14:58:08 2021
Args before exec of shell:
run_erl [17359] Mon Dec 27 14:58:08 2021
argv[0] = sh
run_erl [17359] Mon Dec 27 14:58:08 2021
argv[1] = -c
run_erl [17359] Mon Dec 27 14:58:08 2021
argv[2] = exec "/usr/lib/riak/bin/riak" "console" '-pa' '/usr/lib/riak/lib/patches'  --relx-disable-hooks

I have a number of riak processes, both the run_erl and riak binaries seem to have the --relx-disable-hooks flag, would that interfere with my postcommit hook?:

riak     17063  0.0  0.0   8276    84 ?        S    14:57   0:00 /usr/lib/riak/erts-10.7/bin/epmd -daemon
riak     17356  0.0  0.2  15084  2064 ?        S    14:58   0:00 /usr/lib/riak/erts-10.7/bin/run_erl -daemon /tmp/erl_pipes/riak@10.0.0.11/ /var/log/riak exec "/usr/lib/riak/bin/riak" "console" '-pa' '/usr/lib/riak/lib/patches'  --relx-disable-hooks
riak     17359  0.8  7.1 2971304 71820 pts/0   Ssl+ 14:58   0:10 /usr/lib/riak/bin/riak -scl false -sfwi 500 -P 256000 -e 256000 -Q 262144 -A 64 -K true -W w -Bi -zdbbl 32768 -- -root /usr/lib/riak -progname usr/lib/riak/bin/riak -- -home /var/lib/riak -- -boot /usr/lib/riak/releases/3.0.9/riak -mode interactive -boot_var ERTS_LIB_DIR /usr/lib/riak/lib -config /var/lib/riak/sys.config -setcookie riak -name riak@10.0.0.11 -smp enable true -- -- console -pa /usr/lib/riak/lib/patches --relx-disable-hooks --
riak     17495  0.0  0.1   4528  1600 ?        Ss   14:58   0:00 erl_child_setup 65536
riak     17523  0.0  0.0   4636   828 ?        Ss   14:58   0:00 sh -s disksup
riak     17524  0.0  0.0   4388   808 ?        Ss   14:58   0:00 /usr/lib/riak/lib/os_mon-2.5.1/priv/bin/memsup
riak     17525  0.0  0.0   4520   808 ?        Ss   14:58   0:00 /usr/lib/riak/lib/os_mon-2.5.1/priv/bin/cpu_sup

Also no luck with:

riak admin bucket-type update watch '{"props": {"postcommit": [{"mod": "post_commit", "fun": "post"}]}}'

I think the correct format is to define both "mod" and "fun" in the postcommit bucket property as you have done above.

Are you able to call the Mod:Fun/1 from riak remote_console?
Have you tried adding a lager log line to your hook to see if it is called?
In riak admin stats is the postcommit_fail stat incrementing as you PUT objects?

@martinsumner Thanks for the quick response. Curiously, after doing a clean install it now seems to work. Perhaps a file permission issue, I was messing with compiling and moving the .erl/.beam and config files, while the Vagrant install script Im using is executed as root.

commented

This Riak version is 3.2.0, using Post-commit hook .

This is my erlang code:
`-module(post_commit).
-export([post/1]).

post(Object) ->
Path="/home/firefly/riak_new/riak_3.20/riak/rel/riak/test.sh",

KeyName = riak_object:key(Object),
io:format("Key name: ~s~n", [KeyName]),

BucketName = riak_object:bucket(Object), 
io:format("Bucket name: ~p~n", [BucketName]),

Value = riak_object:get_value(Object),
io:format("Object value: ~p~n", [Value]),

Command= io_lib:format("sh ~s ~s ~s ~n", [Path, [KeyName], [BucketName]]),
io:format("Command value: ~s~n", [Command]),

Output = os:cmd(Command),
io:format("~s~n", [Output]). `

when I add some data into a bucket, curl -XPUT http://localhost:8098/types/my_bucket_type/buckets/some-bucket/keys/babbbvv -H "Content-Type: application/json" -d '{"name": "John Smith", "age": 42, "email": "john.smith@example.caa1111odd9911m"}'

I can only get the key name "babbbvv " , but I can not get the bucket name "some-bucket".

Can you clarify what you mean by "can not get the bucket name"? Do you mean in the io:format output you get something else (perhaps undefined) where you expected to get BucketName?