@@ -1420,18 +1420,24 @@ add_active_key(Id, #{id := KekId} = Kek,
1420
1420
1421
1421
- spec ensure_all_keks_on_disk (# state {}) ->
1422
1422
{ok , # state {}} | {error , # state {}, list ()}.
1423
- ensure_all_keks_on_disk (# state {kek_hashes_on_disk = Vsns } = State ) ->
1424
- {RV , NewVsns } = persist_keks (Vsns ),
1423
+ ensure_all_keks_on_disk (State ) ->
1424
+ ensure_all_keks_on_disk (State , direct ).
1425
+
1426
+ - spec ensure_all_keks_on_disk (# state {}, chronicle_snapshot ()) ->
1427
+ {ok , # state {}} | {error , # state {}, list ()}.
1428
+ ensure_all_keks_on_disk (# state {kek_hashes_on_disk = Vsns } = State , Snapshot ) ->
1429
+ {RV , NewVsns } = persist_keks (Vsns , Snapshot ),
1425
1430
NewState = State # state {kek_hashes_on_disk = NewVsns },
1426
1431
case RV of
1427
1432
ok -> {ok , NewState };
1428
1433
{error , Reason } -> {error , NewState , Reason }
1429
1434
end .
1430
1435
1431
- - spec persist_keks (Hashes ) ->
1436
+ - spec persist_keks (Hashes , Snapshot ) ->
1432
1437
{ok , Hashes } |
1433
- {{error , term ()}, Hashes } when Hashes :: #{secret_id () => integer ()}.
1434
- persist_keks (Hashes ) ->
1438
+ {{error , term ()}, Hashes } when Hashes :: #{secret_id () => integer ()},
1439
+ Snapshot :: chronicle_snapshot ().
1440
+ persist_keks (Hashes , Snapshot ) ->
1435
1441
Write = fun (#{type := ? CB_MANAGED_KEY_TYPE } = SecretProps ) ->
1436
1442
ensure_cb_managed_keks_on_disk (SecretProps , false );
1437
1443
(#{type := ? AWSKMS_KEY_TYPE } = SecretProps ) ->
@@ -1442,7 +1448,7 @@ persist_keks(Hashes) ->
1442
1448
ok
1443
1449
end ,
1444
1450
1445
- {ok , AllSecrets } = topologically_sorted_secrets (get_all ()),
1451
+ {ok , AllSecrets } = topologically_sorted_secrets (get_all (Snapshot )),
1446
1452
1447
1453
{RV , NewHashes } = lists :mapfoldl (
1448
1454
fun (#{id := Id , name := Name } = S , Acc ) ->
@@ -2152,9 +2158,11 @@ maybe_read_deks(#state{} = State) ->
2152
2158
#{cb_deks :dek_kind () => deks_info ()},
2153
2159
[term ()]}.
2154
2160
init_deks () ->
2155
- Deks = read_all_deks (),
2161
+ Snapshot = chronicle_compat :get_snapshot ([fun fetch_snapshot_in_txn /1 ],
2162
+ #{}),
2163
+ Deks = read_all_deks (Snapshot ),
2156
2164
KekPushHashes =
2157
- case persist_keks (#{}) of
2165
+ case persist_keks (#{}, Snapshot ) of
2158
2166
{ok , H } -> H ;
2159
2167
{{error , Reason }, H } ->
2160
2168
% % Some Keks may have been written so we use the updated state
@@ -2167,7 +2175,7 @@ init_deks() ->
2167
2175
{ReencryptedDeksList , Errors } =
2168
2176
lists :mapfoldl (
2169
2177
fun ({Kind , KindDeks }, Acc ) ->
2170
- case reencrypt_deks (Kind , KindDeks ) of
2178
+ case reencrypt_deks (Kind , KindDeks , Snapshot ) of
2171
2179
no_change ->
2172
2180
{{Kind , KindDeks }, Acc };
2173
2181
{changed , NewKindDeks , Errors } ->
@@ -2180,8 +2188,9 @@ init_deks() ->
2180
2188
ReencryptedDeks = maps :from_list (ReencryptedDeksList ),
2181
2189
{KekPushHashes , ReencryptedDeks , Errors }.
2182
2190
2183
- - spec read_all_deks () -> #{cb_deks :dek_kind () => deks_info ()}.
2184
- read_all_deks () ->
2191
+ - spec read_all_deks (chronicle_snapshot ()) ->
2192
+ #{cb_deks :dek_kind () => deks_info ()}.
2193
+ read_all_deks (Snapshot ) ->
2185
2194
GetCfgDek = encryption_service :read_dek (configDek , _ ),
2186
2195
VerifyMac = fun encryption_service :verify_mac /2 ,
2187
2196
{ok , Term } = cb_deks_raw_utils :read_deks_file (deks_file_path (), GetCfgDek ,
@@ -2191,7 +2200,6 @@ read_all_deks() ->
2191
2200
fun (Kind , #{is_enabled := IsEnabled ,
2192
2201
active_id := ActiveId ,
2193
2202
dek_ids := DekIds }) ->
2194
- Snapshot = deks_config_snapshot (Kind ),
2195
2203
case call_dek_callback (encryption_method_callback , Kind ,
2196
2204
[node , Snapshot ]) of
2197
2205
{succ , {ok , _ }} ->
@@ -2293,26 +2301,33 @@ generate_new_dek(Kind, CurrentDeks, EncryptionMethod, Snapshot) ->
2293
2301
maybe_reencrypt_deks (Kind , # state {deks_info = Deks } = State ) ->
2294
2302
case maps :find (Kind , Deks ) of
2295
2303
{ok , KindDeks } ->
2296
- case reencrypt_deks (Kind , KindDeks ) of
2297
- no_change -> {ok , State };
2304
+ Snapshot = deks_config_snapshot (Kind ),
2305
+ NewState = case ensure_all_keks_on_disk (State , Snapshot ) of
2306
+ {ok , NS } -> NS ;
2307
+ {error , NS , EnsureErrors } ->
2308
+ ? log_error (" Failed to ensure all keks on "
2309
+ " disk: ~p " , [EnsureErrors ]),
2310
+ NS
2311
+ end ,
2312
+ case reencrypt_deks (Kind , KindDeks , Snapshot ) of
2313
+ no_change -> {ok , NewState };
2298
2314
{changed , NewKindDeks , Errors } ->
2299
- NewState =
2300
- State # state {deks_info = Deks #{Kind => NewKindDeks }},
2301
- NewState2 = on_deks_update (Kind , NewState ),
2315
+ NewState2 =
2316
+ NewState # state {deks_info = Deks #{Kind => NewKindDeks }},
2317
+ NewState3 = on_deks_update (Kind , NewState2 ),
2302
2318
case Errors of
2303
- [] -> {ok , NewState2 };
2304
- _ -> {error , NewState2 , Errors }
2319
+ [] -> {ok , NewState3 };
2320
+ _ -> {error , NewState3 , Errors }
2305
2321
end ;
2306
2322
{error , Errors } ->
2307
- {error , State , Errors }
2323
+ {error , NewState , Errors }
2308
2324
end ;
2309
2325
error ->
2310
2326
{ok , State }
2311
2327
end .
2312
2328
2313
- reencrypt_deks (Kind , #{deks := Keys } = DeksInfo ) ->
2329
+ reencrypt_deks (Kind , #{deks := Keys } = DeksInfo , Snapshot ) ->
2314
2330
maybe
2315
- Snapshot = deks_config_snapshot (Kind ),
2316
2331
{succ , {ok , EncrMethod }} ?= call_dek_callback (
2317
2332
encryption_method_callback ,
2318
2333
Kind ,
0 commit comments