Skip to content

Commit 9c853d9

Browse files
MB-64910 MB-61292: Fix scenario when bucket is...
... not present in 'servers' list in bucket props but still can be used in future (so we should maintain DEKs for it). The scenario is the following: 1. Create 3 node cluster 2. Shutdown one node (node#3), and let the cluster fail it over 3. Start node#3 again 4. Add node#3 back using delta recovery At step #3 node#3 will still have bucket data (including DEKs) on disk while bucket props will not have node#3 in 'servers' list. In this scenario cb_cluster_secrets should continue to maintain bucket DEKs. Change-Id: I51d568bbd92423225f85b9c335dad4030197fde3 Reviewed-on: https://review.couchbase.org/c/ns_server/+/223328 Tested-by: Timofey Barmin <timofey.barmin@couchbase.com> Reviewed-by: Navdeep S Boparai <navdeep.boparai@couchbase.com> Well-Formed: Build Bot <build@couchbase.com>
1 parent ad933e4 commit 9c853d9

4 files changed

Lines changed: 29 additions & 11 deletions

File tree

apps/ns_server/src/cb_cluster_secrets.erl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,7 @@ init([Type]) ->
711711
case Type == ?NODE_PROC andalso
712712
cb_deks:dek_chronicle_keys_filter(Key) of
713713
false -> false;
714+
[] -> false;
714715
List -> {true, {dek_settings_updated, List}}
715716
end
716717
end,

apps/ns_server/src/cb_deks.erl

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -244,12 +244,21 @@ increment_counter_in_chronicle(Kind, SecretId) ->
244244
dek_chronicle_keys_filter(?CHRONICLE_ENCR_AT_REST_SETTINGS_KEY) ->
245245
[configDek, logDek, auditDek];
246246
dek_chronicle_keys_filter(Key) ->
247-
case ns_bucket:sub_key_match(Key) of
248-
{true, Bucket, props} -> [{bucketDek, Bucket}];
249-
{true, Bucket, encr_at_rest} -> [{bucketDek, Bucket}];
250-
{true, _Bucket, _} -> false;
251-
false -> false
252-
end.
247+
MembershipKeys = ns_cluster_membership:node_membership_keys(node()),
248+
lists:uniq(
249+
case ns_bucket:sub_key_match(Key) of
250+
{true, Bucket, props} -> [{bucketDek, Bucket}];
251+
{true, Bucket, encr_at_rest} -> [{bucketDek, Bucket}];
252+
{true, _Bucket, _} -> [];
253+
false -> []
254+
end ++
255+
case lists:member(Key, MembershipKeys) of
256+
true ->
257+
Buckets = ns_bucket:get_bucket_names(direct),
258+
[{bucketDek, B} || B <- Buckets];
259+
false ->
260+
[]
261+
end).
253262

254263
%% encryption_method_callback - called to determine if encryption is enabled
255264
%% or not for that type of entity.
@@ -346,9 +355,11 @@ dek_config({bucketDek, Bucket}) ->
346355
ns_memcached:get_dek_ids_in_use(Bucket)
347356
end,
348357
drop_callback => drop_bucket_deks(Bucket, _),
349-
chronicle_txn_keys => [ns_bucket:root(),
350-
ns_bucket:sub_key(Bucket, props),
351-
ns_bucket:sub_key(Bucket, encr_at_rest)],
358+
chronicle_txn_keys =>
359+
[ns_bucket:root(),
360+
ns_bucket:sub_key(Bucket, props),
361+
ns_bucket:sub_key(Bucket, encr_at_rest) |
362+
ns_cluster_membership:node_membership_keys(node())],
352363
required_usage => {bucket_encryption, Bucket}}.
353364

354365
%% Returns all possible deks kinds on the node.

apps/ns_server/src/ns_bucket.erl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2580,7 +2580,12 @@ validate_encryption_secret(SecretId, Bucket, Snapshot) ->
25802580
get_encryption(BucketName, Snapshot) ->
25812581
case get_bucket(BucketName, Snapshot) of
25822582
{ok, BucketConfig} ->
2583-
case lists:member(node(), get_servers(BucketConfig)) of
2583+
IsNodeInServers = lists:member(node(), get_servers(BucketConfig)),
2584+
{ok, Dir} = ns_storage_conf:this_node_bucket_dbdir(BucketName),
2585+
ExistsOnDisk = filelib:is_dir(Dir),
2586+
Services = ns_cluster_membership:node_services(Snapshot, node()),
2587+
IsKVNode = lists:member(kv, Services),
2588+
case IsNodeInServers orelse (IsKVNode andalso ExistsOnDisk) of
25842589
true ->
25852590
case proplists:get_value(encryption_secret_id, BucketConfig,
25862591
?SECRET_ID_NOT_SET) of

apps/ns_server/src/ns_cluster_membership.erl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@
5555
attach_node_uuids/2,
5656
fetch_snapshot/1,
5757
get_snapshot/1,
58-
get_snapshot/0
58+
get_snapshot/0,
59+
node_membership_keys/1
5960
]).
6061

6162
-export([supported_services/0,

0 commit comments

Comments
 (0)