fix: use sync_transation when update admin/token

This commit is contained in:
zhongwencool 2023-12-06 08:56:20 +08:00
parent 99399c6e95
commit b015d08cba
4 changed files with 14 additions and 9 deletions

View File

@ -114,7 +114,7 @@ add_user(Username, Password, Role, Desc) when is_binary(Username), is_binary(Pas
end. end.
do_add_user(Username, Password, Role, Desc) -> do_add_user(Username, Password, Role, Desc) ->
Res = mria:transaction(?DASHBOARD_SHARD, fun add_user_/4, [Username, Password, Role, Desc]), Res = mria:sync_transaction(?DASHBOARD_SHARD, fun add_user_/4, [Username, Password, Role, Desc]),
return(Res). return(Res).
%% 0-9 or A-Z or a-z or $_ %% 0-9 or A-Z or a-z or $_
@ -191,7 +191,7 @@ force_add_user(Username, Password, Role, Desc) ->
description = Desc description = Desc
}) })
end, end,
case mria:transaction(?DASHBOARD_SHARD, AddFun) of case mria:sync_transaction(?DASHBOARD_SHARD, AddFun) of
{atomic, ok} -> ok; {atomic, ok} -> ok;
{aborted, Reason} -> {error, Reason} {aborted, Reason} -> {error, Reason}
end. end.
@ -227,7 +227,7 @@ remove_user(Username) ->
_ -> mnesia:delete({?ADMIN, Username}) _ -> mnesia:delete({?ADMIN, Username})
end end
end, end,
case return(mria:transaction(?DASHBOARD_SHARD, Trans)) of case return(mria:sync_transaction(?DASHBOARD_SHARD, Trans)) of
{ok, Result} -> {ok, Result} ->
_ = emqx_dashboard_token:destroy_by_username(Username), _ = emqx_dashboard_token:destroy_by_username(Username),
{ok, Result}; {ok, Result};
@ -242,7 +242,11 @@ update_user(Username, Role, Desc) ->
ok -> ok ->
case case
return( return(
mria:transaction(?DASHBOARD_SHARD, fun update_user_/3, [Username, Role, Desc]) mria:sync_transaction(
?DASHBOARD_SHARD,
fun update_user_/3,
[Username, Role, Desc]
)
) )
of of
{ok, {true, Result}} -> {ok, {true, Result}} ->
@ -324,7 +328,7 @@ update_pwd(Username, Fun) ->
end, end,
mnesia:write(Fun(User)) mnesia:write(Fun(User))
end, end,
return(mria:transaction(?DASHBOARD_SHARD, Trans)). return(mria:sync_transaction(?DASHBOARD_SHARD, Trans)).
-spec lookup_user(dashboard_username()) -> [emqx_admin()]. -spec lookup_user(dashboard_username()) -> [emqx_admin()].
lookup_user(Username) -> lookup_user(Username) ->

View File

@ -119,7 +119,7 @@ do_sign(#?ADMIN{username = Username} = User, Password) ->
{_, Token} = jose_jws:compact(Signed), {_, Token} = jose_jws:compact(Signed),
Role = emqx_dashboard_admin:role(User), Role = emqx_dashboard_admin:role(User),
JWTRec = format(Token, Username, Role, ExpTime), JWTRec = format(Token, Username, Role, ExpTime),
_ = mria:transaction(?DASHBOARD_SHARD, fun mnesia:write/1, [JWTRec]), _ = mria:sync_transaction(?DASHBOARD_SHARD, fun mnesia:write/1, [JWTRec]),
{ok, Role, Token}. {ok, Role, Token}.
-spec do_verify(_, Token :: binary()) -> -spec do_verify(_, Token :: binary()) ->
@ -141,7 +141,7 @@ do_verify(Req, Token) ->
do_destroy(Token) -> do_destroy(Token) ->
Fun = fun mnesia:delete/1, Fun = fun mnesia:delete/1,
{atomic, ok} = mria:transaction(?DASHBOARD_SHARD, Fun, [{?TAB, Token}]), {atomic, ok} = mria:sync_transaction(?DASHBOARD_SHARD, Fun, [{?TAB, Token}]),
ok. ok.
do_destroy_by_username(Username) -> do_destroy_by_username(Username) ->
@ -266,7 +266,7 @@ check_rbac(_Req, JWT) ->
save_new_jwt(OldJWT) -> save_new_jwt(OldJWT) ->
#?ADMIN_JWT{exptime = _ExpTime, extra = _Extra, username = Username} = OldJWT, #?ADMIN_JWT{exptime = _ExpTime, extra = _Extra, username = Username} = OldJWT,
NewJWT = OldJWT#?ADMIN_JWT{exptime = jwt_expiration_time()}, NewJWT = OldJWT#?ADMIN_JWT{exptime = jwt_expiration_time()},
{atomic, Res} = mria:transaction( {atomic, Res} = mria:sync_transaction(
?DASHBOARD_SHARD, ?DASHBOARD_SHARD,
fun mnesia:write/1, fun mnesia:write/1,
[NewJWT] [NewJWT]

View File

@ -338,7 +338,7 @@ generate_unique_name(NamePrefix, ApiKey) ->
<<NamePrefix/binary, (hash_string_from_seed(ApiKey, ?DEFAULT_HASH_LEN))/binary>>. <<NamePrefix/binary, (hash_string_from_seed(ApiKey, ?DEFAULT_HASH_LEN))/binary>>.
trans(Fun, Args) -> trans(Fun, Args) ->
case mria:transaction(?COMMON_SHARD, Fun, Args) of case mria:sync_transaction(?COMMON_SHARD, Fun, Args) of
{atomic, Res} -> {ok, Res}; {atomic, Res} -> {ok, Res};
{aborted, Error} -> {error, Error} {aborted, Error} -> {error, Error}
end. end.

View File

@ -0,0 +1 @@
Fix an issue where API tokens were sometimes unavailable by using sync_transaction function to ensure all updates are consistently synchronized to the replica node.