Propagate db delete event to changes callback Not propagating the `delete` event to the changes callback causes db to stay open when it is deleted in the presence of `continuous` requests to _changes feed. This in its turn causes couch_file to stay open until the connection is closed by the client.
Project: http://git-wip-us.apache.org/repos/asf/couchdb-couch/repo Commit: http://git-wip-us.apache.org/repos/asf/couchdb-couch/commit/a51304e9 Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch/tree/a51304e9 Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch/diff/a51304e9 Branch: refs/heads/master Commit: a51304e9e238af45d9eda2987bc53e953782aaf5 Parents: d08ce07 Author: ILYA Khlopotov <iil...@ca.ibm.com> Authored: Wed Feb 10 16:26:22 2016 -0800 Committer: ILYA Khlopotov <iil...@ca.ibm.com> Committed: Tue Feb 16 18:05:51 2016 -0800 ---------------------------------------------------------------------- src/couch_changes.erl | 4 +++- test/couch_changes_tests.erl | 28 ++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/a51304e9/src/couch_changes.erl ---------------------------------------------------------------------- diff --git a/src/couch_changes.erl b/src/couch_changes.erl index 0d418e8..73a3cce 100644 --- a/src/couch_changes.erl +++ b/src/couch_changes.erl @@ -170,7 +170,9 @@ handle_changes(Args1, Req, Db0, Type) -> handle_db_event(_DbName, updated, Parent) -> Parent ! updated, {ok, Parent}; - +handle_db_event(_DbName, deleted, Parent) -> + Parent ! deleted, + {ok, Parent}; handle_db_event(_DbName, _Event, Parent) -> {ok, Parent}. http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/a51304e9/test/couch_changes_tests.erl ---------------------------------------------------------------------- diff --git a/test/couch_changes_tests.erl b/test/couch_changes_tests.erl index c28394b..63062dd 100644 --- a/test/couch_changes_tests.erl +++ b/test/couch_changes_tests.erl @@ -18,8 +18,6 @@ -define(TIMEOUT, 3000). -define(TEST_TIMEOUT, 10000). --ifdef(run_broken_tests). - -record(row, { id, seq, @@ -117,7 +115,8 @@ continuous_feed() -> foreach, fun setup/0, fun teardown/1, [ - fun should_filter_continuous_feed_by_specific_doc_ids/1 + fun should_filter_continuous_feed_by_specific_doc_ids/1, + fun should_end_changes_when_db_deleted/1 ] } }. @@ -315,6 +314,25 @@ should_filter_continuous_feed_by_specific_doc_ids({DbName, Revs}) -> ?assertMatch([#row{seq = 18, id = <<"doc3">>}], FinalRows) end). + +should_end_changes_when_db_deleted({DbName, _Revs}) -> + ?_test(begin + {ok, Db} = couch_db:open_int(DbName, []), + ChangesArgs = #changes_args{ + filter = "_doc_ids", + feed = "continuous" + }, + DocIds = [<<"doc3">>, <<"doc4">>, <<"doc9999">>], + Req = {json_req, {[{<<"doc_ids">>, DocIds}]}}, + Consumer = spawn_consumer(DbName, ChangesArgs, Req), + ok = pause(Consumer), + ok = couch_server:delete(DbName, [?ADMIN_CTX]), + ok = unpause(Consumer), + {_Rows, _LastSeq} = wait_finished(Consumer), + stop_consumer(Consumer), + ok + end). + should_emit_only_design_documents({DbName, Revs}) -> ?_test( begin @@ -601,6 +619,4 @@ create_db(DbName) -> couch_db:create(DbName, [?ADMIN_CTX, overwrite]). delete_db(DbName) -> - ok = couch_server:delete(DbName, [?ADMIN_CTX]). - --endif. + couch_server:delete(DbName, [?ADMIN_CTX]).