You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2010/08/19 10:55:11 UTC

svn commit: r987084 - in /couchdb/trunk/src/couchdb: couch_httpd_db.erl couch_stream.erl

Author: rnewson
Date: Thu Aug 19 08:55:10 2010
New Revision: 987084

URL: http://svn.apache.org/viewvc?rev=987084&view=rev
Log:
Support Range header for all attachments, even without compaction upgrade. It's just less efficient.

Modified:
    couchdb/trunk/src/couchdb/couch_httpd_db.erl
    couchdb/trunk/src/couchdb/couch_stream.erl

Modified: couchdb/trunk/src/couchdb/couch_httpd_db.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_httpd_db.erl?rev=987084&r1=987083&r2=987084&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_httpd_db.erl (original)
+++ couchdb/trunk/src/couchdb/couch_httpd_db.erl Thu Aug 19 08:55:10 2010
@@ -883,7 +883,8 @@ db_attachment_req(#httpd{method='GET',mo
         Headers = [
             {"ETag", Etag},
             {"Cache-Control", "must-revalidate"},
-            {"Content-Type", binary_to_list(Type)}
+            {"Content-Type", binary_to_list(Type)},
+            {"Accept-Ranges", "bytes"}
         ] ++ case ReqAcceptsAttEnc of
         true ->
             [{"Content-Encoding", atom_to_list(Enc)}];
@@ -925,22 +926,13 @@ db_attachment_req(#httpd{method='GET',mo
                     AttFun(Att, fun(Seg, _) -> send_chunk(Resp, Seg) end, {ok, Resp}),
                     last_chunk(Resp);
                 _ ->
-                    #att{data={_,StreamInfo}} = Att, %% layering violation
-                    SupportsRange = case StreamInfo of
-                        [{_,_}|_] -> true;
-                        _ -> false
-                    end,
                     Ranges = MochiReq:get(range),
                     HasSingleRange = case Ranges of
                         [_] -> true;
                         _ -> false
                     end,
-                    Headers1 = case SupportsRange of
-                        false ->[{<<"Accept-Ranges">>, <<"none">>}] ++ Headers;
-                        true -> [{<<"Accept-Ranges">>, <<"bytes">>}] ++ Headers
-                    end,
                     if
-                        Enc == identity andalso SupportsRange == true andalso HasSingleRange == true ->
+                        Enc == identity andalso HasSingleRange == true ->
                             [{From, To}] = Ranges,
                             {From1, To1} = case {From, To} of
                                 {none, To} ->
@@ -956,13 +948,13 @@ db_attachment_req(#httpd{method='GET',mo
                                 true ->
                                     ok
                             end,
-                            Headers2 = [{<<"Content-Range">>,
+                            Headers1 = [{<<"Content-Range">>,
                                 ?l2b(io_lib:format("bytes ~B-~B/~B", [From1, To1, Len]))}]
-                                ++ Headers1,
-                            {ok, Resp} = start_response_length(Req, 206, Headers2, To1 - From1 + 1),
+                                ++ Headers,
+                            {ok, Resp} = start_response_length(Req, 206, Headers1, To1 - From1 + 1),
                             couch_doc:range_att_foldl(Att, From1, To1 + 1, fun(Seg, _) -> send(Resp, Seg) end, {ok, Resp});
                         true ->
-                            {ok, Resp} = start_response_length(Req, 200, Headers1, Len),
+                            {ok, Resp} = start_response_length(Req, 200, Headers, Len),
                             AttFun(Att, fun(Seg, _) -> send(Resp, Seg) end, {ok, Resp})
                     end
                 end

Modified: couchdb/trunk/src/couchdb/couch_stream.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_stream.erl?rev=987084&r1=987083&r2=987084&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_stream.erl (original)
+++ couchdb/trunk/src/couchdb/couch_stream.erl Thu Aug 19 08:55:10 2010
@@ -129,6 +129,9 @@ range_foldl(Fd, PosList, From, To, Fun, 
 
 range_foldl(_Fd, _PosList, _From, To, Off, _Fun, Acc) when Off >= To ->
     Acc;
+range_foldl(Fd, [Pos|Rest], From, To, Off, Fun, Acc) when is_integer(Pos) -> % old-style attachment
+    {ok, Bin} = couch_file:pread_iolist(Fd, Pos),
+    range_foldl(Fd, [{Pos, iolist_size(Bin)}] ++ Rest, From, To, Off, Fun, Acc);
 range_foldl(Fd, [{_Pos, Size}|Rest], From, To, Off, Fun, Acc) when From > Off + Size ->
     range_foldl(Fd, Rest, From, To, Off + Size, Fun, Acc);
 range_foldl(Fd, [{Pos, Size}|Rest], From, To, Off, Fun, Acc) ->



Re: svn commit: r987084 - in /couchdb/trunk/src/couchdb: couch_httpd_db.erl couch_stream.erl

Posted by Robert Newson <ro...@gmail.com>.
In order to honor any range request when the lengths of each fragment
are not known, all fragments up to the start of the range must be read
and discarded (fragments after the range are not read). So "less
efficient" means that the worst case is it reads the entire
attachment. It's not less efficient than it was before this work.

B.

On Sun, Oct 17, 2010 at 3:30 PM, Jan Lehnardt <ja...@apache.org> wrote:
>
> On 19 Aug 2010, at 10:55, rnewson@apache.org wrote:
>
>> Author: rnewson
>> Date: Thu Aug 19 08:55:10 2010
>> New Revision: 987084
>>
>> URL: http://svn.apache.org/viewvc?rev=987084&view=rev
>> Log:
>> Support Range header for all attachments, even without compaction upgrade. It's just less efficient.
>
> How much "less"?
>
> Cheers
> Jan
> --
>
>
>>
>> Modified:
>>    couchdb/trunk/src/couchdb/couch_httpd_db.erl
>>    couchdb/trunk/src/couchdb/couch_stream.erl
>>
>> Modified: couchdb/trunk/src/couchdb/couch_httpd_db.erl
>> URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_httpd_db.erl?rev=987084&r1=987083&r2=987084&view=diff
>> ==============================================================================
>> --- couchdb/trunk/src/couchdb/couch_httpd_db.erl (original)
>> +++ couchdb/trunk/src/couchdb/couch_httpd_db.erl Thu Aug 19 08:55:10 2010
>> @@ -883,7 +883,8 @@ db_attachment_req(#httpd{method='GET',mo
>>         Headers = [
>>             {"ETag", Etag},
>>             {"Cache-Control", "must-revalidate"},
>> -            {"Content-Type", binary_to_list(Type)}
>> +            {"Content-Type", binary_to_list(Type)},
>> +            {"Accept-Ranges", "bytes"}
>>         ] ++ case ReqAcceptsAttEnc of
>>         true ->
>>             [{"Content-Encoding", atom_to_list(Enc)}];
>> @@ -925,22 +926,13 @@ db_attachment_req(#httpd{method='GET',mo
>>                     AttFun(Att, fun(Seg, _) -> send_chunk(Resp, Seg) end, {ok, Resp}),
>>                     last_chunk(Resp);
>>                 _ ->
>> -                    #att{data={_,StreamInfo}} = Att, %% layering violation
>> -                    SupportsRange = case StreamInfo of
>> -                        [{_,_}|_] -> true;
>> -                        _ -> false
>> -                    end,
>>                     Ranges = MochiReq:get(range),
>>                     HasSingleRange = case Ranges of
>>                         [_] -> true;
>>                         _ -> false
>>                     end,
>> -                    Headers1 = case SupportsRange of
>> -                        false ->[{<<"Accept-Ranges">>, <<"none">>}] ++ Headers;
>> -                        true -> [{<<"Accept-Ranges">>, <<"bytes">>}] ++ Headers
>> -                    end,
>>                     if
>> -                        Enc == identity andalso SupportsRange == true andalso HasSingleRange == true ->
>> +                        Enc == identity andalso HasSingleRange == true ->
>>                             [{From, To}] = Ranges,
>>                             {From1, To1} = case {From, To} of
>>                                 {none, To} ->
>> @@ -956,13 +948,13 @@ db_attachment_req(#httpd{method='GET',mo
>>                                 true ->
>>                                     ok
>>                             end,
>> -                            Headers2 = [{<<"Content-Range">>,
>> +                            Headers1 = [{<<"Content-Range">>,
>>                                 ?l2b(io_lib:format("bytes ~B-~B/~B", [From1, To1, Len]))}]
>> -                                ++ Headers1,
>> -                            {ok, Resp} = start_response_length(Req, 206, Headers2, To1 - From1 + 1),
>> +                                ++ Headers,
>> +                            {ok, Resp} = start_response_length(Req, 206, Headers1, To1 - From1 + 1),
>>                             couch_doc:range_att_foldl(Att, From1, To1 + 1, fun(Seg, _) -> send(Resp, Seg) end, {ok, Resp});
>>                         true ->
>> -                            {ok, Resp} = start_response_length(Req, 200, Headers1, Len),
>> +                            {ok, Resp} = start_response_length(Req, 200, Headers, Len),
>>                             AttFun(Att, fun(Seg, _) -> send(Resp, Seg) end, {ok, Resp})
>>                     end
>>                 end
>>
>> Modified: couchdb/trunk/src/couchdb/couch_stream.erl
>> URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_stream.erl?rev=987084&r1=987083&r2=987084&view=diff
>> ==============================================================================
>> --- couchdb/trunk/src/couchdb/couch_stream.erl (original)
>> +++ couchdb/trunk/src/couchdb/couch_stream.erl Thu Aug 19 08:55:10 2010
>> @@ -129,6 +129,9 @@ range_foldl(Fd, PosList, From, To, Fun,
>>
>> range_foldl(_Fd, _PosList, _From, To, Off, _Fun, Acc) when Off >= To ->
>>     Acc;
>> +range_foldl(Fd, [Pos|Rest], From, To, Off, Fun, Acc) when is_integer(Pos) -> % old-style attachment
>> +    {ok, Bin} = couch_file:pread_iolist(Fd, Pos),
>> +    range_foldl(Fd, [{Pos, iolist_size(Bin)}] ++ Rest, From, To, Off, Fun, Acc);
>> range_foldl(Fd, [{_Pos, Size}|Rest], From, To, Off, Fun, Acc) when From > Off + Size ->
>>     range_foldl(Fd, Rest, From, To, Off + Size, Fun, Acc);
>> range_foldl(Fd, [{Pos, Size}|Rest], From, To, Off, Fun, Acc) ->
>>
>>
>
>

Re: svn commit: r987084 - in /couchdb/trunk/src/couchdb: couch_httpd_db.erl couch_stream.erl

Posted by Jan Lehnardt <ja...@apache.org>.
On 19 Aug 2010, at 10:55, rnewson@apache.org wrote:

> Author: rnewson
> Date: Thu Aug 19 08:55:10 2010
> New Revision: 987084
> 
> URL: http://svn.apache.org/viewvc?rev=987084&view=rev
> Log:
> Support Range header for all attachments, even without compaction upgrade. It's just less efficient.

How much "less"?

Cheers
Jan
-- 


> 
> Modified:
>    couchdb/trunk/src/couchdb/couch_httpd_db.erl
>    couchdb/trunk/src/couchdb/couch_stream.erl
> 
> Modified: couchdb/trunk/src/couchdb/couch_httpd_db.erl
> URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_httpd_db.erl?rev=987084&r1=987083&r2=987084&view=diff
> ==============================================================================
> --- couchdb/trunk/src/couchdb/couch_httpd_db.erl (original)
> +++ couchdb/trunk/src/couchdb/couch_httpd_db.erl Thu Aug 19 08:55:10 2010
> @@ -883,7 +883,8 @@ db_attachment_req(#httpd{method='GET',mo
>         Headers = [
>             {"ETag", Etag},
>             {"Cache-Control", "must-revalidate"},
> -            {"Content-Type", binary_to_list(Type)}
> +            {"Content-Type", binary_to_list(Type)},
> +            {"Accept-Ranges", "bytes"}
>         ] ++ case ReqAcceptsAttEnc of
>         true ->
>             [{"Content-Encoding", atom_to_list(Enc)}];
> @@ -925,22 +926,13 @@ db_attachment_req(#httpd{method='GET',mo
>                     AttFun(Att, fun(Seg, _) -> send_chunk(Resp, Seg) end, {ok, Resp}),
>                     last_chunk(Resp);
>                 _ ->
> -                    #att{data={_,StreamInfo}} = Att, %% layering violation
> -                    SupportsRange = case StreamInfo of
> -                        [{_,_}|_] -> true;
> -                        _ -> false
> -                    end,
>                     Ranges = MochiReq:get(range),
>                     HasSingleRange = case Ranges of
>                         [_] -> true;
>                         _ -> false
>                     end,
> -                    Headers1 = case SupportsRange of
> -                        false ->[{<<"Accept-Ranges">>, <<"none">>}] ++ Headers;
> -                        true -> [{<<"Accept-Ranges">>, <<"bytes">>}] ++ Headers
> -                    end,
>                     if
> -                        Enc == identity andalso SupportsRange == true andalso HasSingleRange == true ->
> +                        Enc == identity andalso HasSingleRange == true ->
>                             [{From, To}] = Ranges,
>                             {From1, To1} = case {From, To} of
>                                 {none, To} ->
> @@ -956,13 +948,13 @@ db_attachment_req(#httpd{method='GET',mo
>                                 true ->
>                                     ok
>                             end,
> -                            Headers2 = [{<<"Content-Range">>,
> +                            Headers1 = [{<<"Content-Range">>,
>                                 ?l2b(io_lib:format("bytes ~B-~B/~B", [From1, To1, Len]))}]
> -                                ++ Headers1,
> -                            {ok, Resp} = start_response_length(Req, 206, Headers2, To1 - From1 + 1),
> +                                ++ Headers,
> +                            {ok, Resp} = start_response_length(Req, 206, Headers1, To1 - From1 + 1),
>                             couch_doc:range_att_foldl(Att, From1, To1 + 1, fun(Seg, _) -> send(Resp, Seg) end, {ok, Resp});
>                         true ->
> -                            {ok, Resp} = start_response_length(Req, 200, Headers1, Len),
> +                            {ok, Resp} = start_response_length(Req, 200, Headers, Len),
>                             AttFun(Att, fun(Seg, _) -> send(Resp, Seg) end, {ok, Resp})
>                     end
>                 end
> 
> Modified: couchdb/trunk/src/couchdb/couch_stream.erl
> URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_stream.erl?rev=987084&r1=987083&r2=987084&view=diff
> ==============================================================================
> --- couchdb/trunk/src/couchdb/couch_stream.erl (original)
> +++ couchdb/trunk/src/couchdb/couch_stream.erl Thu Aug 19 08:55:10 2010
> @@ -129,6 +129,9 @@ range_foldl(Fd, PosList, From, To, Fun, 
> 
> range_foldl(_Fd, _PosList, _From, To, Off, _Fun, Acc) when Off >= To ->
>     Acc;
> +range_foldl(Fd, [Pos|Rest], From, To, Off, Fun, Acc) when is_integer(Pos) -> % old-style attachment
> +    {ok, Bin} = couch_file:pread_iolist(Fd, Pos),
> +    range_foldl(Fd, [{Pos, iolist_size(Bin)}] ++ Rest, From, To, Off, Fun, Acc);
> range_foldl(Fd, [{_Pos, Size}|Rest], From, To, Off, Fun, Acc) when From > Off + Size ->
>     range_foldl(Fd, Rest, From, To, Off + Size, Fun, Acc);
> range_foldl(Fd, [{Pos, Size}|Rest], From, To, Off, Fun, Acc) ->
> 
>