diff options
-rw-r--r-- | THANKS | 1 | ||||
-rw-r--r-- | share/www/script/test/show_documents.js | 17 | ||||
-rw-r--r-- | src/couchdb/couch_httpd_show.erl | 1 | ||||
-rw-r--r-- | src/couchdb/couch_rep_att.erl | 28 | ||||
-rw-r--r-- | src/couchdb/couch_rep_changes_feed.erl | 6 |
5 files changed, 22 insertions, 31 deletions
@@ -50,6 +50,5 @@ suggesting improvements or submitting changes. Some of these people are: * Joel Clark <unsigned_char@yahoo.com> * Matt Lyon <matt@flowerpowered.com> * mikeal <mikeal.rogers@gmail.com> - * Randall Leeds <randall.leeds@gmail.com> For a list of authors see the `AUTHORS` file. diff --git a/share/www/script/test/show_documents.js b/share/www/script/test/show_documents.js index f49c1f1f..e06bcadc 100644 --- a/share/www/script/test/show_documents.js +++ b/share/www/script/test/show_documents.js @@ -54,6 +54,13 @@ couchTests.show_documents = function(debug) { json : req } }), + "show-deleted" : stringFun(function(doc, req) { + if(doc) { + return doc._id; + } else { + return "No doc " + req.id; + } + }), "render-error" : stringFun(function(doc, req) { return noSuchVariable; }), @@ -393,5 +400,15 @@ couchTests.show_documents = function(debug) { T(xhr.responseText == "Hey Dude"); TEquals("Yeah", xhr.getResponseHeader("X-Couch-Test-Header"), "header should be cool"); TEquals("Oh Yeah!", xhr.getResponseHeader("X-Couch-Test-Header-Awesome"), "header should be cool"); + + // test deleted docs + var doc = {_id:"testdoc",foo:1}; + db.save(doc); + var xhr = CouchDB.request("GET", "/test_suite_db/_design/template/_show/show-deleted/testdoc"); + TEquals("testdoc", xhr.responseText, "should return 'testdoc'"); + + db.deleteDoc(doc); + var xhr = CouchDB.request("GET", "/test_suite_db/_design/template/_show/show-deleted/testdoc"); + TEquals("No doc testdoc", xhr.responseText, "should return 'no doc testdoc'"); }; diff --git a/src/couchdb/couch_httpd_show.erl b/src/couchdb/couch_httpd_show.erl index 18f24e85..72c6bae1 100644 --- a/src/couchdb/couch_httpd_show.erl +++ b/src/couchdb/couch_httpd_show.erl @@ -31,6 +31,7 @@ maybe_open_doc(Db, DocId) -> case catch couch_httpd_db:couch_doc_open(Db, DocId, nil, [conflicts]) of {not_found, missing} -> nil; + {not_found,deleted} -> nil; Doc -> Doc end. handle_doc_show_req(#httpd{ diff --git a/src/couchdb/couch_rep_att.erl b/src/couchdb/couch_rep_att.erl index ee4f0184..6b576a01 100644 --- a/src/couchdb/couch_rep_att.erl +++ b/src/couchdb/couch_rep_att.erl @@ -25,11 +25,7 @@ convert_stub(#att{data=stub, name=Name} = Attachment, qs = [{rev, couch_doc:rev_to_str({Pos,RevId})}] }, Ref = make_ref(), - RcvFun = fun() -> - Bin = attachment_receiver(Ref, Request), - cleanup(), - Bin - end, + RcvFun = fun() -> attachment_receiver(Ref, Request) end, Attachment#att{data=RcvFun}. cleanup() -> @@ -38,8 +34,6 @@ cleanup() -> %% TODO maybe log, didn't expect to have data here cleanup(); {ibrowse_async_response_end, _} -> - cleanup(); - {ibrowse_async_headers, _, _, _} -> cleanup() after 0 -> erase(), @@ -49,27 +43,13 @@ cleanup() -> % internal funs attachment_receiver(Ref, Request) -> - try case get(Ref) of + case get(Ref) of undefined -> {ReqId, ContentEncoding} = start_http_request(Request), put(Ref, {ReqId, ContentEncoding}), receive_data(Ref, ReqId, ContentEncoding); {ReqId, ContentEncoding} -> receive_data(Ref, ReqId, ContentEncoding) - end - catch - throw:{attachment_request_failed, timeout} -> - case {Request#http_db.retries, Request#http_db.pause} of - {0, _} -> - ?LOG_INFO("request for ~p failed", [Request#http_db.resource]), - throw({attachment_request_failed, max_retries_reached}); - {N, Pause} when N > 0 -> - ?LOG_INFO("request for ~p timed out, retrying in ~p seconds", - [Request#http_db.resource, Pause/1000]), - timer:sleep(Pause), - cleanup(), - attachment_receiver(Ref, Request#http_db{retries = N-1}) - end end. receive_data(Ref, ReqId, ContentEncoding) -> @@ -91,8 +71,6 @@ receive_data(Ref, ReqId, ContentEncoding) -> {ibrowse_async_response_end, ReqId} -> ?LOG_ERROR("streaming att. ended but more data requested ~p", [ReqId]), throw({attachment_request_failed, premature_end}) - after 31000 -> - throw({attachment_request_failed, timeout}) end. start_http_request(Req) -> @@ -106,8 +84,6 @@ start_http_request(Req) -> {ok, ContentEncoding, NewReqId} -> {NewReqId, ContentEncoding} end - after 10000 -> - throw({attachment_request_failed, timeout}) end. validate_headers(_Req, 200, Headers) -> diff --git a/src/couchdb/couch_rep_changes_feed.erl b/src/couchdb/couch_rep_changes_feed.erl index 343b445c..d6dd6d6a 100644 --- a/src/couchdb/couch_rep_changes_feed.erl +++ b/src/couchdb/couch_rep_changes_feed.erl @@ -83,7 +83,8 @@ init([_Parent, #http_db{}=Source, Since, PostProps] = Args) -> resource = "_changes", qs = QS, conn = Pid, - options = [{stream_to, {self(), once}}, {response_format, binary}], + options = [{stream_to, {self(), once}}, {response_format, binary}, + {inactivity_timeout, 31000}], % miss 3 heartbeats, assume death headers = Source#http_db.headers -- [{"Accept-Encoding", "gzip"}] }, {ibrowse_req_id, ReqId} = couch_rep_httpc:request(Req), @@ -202,9 +203,6 @@ handle_info({'EXIT', From, Reason}, #state{changes_loop=From} = State) -> ?LOG_ERROR("changes_loop died with reason ~p", [Reason]), {stop, changes_loop_died, State}; -handle_info({'EXIT', _From, normal}, State) -> - {noreply, State}; - handle_info(Msg, State) -> ?LOG_DEBUG("unexpected message at changes_feed ~p", [Msg]), {noreply, State}. |