From d5bf524c1dafd301a0fced8449ed90f7608beb72 Mon Sep 17 00:00:00 2001 From: Filipe David Borba Manana Date: Fri, 13 May 2011 11:18:37 +0000 Subject: Merged revision 1102137 from trunk 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.1.x@1102678 13f79535-47bb-0310-9956-ffa450edef68 --- src/couchdb/couch_view_group.erl | 7 ++++++- test/etap/200-view-group-no-db-leaks.t | 22 +++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/couchdb/couch_view_group.erl b/src/couchdb/couch_view_group.erl index b0cfe6e7..6ef1dcb4 100644 --- a/src/couchdb/couch_view_group.erl +++ b/src/couchdb/couch_view_group.erl @@ -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{ @@ -339,7 +340,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) -> diff --git a/test/etap/200-view-group-no-db-leaks.t b/test/etap/200-view-group-no-db-leaks.t index bbfd0833..9c77f1a8 100755 --- a/test/etap/200-view-group-no-db-leaks.t +++ b/test/etap/200-view-group-no-db-leaks.t @@ -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(); @@ -87,12 +87,20 @@ 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(), @@ -100,15 +108,27 @@ test() -> 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(), -- cgit v1.2.3