|
28 | 28 | -include("ns_common.hrl"). |
29 | 29 | -include("rbac.hrl"). |
30 | 30 | -include_lib("ns_common/include/cut.hrl"). |
| 31 | +-include("cb_cluster_secrets.hrl"). |
31 | 32 |
|
32 | 33 | -define(CHECK_INTERVAL, 10000). |
33 | 34 | -define(CHECK_WARMUP_INTERVAL, 500). |
|
42 | 43 | -define(GET_KEYS_TIMEOUT, ?get_timeout(get_keys, 60000)). |
43 | 44 | -define(GET_KEYS_OUTER_TIMEOUT, ?get_timeout(get_keys_outer, 70000)). |
44 | 45 | -define(MAGMA_CREATION_TIMEOUT, ?get_timeout(magma_creation, 300000)). |
| 46 | +-define(DEKS_TIMEOUT, ?get_timeout(deks, 60000)). |
45 | 47 |
|
46 | 48 | -define(RECBUF, ?get_param(recbuf, 64 * 1024)). |
47 | 49 | -define(SNDBUF, ?get_param(sndbuf, 64 * 1024)). |
|
132 | 134 | get_collections_uid/1, |
133 | 135 | maybe_add_impersonate_user_frame_info/2, |
134 | 136 | delete_bucket/2, |
135 | | - get_config_stats/2 |
| 137 | + get_config_stats/2, |
| 138 | + set_active_dek/2 |
136 | 139 | ]). |
137 | 140 |
|
138 | 141 | %% for ns_memcached_sockets_pool, memcached_file_refresh only |
|
149 | 152 | %% |
150 | 153 |
|
151 | 154 | start_link(Bucket) -> |
| 155 | + %% Sync with node monitor to make sure the key is created by the time |
| 156 | + %% when ns_memcached is started. Note that ns_memcached can't call |
| 157 | + %% cb_cluster_secrets, because cb_cluster_secrets calls ns_memcached, so |
| 158 | + %% deadlock is possible. |
| 159 | + cb_cluster_secrets:sync_with_node_monitor(), |
152 | 160 | gen_server:start_link({local, server(Bucket)}, ?MODULE, Bucket, []). |
153 | 161 |
|
154 | 162 |
|
@@ -822,7 +830,6 @@ handle_info({connect_done, WorkersCount, RV}, #state{bucket = Bucket, |
822 | 830 | gen_event:notify(buckets_events, {started, Bucket}), |
823 | 831 | erlang:process_flag(trap_exit, true), |
824 | 832 | Self = self(), |
825 | | - |
826 | 833 | case RV of |
827 | 834 | {ok, Sock} -> |
828 | 835 | try ensure_bucket(Sock, Bucket, false) of |
@@ -942,6 +949,7 @@ handle_info(Message, #state{worker_features = WF, control_queue = Q, |
942 | 949 | when Message =:= check_config_soon orelse Message =:= check_config -> |
943 | 950 | misc:flush(check_config_soon), |
944 | 951 | misc:flush(check_config), |
| 952 | + |
945 | 953 | case get_worker_features() of |
946 | 954 | WF -> |
947 | 955 | Self = self(), |
@@ -1568,9 +1576,19 @@ do_ensure_bucket(Sock, Bucket, BConf, false) -> |
1568 | 1576 | {ok, DBSubDir} = |
1569 | 1577 | ns_storage_conf:this_node_bucket_dbdir(Bucket), |
1570 | 1578 | ok = filelib:ensure_dir(DBSubDir), |
1571 | | - |
| 1579 | + {ok, {ActiveDekId, DekIds, IsEnabled}} = |
| 1580 | + cb_deks:list({bucketDek, Bucket}), |
| 1581 | + {ok, Deks} = cb_deks:read({bucketDek, Bucket}, DekIds), |
| 1582 | + {value, ActiveDek} = |
| 1583 | + case IsEnabled of |
| 1584 | + true -> |
| 1585 | + lists:search(fun (#{id := Id}) -> Id == ActiveDekId end, |
| 1586 | + Deks); |
| 1587 | + _ -> |
| 1588 | + {value, undefined} |
| 1589 | + end, |
1572 | 1590 | {Engine, ConfigString} = |
1573 | | - memcached_bucket_config:start_params(BConf), |
| 1591 | + memcached_bucket_config:start_params(BConf, ActiveDek, Deks), |
1574 | 1592 |
|
1575 | 1593 | BucketConfig = memcached_bucket_config:get_bucket_config(BConf), |
1576 | 1594 | Timeout = case ns_bucket:node_kv_backend_type(BucketConfig) of |
@@ -1845,6 +1863,29 @@ set_tls_config(Config) -> |
1845 | 1863 | end |
1846 | 1864 | end). |
1847 | 1865 |
|
| 1866 | +set_active_dek(TypeOrBucket, ActiveDek) -> |
| 1867 | + ?log_debug("Setting active encryption key id for ~p: ~p...", |
| 1868 | + [TypeOrBucket, maps:get(id, ActiveDek)]), |
| 1869 | + |
| 1870 | + RV = perform_very_long_call( |
| 1871 | + fun (Sock) -> |
| 1872 | + case mc_client_binary:set_active_encryption_key(Sock, |
| 1873 | + TypeOrBucket, |
| 1874 | + ActiveDek) of |
| 1875 | + ok -> {reply, ok}; |
| 1876 | + {memcached_error, S, Msg} -> |
| 1877 | + ?log_error("Setting encryption key for ~p failed: ~p", |
| 1878 | + [TypeOrBucket, {S, Msg}]), |
| 1879 | + {reply, {error, {S, Msg}}} |
| 1880 | + end |
| 1881 | + end), |
| 1882 | + |
| 1883 | + case RV of |
| 1884 | + ok -> ok; |
| 1885 | + {error, couldnt_connect_to_memcached} -> {error, retry}; |
| 1886 | + {error, E} -> {error, E} |
| 1887 | + end. |
| 1888 | + |
1848 | 1889 | get_bucket_stats(RootKey, StatKey, SubKey) -> |
1849 | 1890 | perform_very_long_call( |
1850 | 1891 | fun(Sock) -> |
|
0 commit comments