Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
0.11
-
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 ->
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