summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J. Davis <paul.joseph.davis@gmail.com>2018-06-21 16:23:32 -0500
committerNick Vatamaniuc <nickva@users.noreply.github.com>2018-10-04 12:30:48 -0400
commit436e5f0d29ab399d6e14a4c531bfa35336591d41 (patch)
treea5f5e0768b3d1f22ea203274f35b0841d0e2bb8c
parent2e8cde50bd3973fdb40fcd7c0ecd9d299b80dc85 (diff)
downloadcouchdb-436e5f0d29ab399d6e14a4c531bfa35336591d41.tar.gz
Fix use of process_info(Pid, monitored_by)
This can now return references that are from NIFs monitoring the process. This is important for the new file IO NIFs that monitor the controlling process. For now we'll just take the easy way out by filtering the references from our returned monitor lists. Fixes #1396
-rw-r--r--src/couch/src/couch_bt_engine.erl2
-rw-r--r--src/couch/src/couch_file.erl15
-rw-r--r--src/couch/test/couchdb_views_tests.erl3
3 files changed, 12 insertions, 8 deletions
diff --git a/src/couch/src/couch_bt_engine.erl b/src/couch/src/couch_bt_engine.erl
index 6d858ed49..f856bde8f 100644
--- a/src/couch/src/couch_bt_engine.erl
+++ b/src/couch/src/couch_bt_engine.erl
@@ -196,7 +196,7 @@ decref(St) ->
monitored_by(St) ->
case erlang:process_info(St#st.fd, monitored_by) of
{monitored_by, Pids} ->
- Pids;
+ lists:filter(fun is_pid/1, Pids);
_ ->
[]
end.
diff --git a/src/couch/src/couch_file.erl b/src/couch/src/couch_file.erl
index 6aa8d0b89..0c6070dad 100644
--- a/src/couch/src/couch_file.erl
+++ b/src/couch/src/couch_file.erl
@@ -695,19 +695,22 @@ split_iolist([Sublist| Rest], SplitAt, BeginAcc) when is_list(Sublist) ->
split_iolist([Byte | Rest], SplitAt, BeginAcc) when is_integer(Byte) ->
split_iolist(Rest, SplitAt - 1, [Byte | BeginAcc]).
+monitored_by_pids() ->
+ {monitored_by, PidsAndRefs} = process_info(self(), monitored_by),
+ lists:filter(fun is_pid/1, PidsAndRefs).
% System dbs aren't monitored by couch_stats_process_tracker
is_idle(#file{is_sys=true}) ->
- case process_info(self(), monitored_by) of
- {monitored_by, []} -> true;
+ case monitored_by_pids() of
+ [] -> true;
_ -> false
end;
is_idle(#file{is_sys=false}) ->
Tracker = whereis(couch_stats_process_tracker),
- case process_info(self(), monitored_by) of
- {monitored_by, []} -> true;
- {monitored_by, [Tracker]} -> true;
- {monitored_by, [_]} -> exit(tracker_monitoring_failed);
+ case monitored_by_pids() of
+ [] -> true;
+ [Tracker] -> true;
+ [_] -> exit(tracker_monitoring_failed);
_ -> false
end.
diff --git a/src/couch/test/couchdb_views_tests.erl b/src/couch/test/couchdb_views_tests.erl
index 1b1a8e56b..60bb5c975 100644
--- a/src/couch/test/couchdb_views_tests.erl
+++ b/src/couch/test/couchdb_views_tests.erl
@@ -523,7 +523,8 @@ view_cleanup(DbName) ->
count_users(DbName) ->
{ok, Db} = couch_db:open_int(DbName, [?ADMIN_CTX]),
DbPid = couch_db:get_pid(Db),
- {monitored_by, Monitors} = process_info(DbPid, monitored_by),
+ {monitored_by, Monitors0} = process_info(DbPid, monitored_by),
+ Monitors = lists:filter(fun is_pid/1, Monitors0),
CouchFiles = [P || P <- Monitors, couch_file:process_info(P) =/= undefined],
ok = couch_db:close(Db),
length(lists:usort(Monitors) -- [self() | CouchFiles]).