From 8425df035d641e0b4b387115c212c191cf4d45e8 Mon Sep 17 00:00:00 2001 From: Fabian Reinartz Date: Sun, 11 Dec 2016 15:49:24 +0100 Subject: [PATCH] Fix hashmap serialization --- writer.go | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/writer.go b/writer.go index 98e1fbbd7b..ebd67778a3 100644 --- a/writer.go +++ b/writer.go @@ -59,7 +59,7 @@ func (w *seriesWriter) write(wr io.Writer, b []byte) error { } func (w *seriesWriter) writeMeta() error { - b := [64]byte{} + b := [8]byte{} binary.BigEndian.PutUint32(b[:4], MagicSeries) b[4] = flagStd @@ -79,16 +79,15 @@ func (w *seriesWriter) WriteSeries(ref uint32, lset Labels, chks []*chunkDesc) e h := crc32.NewIEEE() wr := io.MultiWriter(h, w.w) - l := 0 - for _, cd := range chks { - l += len(cd.chunk.Bytes()) - } - // For normal reads we don't need the length of the chunk section but + // For normal reads we don't need the number of the chunk section but // it allows us to verify checksums without reading the index file. - b := [4]byte{} - binary.BigEndian.PutUint32(b[:], uint32(l)) + // The offsets are also technically enough to calculate chunk size. but + // holding the length of each chunk could later allow for adding padding + // between chunks. + b := [binary.MaxVarintLen32]byte{} + n := binary.PutUvarint(b[:], uint64(len(chks))) - if err := w.write(wr, b[:]); err != nil { + if err := w.write(wr, b[:n]); err != nil { return err } @@ -100,7 +99,11 @@ func (w *seriesWriter) WriteSeries(ref uint32, lset Labels, chks []*chunkDesc) e Value: lastTimestamp, Offset: uint32(w.n), }) + n = binary.PutUvarint(b[:], uint64(len(cd.chunk.Bytes()))) + if err := w.write(wr, b[:n]); err != nil { + return err + } if err := w.write(wr, []byte{byte(cd.chunk.Encoding())}); err != nil { return err } @@ -229,7 +232,7 @@ func (w *indexWriter) section(l uint32, flag byte, f func(w io.Writer) error) er } func (w *indexWriter) writeMeta() error { - b := [64]byte{} + b := [8]byte{} binary.BigEndian.PutUint32(b[:4], MagicIndex) b[4] = flagStd