Problem when writing larger than 4kb file headers
-------------------------------------------------

                 Key: COUCHDB-800
                 URL: https://issues.apache.org/jira/browse/COUCHDB-800
             Project: CouchDB
          Issue Type: Bug
          Components: Database Core
    Affects Versions: 0.11
            Reporter: Damien Katz
            Assignee: Damien Katz
             Fix For: 0.11.1, 0.12


>From Andrey Somov:

Hi,
while reading the CouchDB source I found a question in couch_file.erl,
I am not sure whether it is a bug or not.

Lines 297-311:

handle_call({write_header, Bin}, _From, #file{fd=Fd, eof=Pos}=File) ->
   BinSize = size(Bin),
   case Pos rem ?SIZE_BLOCK of
   0 ->
       Padding = <<>>;
   BlockOffset ->
       Padding = <<0:(8*(?SIZE_BLOCK-BlockOffset))>>
   end,
   FinalBin = [Padding, <<1, BinSize:32/integer>> | make_blocks(1, [Bin])],
   case file:write(Fd, FinalBin) of
   ok ->
       {reply, ok, File#file{eof=Pos+iolist_size(FinalBin)}};
   Error ->
       {reply, Error, File}
   end;


Because <<1, BinSize:32/integer>> occupies 5 bytes make_blocks() shall
use offset=5, but the offset is only 1.
(it should be make_blocks(5, [Bin]))

Since the header is smaller then 4k there is no difference and it
works (the tests succeed with both 1 and 5). But it makes it more
difficult to understand the code for those who study the source to
understand how it works.

-
Thank you,
Andrey

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to