erlang - 在提交后 Hook 中处理风险数据类型

标签 erlang riak post-commit-hook crdt

我想为 riak 实现一个提交后 Hook ,它会减少另一个存储桶中映射中的计数器。但是,我在处理 riak 数据类型时遇到了一些麻烦。

这是我在 riak console 上的尝试:

(riak@127.0.0.1)9>{ok, C} = riak:local_client().
{ok,{riak_client,['riak@127.0.0.1',undefined]}}
(riak@127.0.0.1)10>{ok, Obj} = C:get({<<"product">>, <<"default">>}, <<"1">>).
{ok,{r_object,{<<"product">>,<<"default">>},
          <<"1">>,
          [{r_content,{dict,5,16,16,8,80,48,
                            {[],[],[],[],[],[],[],[],[],[],[],[],...},
                            {{[],[],[],[],
                              [[<<"dot">>|{<<"#\tþù"...>>,{...}}]],
                              [],[],[],[],[],...}}},
                      <<69,2,0,0,0,11,114,105,97,107,95,100,116,95,109,97,112,
                        77,1,...>>}],
          [{<<35,9,254,249,108,41,151,242>>,{1,63593788980}}],
          {dict,1,16,16,8,80,48,
                {[],[],[],[],[],[],[],[],[],[],[],[],[],...},
                {{[],[],[],[],[],[],[],[],[],[],[],...}}},
          undefined}}
(riak@127.0.0.1)11> Mp = riak_object:get_value(O3).
<<69,2,0,0,0,11,114,105,97,107,95,100,116,95,109,97,112,
  77,1,131,80,0,0,0,206,120,1,203,96,...>>
(riak@127.0.0.1)12> MpP = riak_dt_map:from_binary(Mp).
{error,invalid_binary}

product 存储桶数据类型设置为 map。每个存储的对象都应该有一个名为 quantity 的计数器,我想将其递减。

但是我找不到任何处理提交前或提交后上下文中的数据类型的文档或示例代码。 (实际上任何类型的例子都很少)。我一直在阅读 riak_client 的来源和 riak_dt_map但我是 erlang 的新手,所以我进展缓慢,希望得到一些帮助。

最佳答案

您拥有的 r_object 并不直接包含 riak_dt_map,而是包含一个 riak_kv_crdt,其中包含一个 riak_dt_map,而 riak_dt_map 又包含您的计数器。

要更新计数器,您需要先从 map 获取上下文:

{{Context,_},_}=riak_kv_crdt:value(Obj,riak_dt_map).

然后构建操作以增加 CRDT 中包含的映射中名为 <<"name">> 的计数器:

Op = {crdt_op,riak_dt_map,{update,[{update,{<<"name">>,riak_dt_emcntr},increment}]},Context}.

然后将该操作应用于 CRDT,提供您要用于更新 vclock/版本向量的参与者 ID:

NewObj = riak_kv_crdt:update(Obj,Actor,Op).

结果应该是另一个准备好发送回存储的 r_object。

关于erlang - 在提交后 Hook 中处理风险数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29092235/

相关文章:

git - 我可以在 Gitlab 网络编辑器提交后触发 git hook 吗?

linux - SVN 提交后更新错误(无法从模板创建临时文件/权限被拒绝)

search - 二郎邻居搜索

erlang - 为什么 Dialyzer 相信具有过于具体的返回类型的规范?

riak - 在 docker 容器中自动运行服务

riak - 如何解决这个错误: riak_client: RuntimeError: The NetHTTP HTTP backend cannot used

database - NoSQL 数据库中的全文搜索

svn - 在 Windows 上使用 post-commit Hook 触发 Jenkins 远程构建

erlang - 如何在 gen_servers 中进行选择性接收?

erlang - 将 Enum.map 从 Elixir 更改为 Erlang