You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by fd...@apache.org on 2010/07/16 23:35:57 UTC

svn commit: r964957 - in /couchdb/branches/1.0.x/src/couchdb: couch_db.erl couch_rep_att.erl

Author: fdmanana
Date: Fri Jul 16 21:35:57 2010
New Revision: 964957

URL: http://svn.apache.org/viewvc?rev=964957&view=rev
Log:
Merge revision 964956 from trunk:

Fix for	a pull replication, targeted to a 1.0 CouchDB server, where the	source DB is in a remote CouchDB 0.11.0	server and the target DB is local (1.0 CouchDB DB).

Closes ticket COUCHDB-827.


Modified:
    couchdb/branches/1.0.x/src/couchdb/couch_db.erl
    couchdb/branches/1.0.x/src/couchdb/couch_rep_att.erl

Modified: couchdb/branches/1.0.x/src/couchdb/couch_db.erl
URL: http://svn.apache.org/viewvc/couchdb/branches/1.0.x/src/couchdb/couch_db.erl?rev=964957&r1=964956&r2=964957&view=diff
==============================================================================
--- couchdb/branches/1.0.x/src/couchdb/couch_db.erl (original)
+++ couchdb/branches/1.0.x/src/couchdb/couch_db.erl Fri Jul 16 21:35:57 2010
@@ -901,10 +901,20 @@ with_stream(Fd, #att{md5=InMd5,type=Type
 
 write_streamed_attachment(_Stream, _F, 0) ->
     ok;
+% LenLeft might be different from the total size of what function F returns.
+% This happens when doing a pull replication of compressed attachments from a
+% 0.11.0 server, where LenLeft will match the uncompressed size but we end up
+% receiving the attachment compressed (therefore a size different from LenLeft).
+% This is because 0.11.0 doesn't understand the query parameter
+% "?att_encoding_info=true" when we do a doc request (GET /somedb/somedoc).
 write_streamed_attachment(Stream, F, LenLeft) ->
-    Bin = F(),
-    ok = couch_stream:write(Stream, Bin),
-    write_streamed_attachment(Stream, F, LenLeft - size(Bin)).
+    case F() of
+    Bin when is_binary(Bin) ->
+        ok = couch_stream:write(Stream, Bin),
+        write_streamed_attachment(Stream, F, LenLeft - size(Bin));
+    eof ->
+        ok
+    end.
 
 enum_docs_since_reduce_to_count(Reds) ->
     couch_btree:final_reduce(

Modified: couchdb/branches/1.0.x/src/couchdb/couch_rep_att.erl
URL: http://svn.apache.org/viewvc/couchdb/branches/1.0.x/src/couchdb/couch_rep_att.erl?rev=964957&r1=964956&r2=964957&view=diff
==============================================================================
--- couchdb/branches/1.0.x/src/couchdb/couch_rep_att.erl (original)
+++ couchdb/branches/1.0.x/src/couchdb/couch_rep_att.erl Fri Jul 16 21:35:57 2010
@@ -81,8 +81,12 @@ receive_data(Ref, ReqId, ContentEncoding
         % ?LOG_DEBUG("got ~p bytes for ~p", [size(Data), ReqId]),
         Data;
     {ibrowse_async_response_end, ReqId} ->
-        ?LOG_ERROR("streaming att. ended but more data requested ~p", [ReqId]),
-        throw({attachment_request_failed, premature_end})
+        % This means ibrowse received all the data it was supposed to.
+        % In case of not receiving the whole data, due to a network link
+        % failure for example, we would have received an error message.
+        % In other words, this message doesn't represent an error - look into
+        % ibrowse_http_client.erl.
+        eof
     after 31000 ->
         throw({attachment_request_failed, timeout})
     end.