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

fix(pmap): try not to exit abnormal as much as possible

Zaiming (Stone) Shi 3 лет назад
Родитель
Сommit
7824ae5f09
2 измененных файлов с 14 добавлено и 5 удалено
  1. 12 3
      apps/emqx/src/emqx_misc.erl
  2. 2 2
      apps/emqx/test/emqx_misc_SUITE.erl

+ 12 - 3
apps/emqx/src/emqx_misc.erl

@@ -473,7 +473,14 @@ do_parallel_map(Fun, List) ->
         fun(Item) ->
             erlang:spawn_link(
                 fun() ->
-                    Parent ! {self(), Fun(Item)}
+                    Res =
+                        try
+                            {normal, Fun(Item)}
+                        catch
+                            C:E:St ->
+                                {exception, {C, E, St}}
+                        end,
+                    Parent ! {self(), Res}
                 end
             )
         end,
@@ -482,8 +489,10 @@ do_parallel_map(Fun, List) ->
     lists:foldr(
         fun(Pid, Acc) ->
             receive
-                {Pid, Result} ->
-                    [Result | Acc]
+                {Pid, {normal, Result}} ->
+                    [Result | Acc];
+                {Pid, {exception, {C, E, St}}} ->
+                    erlang:raise(C, E, St)
             end
         end,
         [],

+ 2 - 2
apps/emqx/test/emqx_misc_SUITE.erl

@@ -194,8 +194,8 @@ t_pmap_timeout(_) ->
     ).
 
 t_pmap_exception(_) ->
-    ?assertExit(
-        {foobar, _},
+    ?assertError(
+        foobar,
         emqx_misc:pmap(
             fun
                 (error) -> error(foobar);