fix(mnesia): per-slot volumes hint and harden verification lookup.
CI / test (push) Failing after 5m10s
CI / deploy-ift (push) Has been skipped
CI / e2e-ift (push) Has been skipped
CI / deploy-stage (push) Has been skipped
CI / e2e-stage (push) Has been skipped

Avoid shared Mnesia dir across replicas; make get_or_create_token and CT verify_user resilient to brief cross-node lag.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-17 09:54:10 +03:00
parent a696d25486
commit 5e569da1d8
4 changed files with 62 additions and 16 deletions
+17 -5
View File
@@ -402,13 +402,25 @@ create_event(Token, CalId, Params) ->
%% @doc Подтверждает email пользователя, используя админский эндпоинт
%% для получения верификационного токена и публичный /v1/verify.
%% Retries briefly: IFT Traefik may hit another replica before Mnesia settles.
-spec verify_user(AdminToken :: binary(), UserId :: binary()) -> ok.
verify_user(AdminToken, UserId) ->
#{<<"token">> := Token} = admin_get(
<<"/v1/admin/users/", UserId/binary, "/verification-token">>, AdminToken),
{ok, 200, _, _} = client_request(post, <<"/v1/verify">>, <<>>,
jsx:encode(#{<<"token">> => Token})),
ok.
verify_user(AdminToken, UserId, 8).
verify_user(AdminToken, UserId, RetriesLeft) ->
Path = <<"/v1/admin/users/", UserId/binary, "/verification-token">>,
case admin_request(get, Path, AdminToken) of
{ok, 200, _, Body} ->
#{<<"token">> := Token} = jsx:decode(list_to_binary(Body), [return_maps]),
{ok, 200, _, _} = client_request(post, <<"/v1/verify">>, <<>>,
jsx:encode(#{<<"token">> => Token})),
ok;
{ok, 404, _, _} when RetriesLeft > 1 ->
timer:sleep(100),
verify_user(AdminToken, UserId, RetriesLeft - 1);
Other ->
error({verify_user_failed, UserId, Other})
end.
%%%===================================================================
%%% Внутренние функции