diff options
author | Paul J. Davis <paul.joseph.davis@gmail.com> | 2018-06-21 16:23:32 -0500 |
---|---|---|
committer | Nick Vatamaniuc <nickva@users.noreply.github.com> | 2018-10-04 12:30:48 -0400 |
commit | 436e5f0d29ab399d6e14a4c531bfa35336591d41 (patch) | |
tree | a5f5e0768b3d1f22ea203274f35b0841d0e2bb8c | |
parent | 2e8cde50bd3973fdb40fcd7c0ecd9d299b80dc85 (diff) | |
download | couchdb-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.erl | 2 | ||||
-rw-r--r-- | src/couch/src/couch_file.erl | 15 | ||||
-rw-r--r-- | src/couch/test/couchdb_views_tests.erl | 3 |
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]). |