Uploaded image for project: 'CouchDB'
  1. CouchDB
  2. COUCHDB-800

Problem when writing larger than 4kb file headers

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 0.11
    • 0.11.1
    • Database Core
    • None

    Description

      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

      Attachments

        Activity

          People

            damienkatz Damien Katz
            damienkatz Damien Katz
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: