summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Kocoloski <kocolosk@apache.org>2021-04-19 13:23:34 -0400
committerAdam Kocoloski <kocolosk@apache.org>2021-04-19 13:23:34 -0400
commitb41ffa20c5dbb3f139162721c83262f0b7ce1275 (patch)
tree1cd2acdb5f81da0d189cb98a48df1a3ec58216d3
parentf6d578e4d5ba941368228a0179584ee73cd57000 (diff)
downloadcouchdb-b41ffa20c5dbb3f139162721c83262f0b7ce1275.tar.gz
Drop support for Erlang < 21
The new logger only works in Erlang 21+, so we can start simplifying the codebase by removing the macro that provides support for retrieving stack traces the old way.
-rw-r--r--rebar.config.script2
-rw-r--r--src/chttpd/src/chttpd.erl8
-rw-r--r--src/chttpd/src/chttpd_handlers.erl2
-rw-r--r--src/chttpd/src/chttpd_stats.erl4
-rw-r--r--src/couch/include/couch_db.hrl24
-rw-r--r--src/couch/src/couch_proc_manager.erl2
-rw-r--r--src/couch_js/src/couch_js_proc_manager.erl2
-rw-r--r--src/couch_replicator/src/couch_replicator_job.erl18
-rw-r--r--src/couch_replicator/src/couch_replicator_parse.erl9
-rw-r--r--src/couch_views/src/couch_views_indexer.erl2
-rw-r--r--src/couch_views/src/couch_views_updater.erl2
-rw-r--r--src/ctrace/src/ctrace.erl2
-rw-r--r--src/fabric/src/fabric2_db_expiration.erl2
-rw-r--r--src/fabric/src/fabric2_index.erl4
-rw-r--r--src/fabric/src/fabric2_util.erl2
-rw-r--r--src/mango/src/mango_httpd.erl2
16 files changed, 28 insertions, 59 deletions
diff --git a/rebar.config.script b/rebar.config.script
index 6dafa8f89..883b803bd 100644
--- a/rebar.config.script
+++ b/rebar.config.script
@@ -191,7 +191,7 @@ ErlOpts = case os:getenv("ERL_OPTS") of
end.
AddConfig = [
- {require_otp_vsn, "20|21|22|23"},
+ {require_otp_vsn, "21|22|23"},
{deps_dir, "src"},
{deps, lists:map(MakeDep, DepDescs ++ OptionalDeps)},
{sub_dirs, SubDirs},
diff --git a/src/chttpd/src/chttpd.erl b/src/chttpd/src/chttpd.erl
index 135c4ec0b..6741ca350 100644
--- a/src/chttpd/src/chttpd.erl
+++ b/src/chttpd/src/chttpd.erl
@@ -278,7 +278,7 @@ before_request(HttpReq) ->
{ok, HttpReq1} = chttpd_plugin:before_request(HttpReq),
chttpd_stats:init(HttpReq1),
{ok, HttpReq1}
- catch ?STACKTRACE(Tag, Error, Stack)
+ catch Tag:Error:Stack ->
{error, catch_error(HttpReq, Tag, Error, Stack)}
end.
@@ -286,7 +286,7 @@ after_request(HttpReq, HttpResp0) ->
{ok, HttpResp1} =
try
chttpd_plugin:after_request(HttpReq, HttpResp0)
- catch ?STACKTRACE(_Tag, Error, Stack)
+ catch _Tag:Error:Stack ->
send_error(HttpReq, {Error, nil, Stack}),
{ok, HttpResp0#httpd_resp{status = aborted}}
end,
@@ -319,7 +319,7 @@ process_request(#httpd{mochi_req = MochiReq} = HttpReq) ->
Response ->
{HttpReq, Response}
end
- catch ?STACKTRACE(Tag, Error, Stack)
+ catch Tag:Error:Stack ->
{HttpReq, catch_error(HttpReq, Tag, Error, Stack)}
end.
@@ -332,7 +332,7 @@ handle_req_after_auth(HandlerKey, HttpReq) ->
AuthorizedReq = chttpd_auth:authorize(possibly_hack(HttpReq),
fun chttpd_auth_request:authorize_request/1),
{AuthorizedReq, HandlerFun(AuthorizedReq)}
- catch ?STACKTRACE(Tag, Error, Stack)
+ catch Tag:Error:Stack ->
{HttpReq, catch_error(HttpReq, Tag, Error, Stack)}
end.
diff --git a/src/chttpd/src/chttpd_handlers.erl b/src/chttpd/src/chttpd_handlers.erl
index 43631c058..ce478206a 100644
--- a/src/chttpd/src/chttpd_handlers.erl
+++ b/src/chttpd/src/chttpd_handlers.erl
@@ -44,7 +44,7 @@ handler_info(HttpReq) ->
Default = {'unknown.unknown', #{}},
try
select(collect(handler_info, [Method, PathParts, HttpReq]), Default)
- catch ?STACKTRACE(Type, Reason, Stack)
+ catch Type:Reason:Stack ->
couch_log:error("~s :: handler_info failure for ~p : ~p:~p :: ~p", [
?MODULE,
get(nonce),
diff --git a/src/chttpd/src/chttpd_stats.erl b/src/chttpd/src/chttpd_stats.erl
index ae1efa486..fa2036e6c 100644
--- a/src/chttpd/src/chttpd_stats.erl
+++ b/src/chttpd/src/chttpd_stats.erl
@@ -12,8 +12,6 @@
-module(chttpd_stats).
-% for the stacktrace macro only so far
--include_lib("couch/include/couch_db.hrl").
-export([
init/1,
@@ -63,7 +61,7 @@ report(HttpResp) ->
_ ->
ok
end
- catch ?STACKTRACE(T, R, S)
+ catch T:R:S ->
Fmt = "Failed to report chttpd request stats: ~p:~p ~p",
couch_log:error(Fmt, [T, R, S])
end.
diff --git a/src/couch/include/couch_db.hrl b/src/couch/include/couch_db.hrl
index 01dc0f4a1..22890895a 100644
--- a/src/couch/include/couch_db.hrl
+++ b/src/couch/include/couch_db.hrl
@@ -178,27 +178,3 @@
-define(record_to_keyval(Name, Record),
lists:zip(record_info(fields, Name), tl(tuple_to_list(Record)))).
-
-%% Erlang/OTP 21 deprecates and 23 removes get_stacktrace(), so
-%% we have to monkey around until we can drop support < 21.
-%% h/t https://github.com/erlang/otp/pull/1783#issuecomment-386190970
-
-%% use like so:
-% try function1(Arg1)
-% catch
-% ?STACKTRACE(exit, badarg, ErrorStackTrace)
-% % do stuff with ErrorStackTrace
-% % ...
-% end,
-
-% Get the stacktrace in a way that is backwards compatible
-% OTP_RELEASE is only available in OTP 21 and later, so we don’t need
-% to do any other version magic here.
--ifdef(OTP_RELEASE).
--define(STACKTRACE(ErrorType, Error, Stack),
- ErrorType:Error:Stack ->).
--else.
--define(STACKTRACE(ErrorType, Error, Stack),
- ErrorType:Error ->
- Stack = erlang:get_stacktrace(),).
--endif.
diff --git a/src/couch/src/couch_proc_manager.erl b/src/couch/src/couch_proc_manager.erl
index 6a0322c73..3faef094f 100644
--- a/src/couch/src/couch_proc_manager.erl
+++ b/src/couch/src/couch_proc_manager.erl
@@ -321,7 +321,7 @@ find_proc(#client{lang = Lang, ddoc = DDoc, ddoc_key = DDocKey} = Client) ->
find_proc(Lang, Fun) ->
try iter_procs(Lang, Fun)
- catch ?STACKTRACE(error, Reason, StackTrace)
+ catch error:Reason:StackTrace ->
couch_log:error("~p ~p ~p", [?MODULE, Reason, StackTrace]),
{error, Reason}
end.
diff --git a/src/couch_js/src/couch_js_proc_manager.erl b/src/couch_js/src/couch_js_proc_manager.erl
index 4b3354d6e..d9c3efce3 100644
--- a/src/couch_js/src/couch_js_proc_manager.erl
+++ b/src/couch_js/src/couch_js_proc_manager.erl
@@ -320,7 +320,7 @@ find_proc(#client{lang = Lang, ddoc = DDoc, ddoc_key = DDocKey} = Client) ->
find_proc(Lang, Fun) ->
try iter_procs(Lang, Fun)
- catch ?STACKTRACE(error, Reason, StackTrace)
+ catch error:Reason:StackTrace ->
couch_log:error("~p ~p ~p", [?MODULE, Reason, StackTrace]),
{error, Reason}
end.
diff --git a/src/couch_replicator/src/couch_replicator_job.erl b/src/couch_replicator/src/couch_replicator_job.erl
index d11bdb738..8cfb426f5 100644
--- a/src/couch_replicator/src/couch_replicator_job.erl
+++ b/src/couch_replicator/src/couch_replicator_job.erl
@@ -221,11 +221,9 @@ handle_info(timeout, delayed_init) ->
{ok, State} -> {noreply, State};
{stop, Reason, State} -> {stop, Reason, State}
catch
- ?STACKTRACE(exit, {shutdown, finished}, Stack)
- {stop, {shutdown, finished}, {init_error, Stack}};
- ?STACKTRACE(exit, {shtudown, halt}, Stack)
- {stop, {shutdown, halt}, {init_error, Stack}};
- ?STACKTRACE(_Tag, Error, Stack)
+ exit:{shutdown, Exit}:Stack when Exit =:= finished orelse Exit =:= halt ->
+ {stop, {shutdown, Exit}, {init_error, Stack}};
+ _Tag:Error:Stack ->
ShutdownReason = {error, replication_start_error(Error)},
{stop, {shutdown, ShutdownReason}, {init_error, Stack}}
end;
@@ -406,14 +404,12 @@ delayed_init() ->
try do_init(Job, JobData) of
State = #rep_state{} -> {ok, State}
catch
- ?STACKTRACE(exit, {http_request_failed, _, _, max_backoff}, Stack)
+ exit:{http_request_failed, _, _, max_backoff}:Stack ->
reschedule_on_error(undefined, Job, JobData, max_backoff),
{stop, {shutdown, max_backoff}, {init_error, Stack}};
- ?STACKTRACE(exit, {shutdown, finished}, Stack)
- {stop, {shutdown, finished}, {init_error, Stack}};
- ?STACKTRACE(exit, {shutdown, halt}, Stack)
- {stop, {shutdown, halt}, {init_error, Stack}};
- ?STACKTRACE(_Tag, Error, Stack)
+ exit:{shutdown, Exit}:Stack when Exit =:= finished orelse Exit =:= halt ->
+ {stop, {shutdown, Exit}, {init_error, Stack}};
+ _Tag:Error:Stack ->
Reason = {error, replication_start_error(Error)},
ErrMsg = "~p : job ~p failed during startup ~p stack:~p",
couch_log:error(ErrMsg, [?MODULE, Job, Reason, Stack]),
diff --git a/src/couch_replicator/src/couch_replicator_parse.erl b/src/couch_replicator/src/couch_replicator_parse.erl
index 79c778d23..5b3f3f34b 100644
--- a/src/couch_replicator/src/couch_replicator_parse.erl
+++ b/src/couch_replicator/src/couch_replicator_parse.erl
@@ -22,7 +22,6 @@
-include_lib("ibrowse/include/ibrowse.hrl").
--include_lib("couch/include/couch_db.hrl").
-include("couch_replicator.hrl").
@@ -60,11 +59,11 @@ parse_rep_doc(RepDoc) ->
{ok, Rep} = try
parse_rep(RepDoc, null)
catch
- ?STACKTRACE(throw, {error, Reason}, Stack)
+ throw:{error, Reason}:Stack ->
LogErr1 = "~p parse_rep_doc fail ~p ~p",
couch_log:error(LogErr1, [?MODULE, Reason, Stack]),
throw({bad_rep_doc, Reason});
- ?STACKTRACE(Tag, Err, Stack)
+ Tag:Err:Stack ->
LogErr2 = "~p parse_rep_doc fail ~p:~p ~p",
couch_log:error(LogErr2, [?MODULE, Tag, Err, Stack]),
throw({bad_rep_doc, couch_util:to_binary({Tag, Err})})
@@ -82,11 +81,11 @@ parse_transient_rep(#{} = Body, UserName) ->
{ok, Rep} = try
parse_rep(Body, UserName)
catch
- ?STACKTRACE(throw, {error, Reason}, Stack)
+ throw:{error, Reason}:Stack ->
LogErr1 = "~p parse_transient_rep fail ~p ~p",
couch_log:error(LogErr1, [?MODULE, Reason, Stack]),
throw({bad_request, Reason});
- ?STACKTRACE(Tag, Err, Stack)
+ Tag:Err:Stack ->
LogErr2 = "~p parse_transient_rep fail ~p ~p",
couch_log:error(LogErr2, [?MODULE, Tag, Err, Stack]),
throw({bad_request, couch_util:to_binary({Tag, Err})})
diff --git a/src/couch_views/src/couch_views_indexer.erl b/src/couch_views/src/couch_views_indexer.erl
index 2164a5827..eed3f547b 100644
--- a/src/couch_views/src/couch_views_indexer.erl
+++ b/src/couch_views/src/couch_views_indexer.erl
@@ -121,7 +121,7 @@ init() ->
ok;
error:database_does_not_exist ->
fail_job(Job, Data, db_deleted, "Database was deleted");
- ?STACKTRACE(Error, Reason, Stack)
+ Error:Reason:Stack ->
Fmt = "Error building view for ddoc ~s in ~s: ~p:~p ~p",
couch_log:error(Fmt, [DbName, DDocId, Error, Reason, Stack]),
diff --git a/src/couch_views/src/couch_views_updater.erl b/src/couch_views/src/couch_views_updater.erl
index 7c96bb8bb..c7d31463e 100644
--- a/src/couch_views/src/couch_views_updater.erl
+++ b/src/couch_views/src/couch_views_updater.erl
@@ -31,7 +31,7 @@ index(Db, #doc{id = Id, revs = Revs} = Doc, _NewWinner, _OldWinner, NewRevId,
index_int(Db, Doc, Seq)
end
catch
- ?STACKTRACE(error, {erlfdb_error, ErrCode}, Stack)
+ error:{erlfdb_error, ErrCode}:Stack when is_integer(ErrCode) ->
DbName = fabric2_db:name(Db),
couch_log:error("Mango index erlfdb error Db ~s Doc ~p ~p",
[DbName, Id, ErrCode]),
diff --git a/src/ctrace/src/ctrace.erl b/src/ctrace/src/ctrace.erl
index 8ae51c487..a890bdea4 100644
--- a/src/ctrace/src/ctrace.erl
+++ b/src/ctrace/src/ctrace.erl
@@ -109,7 +109,7 @@ with_span(Operation, Options, Fun) ->
try
start_span(Operation, Options),
Fun()
- catch ?STACKTRACE(Type, Reason, Stack)
+ catch Type:Reason:Stack ->
log(#{
?LOG_FIELD_ERROR_KIND => Type,
?LOG_FIELD_MESSAGE => Reason,
diff --git a/src/fabric/src/fabric2_db_expiration.erl b/src/fabric/src/fabric2_db_expiration.erl
index 94cb61b82..b4385910d 100644
--- a/src/fabric/src/fabric2_db_expiration.erl
+++ b/src/fabric/src/fabric2_db_expiration.erl
@@ -131,7 +131,7 @@ cleanup(true) ->
{ok, Job1, Data1} = ?MODULE:process_expirations(Job, Data),
ok = resubmit_job(Job1, Data1, schedule_sec())
catch
- ?STACKTRACE(_Tag, Error, Stack)
+ _Tag:Error:Stack ->
couch_log:error("~p : processing error ~p ~p ~p",
[?MODULE, Job, Error, Stack]),
ok = resubmit_job(Job, Data, ?ERROR_RESCHEDULE_SEC),
diff --git a/src/fabric/src/fabric2_index.erl b/src/fabric/src/fabric2_index.erl
index 3c59cd7e2..037f0f5fa 100644
--- a/src/fabric/src/fabric2_index.erl
+++ b/src/fabric/src/fabric2_index.erl
@@ -67,7 +67,7 @@ cleanup(Db) ->
catch
error:database_does_not_exist ->
ok;
- ?STACKTRACE(Tag, Reason, Stack)
+ Tag:Reason:Stack ->
DbName = fabric2_db:name(Db),
LogMsg = "~p failed to cleanup indices for `~s` ~p:~p ~p",
couch_log:error(LogMsg, [?MODULE, DbName, Tag, Reason, Stack])
@@ -167,7 +167,7 @@ process_updates_iter([Db | Rest], Cont) ->
catch
error:database_does_not_exist ->
ok;
- ?STACKTRACE(Tag, Reason, Stack)
+ Tag:Reason:Stack ->
LogMsg = "~p failed to build indices for `~s` ~p:~p ~p",
couch_log:error(LogMsg, [?MODULE, Db, Tag, Reason, Stack])
end,
diff --git a/src/fabric/src/fabric2_util.erl b/src/fabric/src/fabric2_util.erl
index f95e410c6..cd22778ef 100644
--- a/src/fabric/src/fabric2_util.erl
+++ b/src/fabric/src/fabric2_util.erl
@@ -386,6 +386,6 @@ pmap(Fun, Args, Opts) ->
pmap_exec(Fun, Arg) ->
try
{'$res', Fun(Arg)}
- catch ?STACKTRACE(Tag, Reason, Stack)
+ catch Tag:Reason:Stack ->
{'$err', Tag, Reason, Stack}
end.
diff --git a/src/mango/src/mango_httpd.erl b/src/mango/src/mango_httpd.erl
index 9ac4dfc88..0d035dd99 100644
--- a/src/mango/src/mango_httpd.erl
+++ b/src/mango/src/mango_httpd.erl
@@ -36,7 +36,7 @@ handle_req(#httpd{} = Req, Db) ->
try
handle_req_int(Req, Db)
catch
- ?STACKTRACE(throw, {mango_error, Module, Reason}, Stack)
+ throw:{mango_error, Module, Reason}:Stack ->
case mango_error:info(Module, Reason) of
{500, ErrorStr, ReasonStr} ->
chttpd:send_error(Req, {ErrorStr, ReasonStr, Stack});