summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Vatamaniuc <vatamane@gmail.com>2022-10-17 14:46:43 -0400
committerNick Vatamaniuc <nickva@users.noreply.github.com>2022-10-17 16:51:18 -0400
commit4a9bef0fe02832111c0c52dd0e0215e32693bffd (patch)
treec1def6294b23fc051c1ad2d553e74143460964a7
parent9636405b29f9157eb7870995d837cb53a77cf1f2 (diff)
downloadcouchdb-4a9bef0fe02832111c0c52dd0e0215e32693bffd.tar.gz
Fix prometheus message queue len race condition
By the time we get the message queue length the registered process might have died already. In that case `whereis/1` would return `undefined` and would crash the gen_server process.
-rw-r--r--src/couch_prometheus/src/couch_prometheus_server.erl23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/couch_prometheus/src/couch_prometheus_server.erl b/src/couch_prometheus/src/couch_prometheus_server.erl
index 969f68ec9..fbca9eb66 100644
--- a/src/couch_prometheus/src/couch_prometheus_server.erl
+++ b/src/couch_prometheus/src/couch_prometheus_server.erl
@@ -149,23 +149,24 @@ get_io_stats() ->
].
get_message_queue_stats() ->
- Queues = lists:map(
- fun(Name) ->
- case process_info(whereis(Name), message_queue_len) of
- {message_queue_len, N} ->
- N;
- _ ->
- 0
- end
- end,
- registered()
- ),
+ QLenFun = fun(Name) -> message_queue_len(whereis(Name)) end,
+ Queues = lists:map(QLenFun, registered()),
[
to_prom(erlang_message_queues, gauge, lists:sum(Queues)),
to_prom(erlang_message_queue_min, gauge, lists:min(Queues)),
to_prom(erlang_message_queue_max, gauge, lists:max(Queues))
].
+message_queue_len(undefined) ->
+ 0;
+message_queue_len(Pid) when is_pid(Pid) ->
+ case process_info(Pid, message_queue_len) of
+ {message_queue_len, N} ->
+ N;
+ _ ->
+ 0
+ end.
+
get_run_queue_stats() ->
%% Workaround for https://bugs.erlang.org/browse/ERL-1355
{Normal, Dirty} =