File 0662-Report-stacktrace-in-non-transactions-activity-funct.patch of Package erlang

From d63237bd38059b8468ec4e147cca49b1cf8caac4 Mon Sep 17 00:00:00 2001
From: Daniil Fedotov <hairyhum@gmail.com>
Date: Fri, 26 Apr 2019 16:53:56 -0400
Subject: [PATCH] Report stacktrace in non-transactions activity function
 errors.

If an activity function fails with an error, the stacktrace is
dropped in non_transaction function try/catch clause.
This makes debuging of errors inside a transaction really hard.

Transaction activities handle errors and exits differently, non-transaction
activities should do the same.

Adding the stacktrace to the exit reason when translating errors to exits.
---
 lib/mnesia/src/mnesia_tm.erl                 |  5 ++--
 lib/mnesia/test/mnesia_dirty_access_test.erl | 34 ++++++++++++++++++++++++++--
 2 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/lib/mnesia/src/mnesia_tm.erl b/lib/mnesia/src/mnesia_tm.erl
index cbf7db28f0..8b79fca1d7 100644
--- a/lib/mnesia/src/mnesia_tm.erl
+++ b/lib/mnesia/src/mnesia_tm.erl
@@ -742,8 +742,9 @@ non_transaction(OldState, Fun, Args, ActivityKind, Mod) ->
 	{aborted, Reason} -> mnesia:abort(Reason);
 	Res -> Res
     catch
-	throw:Throw -> throw(Throw);
-	_:Reason    -> exit(Reason)
+        throw:Throw  -> throw(Throw);
+        error:Reason -> exit({Reason, erlang:get_stacktrace()});
+        exit:Reason  -> exit(Reason)
     after
 	case OldState of
 	    undefined -> erase(mnesia_activity_state);
diff --git a/lib/mnesia/test/mnesia_dirty_access_test.erl b/lib/mnesia/test/mnesia_dirty_access_test.erl
index 67ef1fe901..984f43582c 100644
--- a/lib/mnesia/test/mnesia_dirty_access_test.erl
+++ b/lib/mnesia/test/mnesia_dirty_access_test.erl
@@ -36,7 +36,7 @@ all() ->
      {group, dirty_update_counter}, {group, dirty_delete},
      {group, dirty_delete_object},
      {group, dirty_match_object}, {group, dirty_index},
-     {group, dirty_iter}, {group, admin_tests}].
+     {group, dirty_iter}, {group, admin_tests}, dirty_error_stacktrace].
 
 groups() -> 
     [{dirty_write, [],
@@ -86,6 +86,36 @@ init_per_group(_GroupName, Config) ->
 end_per_group(_GroupName, Config) ->
     Config.
 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Errors in dirty activity should have stacktrace
+dirty_error_stacktrace(Config) ->
+    %% Custom errors should have stacktrace
+    try
+        mnesia:async_dirty(fun() -> error(custom_error) end)
+    catch
+        exit:{custom_error, _} -> ok
+    end,
+
+    %% Undef error should have unknown module and function in the stacktrace
+    try
+        mnesia:async_dirty(fun() -> unknown_module:unknown_fun(arg) end)
+    catch
+        exit:{undef, [{unknown_module, unknown_fun, [arg], []} | _]} -> ok
+    end,
+
+    %% Exists don't have stacktrace
+    try
+        mnesia:async_dirty(fun() -> exit(custom_error) end)
+    catch
+        exit:custom_error -> ok
+    end,
+
+    %% Aborts don't have a stacktrace (unfortunately)
+    try
+        mnesia:async_dirty(fun() -> mnesia:abort(custom_abort) end)
+    catch
+        exit:{aborted, custom_abort} -> ok
+    end.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Write records dirty
-- 
2.16.4

openSUSE Build Service is sponsored by