From b015d08cbaa06dd00cb4f467ebb66c879d1d4a36 Mon Sep 17 00:00:00 2001 From: zhongwencool Date: Wed, 6 Dec 2023 08:56:20 +0800 Subject: [PATCH] fix: use sync_transation when update admin/token --- apps/emqx_dashboard/src/emqx_dashboard_admin.erl | 14 +++++++++----- apps/emqx_dashboard/src/emqx_dashboard_token.erl | 6 +++--- apps/emqx_management/src/emqx_mgmt_auth.erl | 2 +- changes/ce/fix-12111.en.md | 1 + 4 files changed, 14 insertions(+), 9 deletions(-) create mode 100644 changes/ce/fix-12111.en.md diff --git a/apps/emqx_dashboard/src/emqx_dashboard_admin.erl b/apps/emqx_dashboard/src/emqx_dashboard_admin.erl index c264a1b0f..6c2271aee 100644 --- a/apps/emqx_dashboard/src/emqx_dashboard_admin.erl +++ b/apps/emqx_dashboard/src/emqx_dashboard_admin.erl @@ -114,7 +114,7 @@ add_user(Username, Password, Role, Desc) when is_binary(Username), is_binary(Pas end. 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). %% 0-9 or A-Z or a-z or $_ @@ -191,7 +191,7 @@ force_add_user(Username, Password, Role, Desc) -> description = Desc }) end, - case mria:transaction(?DASHBOARD_SHARD, AddFun) of + case mria:sync_transaction(?DASHBOARD_SHARD, AddFun) of {atomic, ok} -> ok; {aborted, Reason} -> {error, Reason} end. @@ -227,7 +227,7 @@ remove_user(Username) -> _ -> mnesia:delete({?ADMIN, Username}) end end, - case return(mria:transaction(?DASHBOARD_SHARD, Trans)) of + case return(mria:sync_transaction(?DASHBOARD_SHARD, Trans)) of {ok, Result} -> _ = emqx_dashboard_token:destroy_by_username(Username), {ok, Result}; @@ -242,7 +242,11 @@ update_user(Username, Role, Desc) -> ok -> case 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 {ok, {true, Result}} -> @@ -324,7 +328,7 @@ update_pwd(Username, Fun) -> end, mnesia:write(Fun(User)) end, - return(mria:transaction(?DASHBOARD_SHARD, Trans)). + return(mria:sync_transaction(?DASHBOARD_SHARD, Trans)). -spec lookup_user(dashboard_username()) -> [emqx_admin()]. lookup_user(Username) -> diff --git a/apps/emqx_dashboard/src/emqx_dashboard_token.erl b/apps/emqx_dashboard/src/emqx_dashboard_token.erl index 9a9875935..20041e393 100644 --- a/apps/emqx_dashboard/src/emqx_dashboard_token.erl +++ b/apps/emqx_dashboard/src/emqx_dashboard_token.erl @@ -119,7 +119,7 @@ do_sign(#?ADMIN{username = Username} = User, Password) -> {_, Token} = jose_jws:compact(Signed), Role = emqx_dashboard_admin:role(User), 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}. -spec do_verify(_, Token :: binary()) -> @@ -141,7 +141,7 @@ do_verify(Req, Token) -> do_destroy(Token) -> 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. do_destroy_by_username(Username) -> @@ -266,7 +266,7 @@ check_rbac(_Req, JWT) -> save_new_jwt(OldJWT) -> #?ADMIN_JWT{exptime = _ExpTime, extra = _Extra, username = Username} = OldJWT, NewJWT = OldJWT#?ADMIN_JWT{exptime = jwt_expiration_time()}, - {atomic, Res} = mria:transaction( + {atomic, Res} = mria:sync_transaction( ?DASHBOARD_SHARD, fun mnesia:write/1, [NewJWT] diff --git a/apps/emqx_management/src/emqx_mgmt_auth.erl b/apps/emqx_management/src/emqx_mgmt_auth.erl index b75d2bf28..559344e2b 100644 --- a/apps/emqx_management/src/emqx_mgmt_auth.erl +++ b/apps/emqx_management/src/emqx_mgmt_auth.erl @@ -338,7 +338,7 @@ generate_unique_name(NamePrefix, ApiKey) -> <>. trans(Fun, Args) -> - case mria:transaction(?COMMON_SHARD, Fun, Args) of + case mria:sync_transaction(?COMMON_SHARD, Fun, Args) of {atomic, Res} -> {ok, Res}; {aborted, Error} -> {error, Error} end. diff --git a/changes/ce/fix-12111.en.md b/changes/ce/fix-12111.en.md new file mode 100644 index 000000000..b41598394 --- /dev/null +++ b/changes/ce/fix-12111.en.md @@ -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.