Просмотр исходного кода

fix: use sync_transation when update admin/token

zhongwencool 2 лет назад
Родитель
Сommit
b015d08cba

+ 9 - 5
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) ->

+ 3 - 3
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]

+ 1 - 1
apps/emqx_management/src/emqx_mgmt_auth.erl

@@ -338,7 +338,7 @@ generate_unique_name(NamePrefix, ApiKey) ->
     <<NamePrefix/binary, (hash_string_from_seed(ApiKey, ?DEFAULT_HASH_LEN))/binary>>.
 
 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.

+ 1 - 0
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.