Skip to content

Commit

Permalink
Implementation of delete-with-meta in capi
Browse files Browse the repository at this point in the history
Change-Id: I1ac7959e701a1bb94c4358383acea5166a4cd0d9
Reviewed-on: http://review.couchbase.org/13659
Tested-by: Srinivas Vadlamani <srinivas@couchbase.com>
Tested-by: Aliaksey Kandratsenka <alkondratenko@gmail.com>
Reviewed-by: Aliaksey Kandratsenka <alkondratenko@gmail.com>
  • Loading branch information
Srinivas Vadlamani authored and alk committed Mar 8, 2012
1 parent 4e23f66 commit fd4e327
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 28 deletions.
2 changes: 2 additions & 0 deletions include/mc_constants.hrl
Expand Up @@ -57,6 +57,8 @@
-define(CMD_SETQ_WITH_META, 16#a3).
-define(CMD_ADD_WITH_META, 16#a4).
-define(CMD_ADDQ_WITH_META, 16#a5).
-define(CMD_DEL_WITH_META, 16#a8).
-define(CMD_DELQ_WITH_META, 16#a9).

-define(RGET, 16#30).
-define(RSET, 16#31).
Expand Down
33 changes: 12 additions & 21 deletions src/capi_replication.erl
Expand Up @@ -202,8 +202,8 @@ do_update_replicated_doc_loop(Bucket, VBucket, DocId,
{error, enoent, CAS} ->
case DocDeleted of
true ->
%% TODO: we must preserve source revision here
ok;
do_delete_with_meta(Bucket, DocId, VBucket, DocRev,
CAS);
false ->
do_set_with_meta(Bucket, DocId, VBucket, DocValue,
DocRev, CAS)
Expand All @@ -218,19 +218,12 @@ do_update_replicated_doc_loop(Bucket, VBucket, DocId,
ours ->
ok;
theirs ->
{cas, CAS} = lists:keyfind(cas, 1, Props),
case DocDeleted of
true ->
case Deleted of
true ->
%% TODO: we must preserve winning
%% revision here
ok;
false ->
{cas, CAS} = lists:keyfind(cas, 1, Props),
do_delete(Bucket, DocId, VBucket, CAS)
end;
do_delete_with_meta(Bucket, DocId, VBucket,
DocRev, CAS);
false ->
{cas, CAS} = lists:keyfind(cas, 1, Props),
do_set_with_meta(Bucket, DocId, VBucket,
DocValue, DocRev, CAS)
end
Expand Down Expand Up @@ -261,18 +254,16 @@ do_set_with_meta(Bucket, DocId, VBucket, DocValue, DocRev, CAS) ->
{error, {bad_request, einval}}
end.

do_delete(Bucket, DocId, VBucket, CAS) ->
{ok, Header, _Entry, _NCB} =
ns_memcached:delete(Bucket, DocId, VBucket, CAS),
Status = Header#mc_header.status,
case Status of
?SUCCESS ->
do_delete_with_meta(Bucket, DocId, VBucket, DocRev, CAS) ->
case ns_memcached:delete_with_meta(Bucket, DocId, VBucket, {revid, DocRev},
CAS) of
{ok, _, _} ->
ok;
?KEY_ENOENT ->
{memcached_error, key_enoent, _} ->
retry;
?NOT_MY_VBUCKET ->
{memcached_error, not_my_vbucket, _} ->
{error, {bad_request, not_my_vbucket}};
?EINVAL ->
{memcached_error, einval, _} ->
{error, {bad_request, einval}}
end.

Expand Down
26 changes: 19 additions & 7 deletions src/mc_client_binary.erl
Expand Up @@ -63,6 +63,7 @@
?CMD_GET_META | ?CMD_GETQ_META |
?CMD_SET_WITH_META | ?CMD_SETQ_WITH_META |
?CMD_ADD_WITH_META | ?CMD_SETQ_WITH_META |
?CMD_DEL_WITH_META | ?CMD_DELQ_WITH_META |
?RGET | ?RSET | ?RSETQ | ?RAPPEND | ?RAPPENDQ | ?RPREPEND |
?RPREPENDQ | ?RDELETE | ?RDELETEQ | ?RINCR | ?RINCRQ |
?RDECR | ?RDECRQ | ?SYNC.
Expand Down Expand Up @@ -382,13 +383,23 @@ add_with_meta(Sock, Key, VBucket, Value, Meta, Flags, Expiration) ->
meta_cmd(Sock, ?CMD_ADD_WITH_META,
Key, VBucket, Value, Meta, 0, Flags, Expiration).

delete_with_meta(Sock, Key, VBucket, _Meta, CAS) ->
%% TODO: this is only a stub
{ok, Header, Entry, _} =
mc_client_binary:cmd(?DELETE, Sock, undefined, undefined,
{#mc_header{vbucket = VBucket},
#mc_entry{key = Key, cas = CAS}}),
{ok, Header, Entry}.
delete_with_meta(Sock, Key, VBucket, Meta, CAS) ->
case encode_meta(Meta) of
{ok, MetaBin} ->
MetaLen = size(MetaBin),
Response = cmd(?CMD_DEL_WITH_META, Sock, undefined, undefined,
{#mc_header{vbucket = VBucket},
#mc_entry{key = Key, data = MetaBin,
ext = <<MetaLen:32/big>>, cas = CAS}}),
case Response of
{ok, #mc_header{status=?SUCCESS} = RespHeader, RespEntry, _} ->
{ok, RespHeader, RespEntry};
_ ->
process_error_response(Response)
end;
Error ->
Error
end.

encode_meta({revid, {SeqNo, RevId}})
when is_integer(SeqNo), is_binary(RevId) ->
Expand Down Expand Up @@ -450,6 +461,7 @@ is_quiet(?TAP_CONNECT) -> true;
is_quiet(?CMD_GETQ_META) -> true;
is_quiet(?CMD_SETQ_WITH_META) -> true;
is_quiet(?CMD_ADDQ_WITH_META) -> true;
is_quiet(?CMD_DELQ_WITH_META) -> true;
is_quiet(_) -> false.

ext(?SET, Entry) -> ext_flag_expire(Entry);
Expand Down

0 comments on commit fd4e327

Please sign in to comment.