aboutsummaryrefslogtreecommitdiffstats
path: root/lib/stdlib
diff options
context:
space:
mode:
authorMikael Pettersson <[email protected]>2018-03-10 16:19:26 +0100
committerMikael Pettersson <[email protected]>2018-03-10 16:19:26 +0100
commit9f1d9a497ba42df8c122bc1ac2c1add6f64a164c (patch)
tree77aac2df6465a219921ca9d5d3e94732aa31c7fe /lib/stdlib
parent87a43e0a2039b31887a40e2c7dcfa03788b6acd9 (diff)
downloadotp-9f1d9a497ba42df8c122bc1ac2c1add6f64a164c.tar.gz
otp-9f1d9a497ba42df8c122bc1ac2c1add6f64a164c.tar.bz2
otp-9f1d9a497ba42df8c122bc1ac2c1add6f64a164c.zip
make erlang:process_info/1 not retrieve messages
process_info/1 retrieves a number of properties related to a process, including the list of messages in its mailbox. This is potentially unsafe if the target process has a large number of queued messages: - there is no a priori upper bound on the amount of memory being allocated to hold that list, and - the loop to retrieve the messages is uninterruptible, so the Erlang scheduler where this executes blocks for the duration We've seen process_info/1 bring down heavily loaded nodes on more than one occasion. At least once it appeared to have blocked the Erlang heart process from executing, causing the external heart to kill the VM. Consequently this removes 'messages' from the list of process_info tags to retrieve for process_info/1. Note that process_info/1 still retrieves 'message_queue_len', and process_info/2 can still retrieve 'messages' when asked to. A few places in the OTP libraries need minor adjustments, since they want 'message_queue_len' but compute it from the length of the list of messages.
Diffstat (limited to 'lib/stdlib')
-rw-r--r--lib/stdlib/src/c.erl4
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/stdlib/src/c.erl b/lib/stdlib/src/c.erl
index c04a201ce1..cc08295480 100644
--- a/lib/stdlib/src/c.erl
+++ b/lib/stdlib/src/c.erl
@@ -564,7 +564,7 @@ display_info(Pid) ->
Other
end,
Reds = fetch(reductions, Info),
- LM = length(fetch(messages, Info)),
+ LM = fetch(message_queue_len, Info),
HS = fetch(heap_size, Info),
SS = fetch(stack_size, Info),
iformat(w(Pid), mfa_string(Call),
@@ -882,7 +882,7 @@ portinfo(Id) ->
procline(Name, Info, Pid) ->
Call = initial_call(Info),
Reds = fetch(reductions, Info),
- LM = length(fetch(messages, Info)),
+ LM = fetch(message_queue_len, Info),
procformat(io_lib:format("~tw",[Name]),
io_lib:format("~w",[Pid]),
io_lib:format("~ts",[mfa_string(Call)]),