diff options
| author | Paul J. Davis <paul.joseph.davis@gmail.com> | 2012-05-28 15:14:04 -0500 | 
|---|---|---|
| committer | Robert Newson <robert.newson@cloudant.com> | 2012-11-14 17:29:03 +0000 | 
| commit | 5eb7447ad4be97f633cc42432059a67bafcf9009 (patch) | |
| tree | bfad55674ed6a96552335198e50ffa21334c4730 | |
| parent | fa43486fbbe918344d66337b3b0b0d34128d5c39 (diff) | |
Only close idle processes that have no client
Previously we didn't check if an os_process was in use by a process
before closing it. This ended up generating noproc errors in the
couch_view_updaters which would then spider out to the couch_view_group
processes causing client errors and resetting compaction.
BugzId: 13798
| -rw-r--r-- | apps/couch/src/couch_proc_manager.erl | 18 | 
1 files changed, 12 insertions, 6 deletions
diff --git a/apps/couch/src/couch_proc_manager.erl b/apps/couch/src/couch_proc_manager.erl index ba5dae96..5903c95c 100644 --- a/apps/couch/src/couch_proc_manager.erl +++ b/apps/couch/src/couch_proc_manager.erl @@ -89,13 +89,19 @@ handle_call(_Call, _From, State) ->  handle_cast({os_proc_idle, Pid}, #state{tab=Tab}=State) ->      Limit = couch_config:get("query_server_config", "os_process_soft_limit", "100"), -    case ets:info(Tab, size) > list_to_integer(Limit) of -        true -> -            ets:delete(Tab, Pid), -            case is_process_alive(Pid) of +    case ets:lookup(Tab, Pid) of +        [#proc{client=nil}] -> +            case ets:info(Tab, size) > list_to_integer(Limit) of                  true -> -                    unlink(Pid), -                    gen_server:cast(Pid, stop); +                    ?LOG_INFO("Closing idle OS Process: ~p", [Pid]), +                    ets:delete(Tab, Pid), +                    case is_process_alive(Pid) of +                        true -> +                            unlink(Pid), +                            gen_server:cast(Pid, stop); +                        _ -> +                            ok +                    end;                  _ ->                      ok              end;  | 
