Skip to content

Commit

Permalink
Merged revision 1102137 from trunk
Browse files Browse the repository at this point in the history
    Make sure view group shutdowns when database is deleted or dies

    Added more assertions to test 200-view-group-no-db-leaks.t to ensure
    this doesn't happen anymore.



git-svn-id: https://svn.apache.org/repos/asf/couchdb/branches/1.0.x@1102676 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
fdmanana committed May 13, 2011
1 parent e7134f3 commit 0654872
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 2 deletions.
7 changes: 6 additions & 1 deletion src/couchdb/couch_view_group.erl
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ init({{_, DbName, _} = InitArgs, ReturnPid, Ref}) ->
ReturnPid ! {Ref, self(), {error, invalid_view_seq}},
ignore;
_ ->
couch_db:monitor(Db),
couch_db:close(Db),
{ok, RefCounter} = couch_ref_counter:start([Fd]),
{ok, #group_state{
Expand Down Expand Up @@ -336,7 +337,11 @@ handle_info({'EXIT', FromPid, {{nocatch, Reason}, _Trace}}, State) ->

handle_info({'EXIT', FromPid, Reason}, State) ->
?LOG_DEBUG("Exit from linked pid: ~p", [{FromPid, Reason}]),
{stop, Reason, State}.
{stop, Reason, State};

handle_info({'DOWN',_,_,_,_}, State) ->
?LOG_INFO("Shutting down view group server, monitored db is closing.", []),
{stop, normal, reply_all(State, shutdown)}.


terminate(Reason, #group_state{updater_pid=Update, compactor_pid=Compact}=S) ->
Expand Down
22 changes: 21 additions & 1 deletion test/etap/200-view-group-no-db-leaks.t
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ ddoc_name() -> <<"foo">>.
main(_) ->
test_util:init_code_path(),

etap:plan(11),
etap:plan(18),
case (catch test()) of
ok ->
etap:end_tests();
Expand All @@ -87,28 +87,48 @@ test() ->

create_docs(),
create_design_doc(),

ViewGroup = couch_view:get_group_server(
test_db_name(), <<"_design/", (ddoc_name())/binary>>),
etap:is(is_pid(ViewGroup), true, "got view group pid"),
etap:is(is_process_alive(ViewGroup), true, "view group pid is alive"),

query_view(),
check_db_ref_count(),
etap:is(is_process_alive(ViewGroup), true, "view group pid is alive"),

create_new_doc(<<"doc1000">>),
query_view(),
check_db_ref_count(),
etap:is(is_process_alive(ViewGroup), true, "view group pid is alive"),

Ref1 = get_db_ref_counter(),
compact_db(),
check_db_ref_count(),
Ref2 = get_db_ref_counter(),
etap:isnt(Ref1, Ref2, "DB ref counter changed"),
etap:is(false, is_process_alive(Ref1), "old DB ref counter is not alive"),
etap:is(is_process_alive(ViewGroup), true, "view group pid is alive"),

compact_view_group(),
check_db_ref_count(),
Ref3 = get_db_ref_counter(),
etap:is(Ref3, Ref2, "DB ref counter didn't change"),
etap:is(is_process_alive(ViewGroup), true, "view group pid is alive"),

create_new_doc(<<"doc1001">>),
query_view(),
check_db_ref_count(),
etap:is(is_process_alive(ViewGroup), true, "view group pid is alive"),

MonRef = erlang:monitor(process, ViewGroup),
ok = couch_server:delete(test_db_name(), []),
receive
{'DOWN', MonRef, _, _, _} ->
etap:diag("view group is dead after DB deletion")
after 5000 ->
etap:bail("view group did not die after DB deletion")
end,

ok = timer:sleep(1000),
delete_db(),
Expand Down

0 comments on commit 0654872

Please sign in to comment.