summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilipe David Borba Manana <fdmanana@apache.org>2011-05-13 11:18:37 +0000
committerFilipe David Borba Manana <fdmanana@apache.org>2011-05-13 11:18:37 +0000
commitd5bf524c1dafd301a0fced8449ed90f7608beb72 (patch)
tree3596afd9945a772f07c29034a60769f8f3ea2774
parenta0563ab7ce204cf82feb56259d7a52c0b84077b7 (diff)
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
-rw-r--r--src/couchdb/couch_view_group.erl7
-rwxr-xr-xtest/etap/200-view-group-no-db-leaks.t22
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(),