Erlang Riak提交挂钩CRDT增量计数器

Erlang Riak提交挂钩CRDT增量计数器,erlang,riak,Erlang,Riak,我有一个提交钩子,我想更新一个计数器 目前我有: -module(bucket_counter). -export([precommit/1]). -record(crdt_op, {mod, op, ctx}). -define(CRDT_OP, #crdt_op). -define(V1_COUNTER_TYPE, riak_kv_pncounter). precommit(RObj) -> {ok, Client} = riak:local_client(),

我有一个提交钩子,我想更新一个计数器

目前我有:

-module(bucket_counter).
-export([precommit/1]).


-record(crdt_op, {mod, op, ctx}).
-define(CRDT_OP, #crdt_op).

-define(V1_COUNTER_TYPE, riak_kv_pncounter).

precommit(RObj) ->
    {ok, Client} = riak:local_client(),
    Bucket = {<<"counters">>, <<"update_counts">>},
    Id = <<"all">>,
    Counter = case Client:get(Bucket, Id) of
        {error, notfound} -> riak_object:new(Bucket, Id, 0);
        {ok, Obj} -> Obj
    end,
    io:format("Counter ~p~n", [Counter]),

    {{Context,_},_} = riak_kv_crdt:value(Counter, ?V1_COUNTER_TYPE),

    Op = ?CRDT_OP{mod=?V1_COUNTER_TYPE, op={increment, 1}, ctx=Context},
    Counter2 = riak_kv_crdt:update(Counter, <<"1234">>, Op),

    io:format("Gen ~p~n", [Counter2]),
    %Counter3 = riak_kv_crdt:merge(Counter2),
    Client:put(Counter2),
    RObj.
-模块(桶计数器)。
-导出([预提交/1])。
-记录(crdt_op,{mod,op,ctx})。
-定义(CRDT_OP,#CRDT_OP)。
-定义(V1_计数器类型,riak_kv_计数器)。
预提交(RObj)->
{ok,Client}=riak:local_Client(),
Bucket={,},
Id=,
计数器=案例客户端:获取(Bucket,Id)的
{error,notfound}->riak_对象:新建(Bucket,Id,0);
{好的,Obj}->Obj
完,,
io:格式(“计数器~p~n”,[Counter]),
{{Context,{u},{u}=riak\u kv\u crdt:value(计数器,V1\u计数器类型),
Op=?CRDT_Op{mod=?V1_计数器类型,Op={increment,1},ctx=Context},
计数器2=riak_kv_crdt:更新(计数器,Op),
io:格式(“Gen~p~n,[Counter2]),
%计数器3=riak_kv_crdt:合并(计数器2),
客户:卖出(对价2),
罗布。
这将产生以下错误:

    @riak_kv_put_fsm:decode_precommit:887 Problem invoking pre-commit hook bucket_counter:precommit -> error:function_clause
[{riak_kv_crdt,update_crdt,[[{riak_dt_pncounter,{{dict,5,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[[<<"dot">>|{<<252,97,47,244,1,104,136,26>>,{1,63622971158}}]],[],[],[],[],[],[[<<"content-type">>,97,112,112,108,105,99,97,116,105,111,110,47,114,105,97,107,95,99,111,117,110,116,101,114],[<<"X-Riak-VTag">>,53,87,81,75,79,113,110,77,80,111,117,49,71,101,120,122,52,67,89,115,66,122]],[[<<"index">>]],[],[[<<"X-Riak-Last-Modified">>|{1455,751958,325156}]],[],[]}}},{crdt,riak_dt_pncounter,"application/riak_counter",[{<<252,97,47,244,1,104,136,26>>,1,0}]}}}],<<"1234">>,{crdt_op,riak_kv_pncounter,{increment,1},<<>>}],[{file,"src/riak_kv_crdt.erl"},{line,234}]},{riak_kv_crdt,update,3,[{file,"src/riak_kv_crdt.erl"},{line,61}]},{bucket_counter,precommit,1,[{file,"bucket_counter.erl"},{line,24}]},{riak_kv_put_fsm,invoke_hook,4,[{file,"src/riak_kv_put_fsm.erl"},{line,853}]},{riak_kv_put_fsm,precommit,2,[{file,"src/riak_kv_put_fsm.erl"},{line,503}]},{gen_fsm,handle_msg,7,[{file,"gen_fsm.erl"},{line,505}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]
@riak\u kv\u put\u fsm:decode\u precommit:887调用pre-commit hook bucket的问题\u计数器:precommit->error:function\u子句
3.3.6,16,8,8,80,48,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,[2,52,67,89115,66122],[[],,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmit,1,[{file,“bucket_counter.erl”},{line,24}]},{线路,853}},{{线路,853}},{{线路,853}}},{线路,853}}},{{线路,853}},{{riak{riak{riak{kv{put-fsm,预提交,2,调用钩,4,4,{4,4,调用钩,4,{4,4,{文件,4,4,4,{{文件,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,{6,{{5,5,{6,{6,5,5,5,5,5,5,}},{5,{5,5,5,5 lib.erl“},{line,239}]}]
查看riak_kv source,似乎只有在有上下文的情况下,“合并”才适用于贴图和集合:

我已尝试删除该上下文,但由于兄弟姐妹关系,它随后崩溃:

riak_index:parse_object_hook:116 Siblings not allowed: {r_object,{<<"counters">>,<<"update_counts">>},<<"all">>,[{r_content,{dict,2,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[[<<"X-Riak-VTag">>,49,67,49,85,69,121,66,118,111,84,56,85,118,81,104,104,106,74,101,98,49,71]],[],[],[[<<"X-Riak-Last-Modified">>|{1455,750950,430934}]],[],[]}}},<<69,2,0,0,0,17,114,105,97,107,95,100,116,95,112,110,99,111,117,110,116,101,114,71,2,131,108,0,0,0,1,104,3,109,0,0,0,8,252,97,47,244,156,20,105,128,97,1,97,0,106>>},{r_content,{dict,2,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[[<<"X-Riak-VTag">>,49,67,49,85,69,121,66,118,111,84,56,85,118,81,104,104,106,74,101,98,49,71]],[],[],[[<<"X-Riak-Last-Modified">>|{1455,750950,430934}]],[],[]}}},<<69,1,71,1,0,0,0,22,70,1,131,108,0,0,0,1,104,2,109,0,0,0,4,49,50,51,52,97,1,106,0,0,0,4,70,1,131,106>>}],[{<<252,97,47,244,156,20,105,128>>,{1,63622970068}}],{dict,1,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[[clean|true]],[]}}},undefined}
[参考代码>Rik)参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考},},{r_content,{dict,2,16,16,8,80,48,{[][,[,,,[,,[,,,[,,,[,,,[,,,[,,,[,,,[,,[,,[,,,[,,,,[,,,[,,,,[,,,,,,[,,,,,,[,,,,[,,,,[,,,,[,,,,[,,,,[,,,,,[,,,,,,[,,,,,[,,,,,,,,,[,,,,,,,,,,,,,,,,,,,[,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[][[clean | true]],[]}},未定义} 更新到map会给我一个同级错误:

-module(bucket_counter).
-export([precommit/1]).


-record(crdt_op, {mod, op, ctx}).
-define(CRDT_OP, #crdt_op).

-define(V1_COUNTER_TYPE, riak_kv_pncounter).


precommit(RObj) ->
    {ok, Client} = riak:local_client(),
    Bucket = {<<"counters">>, <<"update_counts">>},
    Id = <<"all">>,
    {Counter, Context} = case Client:get(Bucket, Id) of
        {error, notfound} -> 
            Obj = riak_object:new(Bucket, Id, 0),
            {Obj, undefined};
        {ok, Obj} ->
            {{CountContext,_},_} = riak_kv_crdt:value(Obj, riak_dt_map),
            {Obj, CountContext}
    end,
    io:format("Counter ~p~n", [Counter]),

    Op = ?CRDT_OP{mod=riak_dt_map, op={update,[{update,{<<"count">>,riak_dt_emcntr},increment}]}, ctx=Context},
    Counter2 = riak_kv_crdt:update(Counter, <<"1234">>, Op),

    io:format("Gen ~p~n", [Counter2]),
    %Counter3 = riak_kv_crdt:merge(Counter2),
    Client:put(Counter2),
    RObj.



riak_index:parse_object_hook:116 Siblings not allowed: {r_object,{<<"counters">>,<<"update_counts">>},<<"all">>,[{r_content,{dict,2,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[[<<"X-Riak-VTag">>,74,73,109,71,89,110,100,82,71,101,88,80,71,107,72,105,53,113,78,48,90]],[],[],[[<<"X-Riak-Last-Modified">>|{1455,756505,963692}]],[],[]}}},<<69,2,0,0,0,11,114,105,97,107,95,100,116,95,109,97,112,77,1,131,80,0,0,0,132,120,1,203,96,206,97,96,96,96,204,96,202,5,82,44,134,70,198,38,137,140,89,80,33,136,32,107,114,126,105,94,73,10,3,95,81,102,98,118,124,74,73,124,106,110,114,94,73,81,6,19,138,42,168,86,184,40,22,227,224,66,25,204,137,140,64,200,144,149,149,193,148,5,4,0,198,254,26,118>>},{r_content,{dict,2,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[[<<"X-Riak-VTag">>,74,73,109,71,89,110,100,82,71,101,88,80,71,107,72,105,53,113,78,48,90]],[],[],[[<<"X-Riak-Last-Modified">>|{1455,756505,963692}]],[],[]}}},0}],[],{dict,1,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[[clean|true]],[]}}},undefined}
2016-02-18 00:48:25.966 [debug] <0.2105.0>@riak_kv_put_fsm:decode_precommit:880 Pre-commit hook riak_index:parse_object_hook failed with reason {siblings_not_allowed,{r_object,{<<"counters">>,<<"update_counts">>},<<"all">>,[{r_content,{dict,2,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[[<<"X-Riak-VTag">>,74,73,109,71,89,110,100,82,71,101,88,80,71,107,72,105,53,113,78,48,90]],[],[],[[<<"X-Riak-Last-Modified">>|{1455,756505,963692}]],[],[]}}},<<69,2,0,0,0,11,114,105,97,107,95,100,116,95,109,97,112,77,1,131,80,0,0,0,132,120,1,203,96,206,97,96,96,96,204,96,202,5,82,44,134,70,198,38,137,140,89,80,33,136,32,107,114,126,105,94,73,10,3,95,81,102,98,118,124,74,73,124,106,110,114,94,73,81,6,19,138,42,168,86,184,40,22,227,224,66,25,204,137,140,64,200,144,149,149,193,148,5,4,0,198,254,26,118>>},{r_content,{dict,2,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[[<<"X-Riak-VTag">>,74,73,109,71,89,110,100,82,71,101,88,80,71,107,72,105,53,113,78,48,90]],[],[],[[<<"X-Riak-Last-Modified">>|{1455,756505,963692}]],[],[]}}},0}],[],{dict,1,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[[clean|true]],[]}}},undefined}}
-模块(桶计数器)。
-导出([预提交/1])。
-记录(crdt_op,{mod,op,ctx})。
-定义(CRDT_OP,#CRDT_OP)。
-定义(V1_计数器类型,riak_kv_计数器)。
预提交(RObj)->
{ok,Client}=riak:local_Client(),
Bucket={,},
Id=,
{Counter,Context}=case-Client:get(Bucket,Id)of
{错误,未找到}->
Obj=riak_对象:新(Bucket,Id,0),
{Obj,未定义};
{好的,Obj}->
{{CountContext,{},{}=riak_kv_crdt:value(Obj,riak_dt_map),
{Obj,CountContext}
完,,
io:格式(“计数器~p~n”,[Counter]),
Op=?CRDT_Op{mod=riak_dt_映射,Op={update,[{update,{,riak_dt_emcntr},increment}]},ctx=Context},
计数器2=riak_kv_crdt:更新(计数器,Op),
io:格式(“Gen~p~n,[Counter2]),
%计数器3=riak_kv_crdt:合并(计数器2),
客户:卖出(对价2),
罗布。
3.参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考参考索引:解析解析对象(U)学生学生学生(U)学生(U)学生)学生(钩)钩)钩:116个兄弟姐妹:116兄弟姐妹们不允许:116兄弟姐妹们不允许:116兄弟姐妹们不允许:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::r_内容,{dict,2,16,16,8,80,48,{[],[],[],[],[][,[,,,[,,,[,,,[,,,[,,,[,,,[,,,[,,[,,,[,,[,,[,,,[,,,[,,[,,,[,,,,[,,,,,,,,[,,,,,[,,,,[,,,,,,,,[,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,[[[[[,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,[[[[[[[,,,,,,,,,,,,,,,,,,,,,,,[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]清洁|真实]、[]}}未定义}
2016-02-18 00:48:25.966[debug]@riak_kv_put_fsm:decode_precommit:880 Pre commit hook riak_index:parse_object_hook失败,原因是{兄弟姐妹不允许,{r_object,{,},[{,},{r_内容,{dict,2,16,16,8,80,48,{,[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[[7.48,90[[[[90]],,,[[[,,,,,,[[[,,,,[,,,[,,,,[,,,[,,,[,,,[,,,[,,[[[[[[[[[[[[]],,[[[[[[]],,,,,,[,,,[,,,,[,,,,,[,,,,[,,,,[,,,,[,,,,,[,,,,,,,,[,,,,,,[,,[,,,,,,[,,,,,,,,,[,,,,,[,,,,,,,,,,,,,,,,,,,,,[,,,,,,,[,,,,[,,,,,,,[,,,,,,,,,,,,,,[,,,,,,,,,,,,,,,48,90]]、[]、[]、[]、[[…]、[…]、[…]、[…]、[…}}、0}],[],{dict,1,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]清洁|真实],[],[],[],[]未定义}

我已经弄明白了,我正在使用1.4文档,取而代之的是我需要做
riak\u kv\u crdt:new(Bucket,Id,riak\u dt\u map)