You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ko...@apache.org on 2015/06/24 20:04:31 UTC

[1/2] chttpd commit: updated refs/heads/2724-chunked-buffering to f73ddaf

Repository: couchdb-chttpd
Updated Branches:
  refs/heads/2724-chunked-buffering a2a7a0414 -> f73ddafd0


Add basic buffering support for other feed types

With this code it is possible that changes are buffered for a long
period of time and not sent out. Will work on addressing that next.

COUCHDB-2724


Project: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/commit/2e9a10ad
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/tree/2e9a10ad
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/diff/2e9a10ad

Branch: refs/heads/2724-chunked-buffering
Commit: 2e9a10ad2f9dc5ef94b5cb309fae96214fa8b383
Parents: a2a7a04
Author: Adam Kocoloski <ad...@cloudant.com>
Authored: Wed Jun 24 13:47:01 2015 -0400
Committer: Adam Kocoloski <ad...@cloudant.com>
Committed: Wed Jun 24 13:47:01 2015 -0400

----------------------------------------------------------------------
 src/chttpd_db.erl | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/blob/2e9a10ad/src/chttpd_db.erl
----------------------------------------------------------------------
diff --git a/src/chttpd_db.erl b/src/chttpd_db.erl
index 84c7084..8405ee0 100644
--- a/src/chttpd_db.erl
+++ b/src/chttpd_db.erl
@@ -126,17 +126,18 @@ changes_callback(start, #cacc{feed = continuous} = Acc) ->
     {ok, Resp} = chttpd:start_delayed_json_response(Acc#cacc.mochi, 200),
     {ok, Acc#cacc{mochi = Resp, responding = true}};
 changes_callback({change, Change}, #cacc{feed = continuous} = Acc) ->
-    #cacc{mochi = Resp} = Acc,
-    {ok, Resp1} = chttpd:send_delayed_chunk(Resp, [?JSON_ENCODE(Change) | "\n"]),
-    {ok, Acc#cacc{mochi = Resp1}};
+    Data = [?JSON_ENCODE(Change) | "\n"],
+    Len = iolist_size(Data),
+    maybe_flush_changes_feed(Acc, Data, Len);
 changes_callback({stop, EndSeq0, Pending}, #cacc{feed = continuous} = Acc) ->
-    #cacc{mochi = Resp} = Acc,
+    #cacc{mochi = Resp, buffer = Buf} = Acc,
     EndSeq = case is_old_couch(Resp) of true -> 0; false -> EndSeq0 end,
     Row = {[
         {<<"last_seq">>, EndSeq},
         {<<"pending">>, Pending}
     ]},
-    {ok, Resp1} = chttpd:send_delayed_chunk(Resp, [?JSON_ENCODE(Row) | "\n"]),
+    Data = [Buf, ?JSON_ENCODE(Row) | "\n"],
+    {ok, Resp1} = chttpd:send_delayed_chunk(Resp, Data),
     chttpd:end_delayed_json_response(Resp1);
 
 % callbacks for eventsource feed (newline-delimited eventsource Objects)
@@ -149,23 +150,23 @@ changes_callback(start, #cacc{feed = eventsource} = Acc) ->
     {ok, Resp} = chttpd:start_delayed_json_response(Req, 200, Headers),
     {ok, Acc#cacc{mochi = Resp, responding = true}};
 changes_callback({change, {ChangeProp}=Change}, #cacc{feed = eventsource} = Acc) ->
-    #cacc{mochi = Resp} = Acc,
     Seq = proplists:get_value(seq, ChangeProp),
     Chunk = [
         "data: ", ?JSON_ENCODE(Change),
         "\n", "id: ", ?JSON_ENCODE(Seq),
         "\n\n"
     ],
-    {ok, Resp1} = chttpd:send_delayed_chunk(Resp, Chunk),
-    {ok, Acc#cacc{mochi = Resp1}};
+    Len = iolist_size(Chunk),
+    maybe_flush_changes_feed(Acc, Chunk, Len);
 changes_callback(timeout, #cacc{feed = eventsource} = Acc) ->
     #cacc{mochi = Resp} = Acc,
     Chunk = "event: heartbeat\ndata: \n\n",
     {ok, Resp1} = chttpd:send_delayed_chunk(Resp, Chunk),
     {ok, {"eventsource", Resp1}};
 changes_callback({stop, _EndSeq}, #cacc{feed = eventsource} = Acc) ->
-    Resp = Acc#cacc.mochi,
-    chttpd:end_delayed_json_response(Resp);
+    #cacc{mochi = Resp, buffer = Buf} = Acc,
+    {ok, Resp1} = chttpd:send_delayed_chunk(Resp, Buf),
+    chttpd:end_delayed_json_response(Resp1);
 
 % callbacks for longpoll and normal (single JSON Object)
 changes_callback(start, #cacc{feed = normal} = Acc) ->


[2/2] chttpd commit: updated refs/heads/2724-chunked-buffering to f73ddaf

Posted by ko...@apache.org.
Execute a callback for every complete DB traversal

This ensures that we don't enter a receive statement waiting for new DB
updates without first flushing the buffer.

COUCHDB-2724


Project: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/commit/f73ddafd
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/tree/f73ddafd
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/diff/f73ddafd

Branch: refs/heads/2724-chunked-buffering
Commit: f73ddafd0de7a30756b0d21abfe110142eeade6b
Parents: 2e9a10a
Author: Adam Kocoloski <ad...@cloudant.com>
Authored: Wed Jun 24 13:56:18 2015 -0400
Committer: Adam Kocoloski <ad...@cloudant.com>
Committed: Wed Jun 24 13:56:18 2015 -0400

----------------------------------------------------------------------
 src/chttpd_db.erl | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-chttpd/blob/f73ddafd/src/chttpd_db.erl
----------------------------------------------------------------------
diff --git a/src/chttpd_db.erl b/src/chttpd_db.erl
index 8405ee0..4217d4a 100644
--- a/src/chttpd_db.erl
+++ b/src/chttpd_db.erl
@@ -201,6 +201,10 @@ changes_callback({stop, EndSeq, Pending}, Acc) ->
     end,
     chttpd:end_delayed_json_response(Resp1);
 
+changes_callback(waiting_for_updates, Acc) ->
+    #cacc{buffer = Buf, mochi = Resp} = Acc,
+    {ok, Resp1} = chttpd:send_delayed_chunk(Resp, Buf),
+    {ok, Acc#cacc{buffer = [], bufsize = 0, mochi = Resp1}};
 changes_callback(timeout, Acc) ->
     {ok, Resp1} = chttpd:send_delayed_chunk(Acc#cacc.mochi, "\n"),
     {ok, Acc#cacc{mochi = Resp1}};