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

fix: bulk subscribe topics failed in the client.connected hook

Shawn 3 лет назад
Родитель
Сommit
73643e932f
1 измененных файлов с 8 добавлено и 5 удалено
  1. 8 5
      apps/emqx_management/src/emqx_mgmt_api_clients.erl

+ 8 - 5
apps/emqx_management/src/emqx_mgmt_api_clients.erl

@@ -718,15 +718,18 @@ subscribe(#{clientid := ClientID, topic := Topic} = Sub) ->
     end.
 
 subscribe_batch(#{clientid := ClientID, topics := Topics}) ->
-    case lookup(#{clientid => ClientID}) of
-        {200, _} ->
+    %% We use emqx_channel instead of emqx_channel_info (used by the emqx_mgmt:lookup_client/2),
+    %% as the emqx_channel_info table will only be populated after the hook `client.connected`
+    %% has returned. So if one want to subscribe topics in this hook, it will fail.
+    case ets:lookup(emqx_channel, ClientID) of
+        [] ->
+            {404, ?CLIENT_ID_NOT_FOUND};
+        _ ->
             ArgList = [
                 [ClientID, Topic, maps:with([qos, nl, rap, rh], Sub)]
              || #{topic := Topic} = Sub <- Topics
             ],
-            {200, emqx_mgmt_util:batch_operation(?MODULE, do_subscribe, ArgList)};
-        {404, ?CLIENT_ID_NOT_FOUND} ->
-            {404, ?CLIENT_ID_NOT_FOUND}
+            {200, emqx_mgmt_util:batch_operation(?MODULE, do_subscribe, ArgList)}
     end.
 
 unsubscribe(#{clientid := ClientID, topic := Topic}) ->