Skip to content

Commit cca34c6

Browse files
committed
MB-47630 pass keys and values to memcached wrapped in function
...so they don't leak if the process crashes. This is needed because keys and values contain user data Change-Id: Ic56bf67333bd7f74b7338b182040e49f1577f13d Reviewed-on: http://review.couchbase.org/c/ns_server/+/158365 Well-Formed: Restriction Checker Reviewed-by: Abhijeeth Nuthan <[email protected]> Tested-by: Build Bot <[email protected]>
1 parent f68862e commit cca34c6

File tree

1 file changed

+29
-21
lines changed

1 file changed

+29
-21
lines changed

src/ns_memcached.erl

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -384,11 +384,12 @@ assign_queue({sync_delete_vbucket, _}) -> #state.very_heavy_calls_queue;
384384
assign_queue(flush) -> #state.very_heavy_calls_queue;
385385
assign_queue({set_vbucket, _, _, _}) -> #state.heavy_calls_queue;
386386
assign_queue({set_vbuckets, _}) -> #state.very_heavy_calls_queue;
387-
assign_queue({add, _Key, _VBucket, _Value}) -> #state.heavy_calls_queue;
388-
assign_queue({get, _Key, _VBucket}) -> #state.heavy_calls_queue;
389-
assign_queue({get_from_replica, _Key, _VBucket}) -> #state.heavy_calls_queue;
390-
assign_queue({delete, _Key, _VBucket}) -> #state.heavy_calls_queue;
391-
assign_queue({set, _Key, _VBucket, _Value, _Flags}) -> #state.heavy_calls_queue;
387+
assign_queue({add, _KeyFun, _VBucket, _ValueFun}) -> #state.heavy_calls_queue;
388+
assign_queue({get, _KeyFun, _VBucket}) -> #state.heavy_calls_queue;
389+
assign_queue({get_from_replica, _KeyFun, _VBucket}) -> #state.heavy_calls_queue;
390+
assign_queue({delete, _KeyFun, _VBucket}) -> #state.heavy_calls_queue;
391+
assign_queue({set, _KeyFun, _VBucket, _ValueFun, _Flags}) ->
392+
#state.heavy_calls_queue;
392393
assign_queue({get_keys, _VBuckets, _Params}) -> #state.heavy_calls_queue;
393394
assign_queue({get_mass_dcp_docs_estimate, _VBuckets}) -> #state.very_heavy_calls_queue;
394395
assign_queue({get_vbucket_details_stats, all, _}) -> #state.very_heavy_calls_queue;
@@ -524,34 +525,36 @@ do_handle_call(flush, _From, State) ->
524525
Reply = mc_client_binary:flush(State#state.sock),
525526
{reply, Reply, State};
526527

527-
do_handle_call({delete, Key, VBucket}, _From, State) ->
528+
do_handle_call({delete, KeyFun, VBucket}, _From, State) ->
528529
Reply = mc_client_binary:cmd(?DELETE, State#state.sock, undefined, undefined,
529530
{#mc_header{vbucket = VBucket},
530-
#mc_entry{key = Key}}),
531+
#mc_entry{key = KeyFun()}}),
531532
{reply, Reply, State};
532533

533-
do_handle_call({set, Key, VBucket, Val, Flags}, _From, State) ->
534+
do_handle_call({set, KeyFun, VBucket, ValFun, Flags}, _From, State) ->
534535
Reply = mc_client_binary:cmd(?SET, State#state.sock, undefined, undefined,
535536
{#mc_header{vbucket = VBucket},
536-
#mc_entry{key = Key, data = Val, flag = Flags}}),
537+
#mc_entry{key = KeyFun(), data = ValFun(),
538+
flag = Flags}}),
537539
{reply, Reply, State};
538540

539-
do_handle_call({add, Key, VBucket, Val}, _From, State) ->
541+
do_handle_call({add, KeyFun, VBucket, ValFun}, _From, State) ->
540542
Reply = mc_client_binary:cmd(?ADD, State#state.sock, undefined, undefined,
541543
{#mc_header{vbucket = VBucket},
542-
#mc_entry{key = Key, data = Val}}),
544+
#mc_entry{key = KeyFun(), data = ValFun()}}),
543545
{reply, Reply, State};
544546

545-
do_handle_call({get, Key, VBucket}, _From, State) ->
547+
do_handle_call({get, KeyFun, VBucket}, _From, State) ->
546548
Reply = mc_client_binary:cmd(?GET, State#state.sock, undefined, undefined,
547549
{#mc_header{vbucket = VBucket},
548-
#mc_entry{key = Key}}),
550+
#mc_entry{key = KeyFun()}}),
549551
{reply, Reply, State};
550552

551-
do_handle_call({get_from_replica, Key, VBucket}, _From, State) ->
552-
Reply = mc_client_binary:cmd(?CMD_GET_REPLICA, State#state.sock, undefined, undefined,
553+
do_handle_call({get_from_replica, KeyFun, VBucket}, _From, State) ->
554+
Reply = mc_client_binary:cmd(?CMD_GET_REPLICA, State#state.sock,
555+
undefined, undefined,
553556
{#mc_header{vbucket = VBucket},
554-
#mc_entry{key = Key}}),
557+
#mc_entry{key = KeyFun()}}),
555558
{reply, Reply, State};
556559

557560
do_handle_call({set_vbuckets, VBsToSet}, _From, #state{sock = Sock} = State) ->
@@ -902,19 +905,22 @@ flush(Bucket) ->
902905
{ok, #mc_header{}, #mc_entry{}, any()}.
903906
add(Bucket, Key, VBucket, Value) ->
904907
do_call({server(Bucket), node()},
905-
{add, Key, VBucket, Value}, ?TIMEOUT_HEAVY).
908+
{add, fun () -> Key end, VBucket, fun () -> Value end},
909+
?TIMEOUT_HEAVY).
906910

907911
%% @doc send get command to memcached instance
908912
-spec get(bucket_name(), binary(), integer()) ->
909913
{ok, #mc_header{}, #mc_entry{}, any()}.
910914
get(Bucket, Key, VBucket) ->
911-
do_call({server(Bucket), node()}, {get, Key, VBucket}, ?TIMEOUT_HEAVY).
915+
do_call({server(Bucket), node()}, {get, fun () -> Key end, VBucket},
916+
?TIMEOUT_HEAVY).
912917

913918
%% @doc send get_from_replica command to memcached instance. for testing only
914919
-spec get_from_replica(bucket_name(), binary(), integer()) ->
915920
{ok, #mc_header{}, #mc_entry{}, any()}.
916921
get_from_replica(Bucket, Key, VBucket) ->
917-
do_call({server(Bucket), node()}, {get_from_replica, Key, VBucket}, ?TIMEOUT_HEAVY).
922+
do_call({server(Bucket), node()}, {get_from_replica, fun () -> Key end,
923+
VBucket}, ?TIMEOUT_HEAVY).
918924

919925
%% @doc send an get metadata command to memcached
920926
-spec get_meta(bucket_name(), binary(), integer()) ->
@@ -943,15 +949,17 @@ get_xattrs(Bucket, Key, VBucket, Permissions) ->
943949
{ok, #mc_header{}, #mc_entry{}, any()} |
944950
{memcached_error, any(), any()}.
945951
delete(Bucket, Key, VBucket) ->
946-
do_call(server(Bucket), {delete, Key, VBucket}, ?TIMEOUT_HEAVY).
952+
do_call(server(Bucket), {delete, fun () -> Key end, VBucket},
953+
?TIMEOUT_HEAVY).
947954

948955
%% @doc send a set command to memcached instance
949956
-spec set(bucket_name(), binary(), integer(), binary(), integer()) ->
950957
{ok, #mc_header{}, #mc_entry{}, any()} |
951958
{memcached_error, any(), any()}.
952959
set(Bucket, Key, VBucket, Value, Flags) ->
953960
do_call({server(Bucket), node()},
954-
{set, Key, VBucket, Value, Flags}, ?TIMEOUT_HEAVY).
961+
{set, fun () -> Key end, VBucket, fun () -> Value end, Flags},
962+
?TIMEOUT_HEAVY).
955963

956964
-spec update_with_rev(Bucket::bucket_name(), VBucket::vbucket_id(),
957965
Id::binary(), Value::binary() | undefined, Rev :: rev(),

0 commit comments

Comments
 (0)