Skip to content

Commit 948a8fc

Browse files
committed
Add compatibility for OTP 21+ stack traces
1 parent 2131ea7 commit 948a8fc

File tree

3 files changed

+45
-10
lines changed

3 files changed

+45
-10
lines changed

eqc/bitcask_qc_expiry.erl

+3-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
-include_lib("eqc/include/eqc.hrl").
2727
-include_lib("eunit/include/eunit.hrl").
2828
-include("include/bitcask.hrl").
29+
-include("stacktrace.hrl").
2930

3031
-compile([export_all, nowarn_export_all]).
3132

@@ -144,9 +145,9 @@ prop_expiry() ->
144145
true
145146
end
146147
catch
147-
X:Y ->
148+
?_exception_(X, Y, StackToken) ->
148149
io:format(user, "exception: ~p ~p @ ~p\n",
149-
[X,Y, erlang:get_stacktrace()]),
150+
[X,Y, ?_get_stacktrace_(StackToken)]),
150151
test_exception
151152
after
152153
bitcask:close(Bref)

src/bitcask.erl

+9-8
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646

4747
-include_lib("kernel/include/file.hrl").
4848
-include("bitcask.hrl").
49+
-include("stacktrace.hrl").
4950

5051

5152
-ifdef(PULSE).
@@ -471,8 +472,8 @@ open_fold_files(Dirname, Keydir, Count) ->
471472
maybe_log_missing_file(Dirname, Keydir, ErrFile, Err),
472473
open_fold_files(Dirname, Keydir, Count-1)
473474
end
474-
catch X:Y ->
475-
{error, {X,Y, erlang:get_stacktrace()}}
475+
catch ?_exception_(X, Y, StackToken) ->
476+
{error, {X,Y, ?_get_stacktrace_(StackToken)}}
476477
end.
477478

478479
maybe_log_missing_file(Dirname, Keydir, ErrFile, enoent) ->
@@ -590,8 +591,8 @@ merge(Dirname, Opts, {FilesToMerge0, ExpiredFiles0}) ->
590591
catch
591592
throw:Reason ->
592593
Reason;
593-
X:Y ->
594-
{error, {generic_failure, X, Y, erlang:get_stacktrace()}}
594+
?_exception_(X, Y, StackToken) ->
595+
{error, {generic_failure, X, Y, ?_get_stacktrace_(StackToken)}}
595596
end.
596597

597598
%% Inner merge function, assumes that bitcask is running and all files exist.
@@ -1324,9 +1325,9 @@ init_keydir_scan_key_files(Dirname, KeyDir, KT, Count) ->
13241325
F <- SetuidFiles]),
13251326
bitcask_nifs:increment_file_id(KeyDir, MaxSetuid)
13261327
end
1327-
catch _X:_Y ->
1328+
catch ?_exception_(_X, _Y, StackToken) ->
13281329
error_msg_perhaps("scan_key_files: ~p ~p @ ~p\n",
1329-
[_X, _Y, erlang:get_stacktrace()]),
1330+
[_X, _Y, ?_get_stacktrace_(StackToken)]),
13301331
init_keydir_scan_key_files(Dirname, KeyDir, KT, Count - 1)
13311332
end.
13321333

@@ -1930,10 +1931,10 @@ purge_setuid_files(Dirname) ->
19301931
[length(StaleFs), Dirname])
19311932
end
19321933
catch
1933-
X:Y ->
1934+
?_exception_(X, Y, StackToken) ->
19341935
error_msg_perhaps("While deleting stale merge input "
19351936
"files from ~p: ~p @ ~p\n",
1936-
[X, Y, erlang:get_stacktrace()])
1937+
[X, Y, ?_get_stacktrace_(StackToken)])
19371938
after
19381939
bitcask_lockops:release(WriteLock)
19391940
end;

src/stacktrace.hrl

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
%% Originating from Quviq AB
2+
%% Fix to make Erlang programs compile on both OTP20 and OTP21.
3+
%%
4+
%% Get the stack trace in a way that is backwards compatible. Luckily
5+
%% OTP_RELEASE was introduced in the same version as the new preferred way of
6+
%% getting the stack trace. A _catch_/2 macro is provided for consistency in
7+
%% cases where the stack trace is not needed.
8+
%%
9+
%% Example use:
10+
%% try f(...)
11+
%% catch
12+
%% ?_exception_(_, Reason, StackToken) ->
13+
%% case Reason of
14+
%% {fail, Error} -> ok;
15+
%% _ -> {'EXIT', Reason, ?_get_stacktrace_(StackToken)}
16+
%% end
17+
%% end,
18+
19+
-ifdef(OTP_RELEASE). %% This implies 21 or higher
20+
-define(_exception_(Class, Reason, StackToken), Class:Reason:StackToken).
21+
-define(_get_stacktrace_(StackToken), StackToken).
22+
-define(_current_stacktrace_(),
23+
try
24+
exit('$get_stacktrace')
25+
catch
26+
exit:'$get_stacktrace':__GetCurrentStackTrace ->
27+
__GetCurrentStackTrace
28+
end).
29+
-else.
30+
-define(_exception_(Class, Reason, _), Class:Reason).
31+
-define(_get_stacktrace_(_), erlang:get_stacktrace()).
32+
-define(_current_stacktrace_(), erlang:get_stacktrace()).
33+
-endif.

0 commit comments

Comments
 (0)