From 0b78d228d21eff88344e1998ab0cc5e0030c9ad0 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Fri, 7 Jun 2019 23:17:57 +0300 Subject: [PATCH] app/vminsert: properly read trailing line without newline in the end This fixes https://github.com/VictoriaMetrics/VictoriaMetrics/issues/60 --- app/vminsert/common/lines_reader.go | 8 ++++++++ app/vminsert/common/lines_reader_test.go | 3 --- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/vminsert/common/lines_reader.go b/app/vminsert/common/lines_reader.go index f2d7db3f7..4f28bf845 100644 --- a/app/vminsert/common/lines_reader.go +++ b/app/vminsert/common/lines_reader.go @@ -20,6 +20,7 @@ const defaultBlockSize = 64 * 1024 // // Returns (dstBuf, tailBuf). func ReadLinesBlock(r io.Reader, dstBuf, tailBuf []byte) ([]byte, []byte, error) { + origDstBufLen := len(dstBuf) if cap(dstBuf) < defaultBlockSize { dstBuf = bytesutil.Resize(dstBuf, defaultBlockSize) } @@ -32,6 +33,13 @@ again: if err == nil { return dstBuf, tailBuf, fmt.Errorf("no forward progress made") } + if err == io.EOF && len(dstBuf) > origDstBufLen { + // Missing newline in the end of stream. This is OK, + /// so suppress io.EOF for now. It will be returned during the next + // call to ReadLinesBlock. + // This fixes https://github.com/VictoriaMetrics/VictoriaMetrics/issues/60 . + return dstBuf, tailBuf, nil + } return dstBuf, tailBuf, err } dstBuf = dstBuf[:len(dstBuf)+n] diff --git a/app/vminsert/common/lines_reader_test.go b/app/vminsert/common/lines_reader_test.go index 4f320e215..6c3d304c3 100644 --- a/app/vminsert/common/lines_reader_test.go +++ b/app/vminsert/common/lines_reader_test.go @@ -29,9 +29,6 @@ func TestReadLinesBlockFailure(t *testing.T) { // empty string f("") - // no newline in nonempty string - f("foobar") - // too long string b := make([]byte, maxLineSize+1) f(string(b))