]> granicus.if.org Git - ejabberd/commitdiff
Improve formatting of exceptions
authorEvgeny Khramtsov <ekhramtsov@process-one.net>
Sun, 7 Jul 2019 19:12:14 +0000 (22:12 +0300)
committerEvgeny Khramtsov <ekhramtsov@process-one.net>
Sun, 7 Jul 2019 19:12:14 +0000 (22:12 +0300)
12 files changed:
src/ejabberd_local.erl
src/ejabberd_mnesia.erl
src/ejabberd_router.erl
src/ejabberd_router_sql.erl
src/ejabberd_s2s.erl
src/ejabberd_sm.erl
src/ejabberd_sql.erl
src/gen_iq_handler.erl
src/gen_mod.erl
src/mod_muc_log.erl
src/mod_muc_room.erl
src/mod_roster.erl

index 3f8aa749b79d11ce93cff313cf98e7d522dc4f7d..91a9264a56b1500ebbbdacf76cedc88c7d47455d 100644 (file)
@@ -69,13 +69,20 @@ start_link() ->
     gen_server:start_link({local, ?MODULE}, ?MODULE, [],
                          []).
 
--spec route(stanza()) -> any().
+-spec route(stanza()) -> ok.
 route(Packet) ->
-    try do_route(Packet)
-    catch ?EX_RULE(E, R, St) ->
-           StackTrace = ?EX_STACK(St),
-           ?ERROR_MSG("Failed to route packet:~n~s~nReason = ~p",
-                      [xmpp:pp(Packet), {E, {R, StackTrace}}])
+    ?DEBUG("Local route:~n~s", [xmpp:pp(Packet)]),
+    Type = xmpp:get_type(Packet),
+    To = xmpp:get_to(Packet),
+    if To#jid.luser /= <<"">> ->
+           ejabberd_sm:route(Packet);
+       is_record(Packet, iq), To#jid.lresource == <<"">> ->
+           gen_iq_handler:handle(?MODULE, Packet);
+       Type == result; Type == error ->
+           ok;
+       true ->
+           ejabberd_hooks:run(local_send_to_resource_hook,
+                              To#jid.lserver, [Packet])
     end.
 
 -spec route_iq(iq(), function()) -> ok.
@@ -139,22 +146,6 @@ code_change(_OldVsn, State, _Extra) ->
 %%--------------------------------------------------------------------
 %%% Internal functions
 %%--------------------------------------------------------------------
--spec do_route(stanza()) -> any().
-do_route(Packet) ->
-    ?DEBUG("Local route:~n~s", [xmpp:pp(Packet)]),
-    Type = xmpp:get_type(Packet),
-    To = xmpp:get_to(Packet),
-    if To#jid.luser /= <<"">> ->
-           ejabberd_sm:route(Packet);
-       is_record(Packet, iq), To#jid.lresource == <<"">> ->
-           gen_iq_handler:handle(?MODULE, Packet);
-       Type == result; Type == error ->
-           ok;
-       true ->
-           ejabberd_hooks:run(local_send_to_resource_hook,
-                              To#jid.lserver, [Packet])
-    end.
-
 -spec update_table() -> ok.
 update_table() ->
     catch mnesia:delete_table(iq_response),
index 6f27231cbcd211730ee99a5f44b340f0407ebbe6..3df981124cdc6652eaecf2fbb7d46e8823ff913c 100644 (file)
@@ -365,14 +365,14 @@ do_transform(OldAttrs, Attrs, Old) ->
 transform_fun(Module, Name) ->
     fun(Obj) ->
            try Module:transform(Obj)
-           catch ?EX_RULE(E, R, St) ->
+           catch ?EX_RULE(Class, Reason, St) ->
                    StackTrace = ?EX_STACK(St),
                    ?ERROR_MSG("Failed to transform Mnesia table ~s:~n"
                               "** Record: ~p~n"
-                              "** Reason: ~p~n"
-                              "** StackTrace: ~p",
-                              [Name, Obj, R, StackTrace]),
-                   erlang:raise(E, R, StackTrace)
+                              "** ~s",
+                              [Name, Obj,
+                               misc:format_exception(2, Class, Reason, StackTrace)]),
+                   erlang:raise(Class, Reason, StackTrace)
            end
     end.
 
index 9c5c4e5057fb8df69bc0e750e54815f388ab5976..fe2db0ce0321e15bb450c3e46083ce5bf956c1be 100644 (file)
@@ -90,10 +90,11 @@ start_link() ->
 -spec route(stanza()) -> ok.
 route(Packet) ->
     try do_route(Packet)
-    catch ?EX_RULE(E, R, St) ->
+    catch ?EX_RULE(Class, Reason, St) ->
            StackTrace = ?EX_STACK(St),
-           ?ERROR_MSG("Failed to route packet:~n~s~nReason = ~p",
-                      [xmpp:pp(Packet), {E, {R, StackTrace}}])
+           ?ERROR_MSG("Failed to route packet:~n~s~n** ~s",
+                      [xmpp:pp(Packet),
+                       misc:format_exception(2, Class, Reason, StackTrace)])
     end.
 
 -spec route(jid(), jid(), xmlel() | stanza()) -> ok.
@@ -107,13 +108,7 @@ route(#jid{} = From, #jid{} = To, #xmlel{} = El) ->
                        xmpp:format_error(Why)])
     end;
 route(#jid{} = From, #jid{} = To, Packet) ->
-    case catch do_route(xmpp:set_from_to(Packet, From, To)) of
-       {'EXIT', Reason} ->
-           ?ERROR_MSG("~p~nwhen processing: ~p",
-                      [Reason, {From, To, Packet}]);
-       _ ->
-           ok
-    end.
+    route(xmpp:set_from_to(Packet, From, To)).
 
 -spec route_error(stanza(), stanza_error()) -> ok.
 route_error(Packet, Err) ->
index a64288fd9b5986d719b5f49cf3970d64f6d70aa7..92fbefdf53886aaa2ef3f396c533b9dbe3a3274d 100644 (file)
@@ -121,12 +121,13 @@ row_to_route(Domain, {ServerHost, NodeS, PidS, LocalHintS} = Row) ->
                local_hint = dec_local_hint(LocalHintS)}]
     catch _:{bad_node, _} ->
            [];
-         ?EX_RULE(E, R, St) ->
+         ?EX_RULE(Class, Reason, St) ->
            StackTrace = ?EX_STACK(St),
            ?ERROR_MSG("Failed to decode row from 'route' table:~n"
-                      "Row = ~p~n"
-                      "Domain = ~s~n"
-                      "Reason = ~p",
-                      [Row, Domain, {E, {R, StackTrace}}]),
+                      "** Row = ~p~n"
+                      "** Domain = ~s~n"
+                      "** ~s",
+                      [Row, Domain,
+                       misc:format_exception(2, Class, Reason, StackTrace)]),
            []
     end.
index 5e793ec36f585a60545788ac4a950c64bbab99fa..2128d6b6a66c89a89d1173b914573450e43ede0b 100644 (file)
@@ -86,16 +86,6 @@ start_link() ->
     gen_server:start_link({local, ?MODULE}, ?MODULE, [],
                          []).
 
--spec route(stanza()) -> ok.
-
-route(Packet) ->
-    try do_route(Packet)
-    catch ?EX_RULE(E, R, St) ->
-           StackTrace = ?EX_STACK(St),
-            ?ERROR_MSG("Failed to route packet:~n~s~nReason = ~p",
-                       [xmpp:pp(Packet), {E, {R, StackTrace}}])
-    end.
-
 clean_temporarily_blocked_table() ->
     mnesia:clear_table(temporarily_blocked).
 
@@ -296,7 +286,13 @@ handle_info({mnesia_system_event, {mnesia_down, Node}}, State) ->
     clean_table_from_bad_node(Node),
     {noreply, State};
 handle_info({route, Packet}, State) ->
-    route(Packet),
+    try route(Packet)
+    catch ?EX_RULE(Class, Reason, St) ->
+           StackTrace = ?EX_STACK(St),
+           ?ERROR_MSG("Failed to route packet:~n~s~n** ~s",
+                      [xmpp:pp(Packet),
+                       misc:format_exception(2, Class, Reason, StackTrace)])
+    end,
     {noreply, State};
 handle_info(_Info, State) -> {noreply, State}.
 
@@ -347,8 +343,8 @@ clean_table_from_bad_node(Node) ->
        end,
     mnesia:async_dirty(F).
 
--spec do_route(stanza()) -> ok.
-do_route(Packet) ->
+-spec route(stanza()) -> ok.
+route(Packet) ->
     ?DEBUG("Local route:~n~s", [xmpp:pp(Packet)]),
     From = xmpp:get_from(Packet),
     To = xmpp:get_to(Packet),
index 03218dc3e5eaf3af73995217fa30b26456637e9e..13ffa1af0e503e773cc9a4f566f937a93038c5e3 100644 (file)
@@ -125,12 +125,14 @@ stop() ->
 -spec route(jid(), term()) -> ok.
 %% @doc route arbitrary term to c2s process(es)
 route(To, Term) ->
-    case catch do_route(To, Term) of
-       {'EXIT', Reason} ->
-           ?ERROR_MSG("Route ~p to ~p failed: ~p",
-                      [Term, To, Reason]);
-       _ ->
-           ok
+    try do_route(To, Term), ok
+    catch ?EX_RULE(E, R, St) ->
+           StackTrace = ?EX_STACK(St),
+           ?ERROR_MSG("Failed to route term to ~s:~n"
+                      "** Term = ~p~n"
+                      "** ~s",
+                      [jid:encode(To), Term,
+                       misc:format_exception(2, E, R, StackTrace)])
     end.
 
 -spec route(stanza()) -> ok.
@@ -140,13 +142,8 @@ route(Packet) ->
        drop ->
            ?DEBUG("Hook dropped stanza:~n~s", [xmpp:pp(Packet)]);
        Packet1 ->
-           try do_route(Packet1), ok
-           catch ?EX_RULE(E, R, St) ->
-                   StackTrace = ?EX_STACK(St),
-                   ?ERROR_MSG("Failed to route packet:~n~s~nReason = ~p",
-                              [xmpp:pp(Packet1),
-                               {E, {R, StackTrace}}])
-           end
+           do_route(Packet1),
+           ok
     end.
 
 -spec open_session(sid(), binary(), binary(), binary(), prio(), info()) -> ok.
@@ -500,7 +497,13 @@ handle_call(_Request, _From, State) ->
 handle_cast(_Msg, State) -> {noreply, State}.
 
 handle_info({route, Packet}, State) ->
-    route(Packet),
+    try route(Packet)
+    catch ?EX_RULE(E, R, St) ->
+           StackTrace = ?EX_STACK(St),
+           ?ERROR_MSG("Failed to route packet:~n~s~n** ~s",
+                      [xmpp:pp(Packet),
+                       misc:format_exception(2, E, R, StackTrace)])
+    end,
     {noreply, State};
 handle_info(Info, State) ->
     ?WARNING_MSG("Unexpected info: ~p", [Info]),
index 029c22602912950dd2ff6b15a5fddd3f31895b67..5a94dcf8e21e0d875c8151ac05d10845c220bdfc 100644 (file)
@@ -618,8 +618,8 @@ sql_query_internal(#sql_query{} = Query) ->
                {error, <<"terminated unexpectedly">>};
              ?EX_RULE(Class, Reason, Stack) ->
                StackTrace = ?EX_STACK(Stack),
-                ?ERROR_MSG("Internal error while processing SQL query: ~p",
-                           [{Class, Reason, StackTrace}]),
+                ?ERROR_MSG("Internal error while processing SQL query:~n** ~s",
+                          [misc:format_exception(2, Class, Reason, StackTrace)]),
                 {error, <<"internal error">>}
         end,
     check_error(Res, Query);
@@ -760,10 +760,10 @@ sql_query_format_res({selected, _, Rows}, SQLQuery) ->
                   catch
                      ?EX_RULE(Class, Reason, Stack) ->
                          StackTrace = ?EX_STACK(Stack),
-                          ?ERROR_MSG("Error while processing "
-                                     "SQL query result: ~p~n"
-                                     "row: ~p",
-                                     [{Class, Reason, StackTrace}, Row]),
+                          ?ERROR_MSG("Error while processing SQL query result:~n"
+                                     "** Row: ~p~n** ~s",
+                                     [Row,
+                                     misc:format_exception(2, Class, Reason, StackTrace)]),
                           []
                   end
           end, Rows),
index c00ecefe3d5dfde531a326762bf1469347b6c7ec..a5fe4cd4389ef95e6bf18f2e76c4b64e6924ff22 100644 (file)
@@ -111,10 +111,11 @@ process_iq(_Host, Module, Function, IQ) ->
            ejabberd_router:route(ResIQ);
        ignore ->
            ok
-    catch ?EX_RULE(E, R, St) ->
+    catch ?EX_RULE(Class, Reason, St) ->
            StackTrace = ?EX_STACK(St),
-           ?ERROR_MSG("Failed to process iq:~n~s~nReason = ~p",
-                      [xmpp:pp(IQ), {E, {R, StackTrace}}]),
+           ?ERROR_MSG("Failed to process iq:~n~s~n** ~s",
+                      [xmpp:pp(IQ),
+                       misc:format_exception(2, Class, Reason, StackTrace)]),
            Txt = ?T("Module failed to handle the query"),
            Err = xmpp:err_internal_server_error(Txt, IQ#iq.lang),
            ejabberd_router:route_error(IQ, Err)
index 5e04c5dbb88f1b07ac245552ad10defe073526cb..f4d2323c4a2f835b36474e9bb55d6c4467afde44 100644 (file)
@@ -451,16 +451,15 @@ format_module_error(Module, Fun, Arity, Opts, Class, Reason, St) ->
            io_lib:format("Module ~s returned unexpected value from ~s/~B:~n"
                           "** Error: ~p~n"
                           "** Hint: this is either not an ejabberd module "
-                         "or it implements ejabbed API incorrectly",
+                         "or it implements ejabberd API incorrectly",
                          [Module, Fun, Arity, Ret]);
        _ ->
            io_lib:format("Internal error of module ~s has "
                          "occured during ~s:~n"
                          "** Options: ~p~n"
-                         "** Class: ~p~n"
-                         "** Reason: ~p~n"
-                         "** Stacktrace: ~p",
-                         [Module, Fun, Opts, Class, Reason, St])
+                         "** ~s",
+                         [Module, Fun, Opts,
+                          misc:format_exception(2, Class, Reason, St)])
     end.
 
 -spec format_hosts_list([binary()]) -> iolist().
index 2ad8475fc99eae8944e7754055ce3dfea481737b..79d31c360e0874e8c046ce109feec17c63aa8eb6 100644 (file)
@@ -503,7 +503,7 @@ create_image_files(Images_dir) ->
              case file:copy(Src, Dst) of
                  {ok, _} -> ok;
                  {error, Why} ->
-                     ?ERROR_MSG("Failed to copy ~s to ~s",
+                     ?ERROR_MSG("Failed to copy ~s to ~s: ~s",
                                 [Src, Dst, file:format_error(Why)])
              end
       end, Filenames).
index b0d9da2763eb24aecd07d0365ae2188092f1053d..f832106068cd487a3e45ed38d8ee93a2f2429b78 100644 (file)
@@ -759,9 +759,9 @@ terminate(Reason, _StateName,
     catch ?EX_RULE(E, R, St) ->
            StackTrace = ?EX_STACK(St),
            mod_muc:room_destroyed(Host, Room, self(), LServer),
-           ?ERROR_MSG("Got exception on room termination: ~p", [{E, {R, StackTrace}}])
-    end,
-    ok.
+           ?ERROR_MSG("Got exception on room termination:~n** ~s",
+                      [misc:format_exception(2, E, R, StackTrace)])
+    end.
 
 %%%----------------------------------------------------------------------
 %%% Internal functions
@@ -2803,8 +2803,9 @@ process_item_change(Item, SD, UJID) ->
                             undefined ->
                                 <<"">>
                         end,
-           ?ERROR_MSG("Failed to set item ~p~s: ~p",
-                      [Item, FromSuffix, {E, {R, StackTrace}}]),
+           ?ERROR_MSG("Failed to set item ~p~s:~n** ~s",
+                      [Item, FromSuffix,
+                       misc:format_exception(2, E, R, StackTrace)]),
            {error, xmpp:err_internal_server_error()}
     end.
 
index e3adce046f7617d993bebad87a2848f393159cee..5c880019f66d83765b5855cd2eaeb3ea9a1323a8 100644 (file)
@@ -270,63 +270,56 @@ write_roster_version(LUser, LServer, InTransaction) ->
 %%     - roster versioning is not used by the client OR
 %%     - roster versioning is used by server and client, BUT the server isn't storing versions on db OR
 %%     - the roster version from client don't match current version.
-process_iq_get(#iq{to = To, lang = Lang,
+process_iq_get(#iq{to = To,
                   sub_els = [#roster_query{ver = RequestedVersion}]} = IQ) ->
     LUser = To#jid.luser,
     LServer = To#jid.lserver,
     US = {LUser, LServer},
-    try {ItemsToSend, VersionToSend} =
-            case {roster_versioning_enabled(LServer),
-                  roster_version_on_db(LServer)} of
-                {true, true} when RequestedVersion /= undefined ->
-                    case read_roster_version(LUser, LServer) of
-                        error ->
-                            RosterVersion = write_roster_version(LUser, LServer),
-                            {lists:map(fun encode_item/1,
-                                       ejabberd_hooks:run_fold(
-                                         roster_get, To#jid.lserver, [], [US])),
-                             RosterVersion};
-                        {ok, RequestedVersion} ->
-                            {false, false};
-                        {ok, NewVersion} ->
-                            {lists:map(fun encode_item/1,
-                                       ejabberd_hooks:run_fold(
-                                         roster_get, To#jid.lserver, [], [US])),
-                             NewVersion}
-                    end;
-                {true, false} when RequestedVersion /= undefined ->
-                    RosterItems = ejabberd_hooks:run_fold(
-                                    roster_get, To#jid.lserver, [], [US]),
-                    case roster_hash(RosterItems) of
-                        RequestedVersion ->
-                            {false, false};
-                        New ->
-                            {lists:map(fun encode_item/1, RosterItems), New}
-                    end;
-                _ ->
-                    {lists:map(fun encode_item/1,
-                               ejabberd_hooks:run_fold(
-                                 roster_get, To#jid.lserver, [], [US])),
-                     false}
-            end,
-        xmpp:make_iq_result(
-          IQ,
-          case {ItemsToSend, VersionToSend} of
-              {false, false} ->
-                  undefined;
-              {Items, false} ->
-                  #roster_query{items = Items};
-              {Items, Version} ->
-                  #roster_query{items = Items,
-                                ver = Version}
-          end)
-    catch ?EX_RULE(E, R, St) ->
-           StackTrace = ?EX_STACK(St),
-           ?ERROR_MSG("Failed to process roster get for ~s: ~p",
-                      [jid:encode(To), {E, {R, StackTrace}}]),
-           Txt = ?T("Roster module has failed"),
-           xmpp:make_error(IQ, xmpp:err_internal_server_error(Txt, Lang))
-    end.
+    {ItemsToSend, VersionToSend} =
+       case {roster_versioning_enabled(LServer),
+             roster_version_on_db(LServer)} of
+           {true, true} when RequestedVersion /= undefined ->
+               case read_roster_version(LUser, LServer) of
+                   error ->
+                       RosterVersion = write_roster_version(LUser, LServer),
+                       {lists:map(fun encode_item/1,
+                                  ejabberd_hooks:run_fold(
+                                    roster_get, To#jid.lserver, [], [US])),
+                        RosterVersion};
+                   {ok, RequestedVersion} ->
+                       {false, false};
+                   {ok, NewVersion} ->
+                       {lists:map(fun encode_item/1,
+                                  ejabberd_hooks:run_fold(
+                                    roster_get, To#jid.lserver, [], [US])),
+                        NewVersion}
+               end;
+           {true, false} when RequestedVersion /= undefined ->
+               RosterItems = ejabberd_hooks:run_fold(
+                               roster_get, To#jid.lserver, [], [US]),
+               case roster_hash(RosterItems) of
+                   RequestedVersion ->
+                       {false, false};
+                   New ->
+                       {lists:map(fun encode_item/1, RosterItems), New}
+               end;
+           _ ->
+               {lists:map(fun encode_item/1,
+                          ejabberd_hooks:run_fold(
+                            roster_get, To#jid.lserver, [], [US])),
+                false}
+       end,
+    xmpp:make_iq_result(
+      IQ,
+      case {ItemsToSend, VersionToSend} of
+         {false, false} ->
+             undefined;
+         {Items, false} ->
+             #roster_query{items = Items};
+         {Items, Version} ->
+             #roster_query{items = Items,
+                           ver = Version}
+      end).
 
 -spec get_user_roster([#roster{}], {binary(), binary()}) -> [#roster{}].
 get_user_roster(Acc, {LUser, LServer}) ->