Resuse single CRC for index checksum validation

This commit is contained in:
Sunny Klair 2017-10-27 12:29:59 -04:00
parent b65dd43c5b
commit aecac3b521

View file

@ -570,6 +570,8 @@ type indexReader struct {
// prevents memory faults when applications work with read symbols after // prevents memory faults when applications work with read symbols after
// the block has been unmapped. // the block has been unmapped.
symbols map[uint32]string symbols map[uint32]string
crc32 hash.Hash32
} }
var ( var (
@ -591,6 +593,7 @@ func newIndexReader(dir string) (*indexReader, error) {
b: f.b, b: f.b,
c: f, c: f,
symbols: map[uint32]string{}, symbols: map[uint32]string{},
crc32: newCRC32(),
} }
// Verify magic number. // Verify magic number.
@ -626,7 +629,7 @@ func (r *indexReader) readTOC() error {
r.toc.postings = d.be64() r.toc.postings = d.be64()
r.toc.postingsTable = d.be64() r.toc.postingsTable = d.be64()
if valid, err := r.checkCrc(d.be32(), len(r.b)-indexTOCLen, indexTOCLen-4); !valid { if valid, err := r.checkCRC(d.be32(), len(r.b)-indexTOCLen, indexTOCLen-4); !valid {
return errors.Wrap(err, "TOC checksum") return errors.Wrap(err, "TOC checksum")
} }
@ -640,15 +643,15 @@ func (r *indexReader) decbufAt(off int) decbuf {
return decbuf{b: r.b[off:]} return decbuf{b: r.b[off:]}
} }
func (r *indexReader) checkCrc(crc uint32, off, cnt int) (bool, error) { func (r *indexReader) checkCRC(crc uint32, off, cnt int) (bool, error) {
c2 := newCRC32() r.crc32.Reset()
if len(r.b) < off+cnt { if len(r.b) < off+cnt {
return false, errInvalidSize return false, errInvalidSize
} }
if _, err := c2.Write(r.b[off : off+cnt]); err != nil { if _, err := r.crc32.Write(r.b[off : off+cnt]); err != nil {
return false, errors.Wrap(err, "write to hash") return false, errors.Wrap(err, "write to hash")
} }
if c2.Sum32() != crc { if r.crc32.Sum32() != crc {
return false, errInvalidChecksum return false, errInvalidChecksum
} }
return true, nil return true, nil
@ -677,7 +680,7 @@ func (r *indexReader) readSymbols(off int) error {
nextPos = basePos + uint32(origLen-d2.len()) nextPos = basePos + uint32(origLen-d2.len())
cnt-- cnt--
} }
if valid, err := r.checkCrc(d1.be32(), int(off)+4, l); !valid { if valid, err := r.checkCRC(d1.be32(), int(off)+4, l); !valid {
return errors.Wrap(err, "symbol table checksum") return errors.Wrap(err, "symbol table checksum")
} }
return d2.err() return d2.err()
@ -709,7 +712,7 @@ func (r *indexReader) readOffsetTable(off uint64) (map[string]uint32, error) {
cnt-- cnt--
} }
if valid, err := r.checkCrc(d1.be32(), int(off)+4, l); !valid { if valid, err := r.checkCRC(d1.be32(), int(off)+4, l); !valid {
return res, errors.Wrap(err, "offset table checksum") return res, errors.Wrap(err, "offset table checksum")
} }
@ -779,7 +782,7 @@ func (r *indexReader) LabelValues(names ...string) (StringTuples, error) {
return nil, errors.Wrap(d2.err(), "read label value index") return nil, errors.Wrap(d2.err(), "read label value index")
} }
if valid, err := r.checkCrc(d1.be32(), int(off)+4, l); !valid { if valid, err := r.checkCRC(d1.be32(), int(off)+4, l); !valid {
return nil, errors.Wrap(err, "read label values checksum") return nil, errors.Wrap(err, "read label values checksum")
} }
@ -874,7 +877,7 @@ func (r *indexReader) Series(ref uint64, lbls *labels.Labels, chks *[]ChunkMeta)
}) })
} }
if valid, err := r.checkCrc(d1.be32(), int(ref)+sl, l); !valid { if valid, err := r.checkCRC(d1.be32(), int(ref)+sl, l); !valid {
return errors.Wrap(err, "series checksum") return errors.Wrap(err, "series checksum")
} }
@ -900,7 +903,7 @@ func (r *indexReader) Postings(name, value string) (Postings, error) {
return nil, errors.Wrap(d2.err(), "get postings bytes") return nil, errors.Wrap(d2.err(), "get postings bytes")
} }
if valid, err := r.checkCrc(d1.be32(), int(off)+4, l); !valid { if valid, err := r.checkCRC(d1.be32(), int(off)+4, l); !valid {
return nil, errors.Wrap(err, "postings checksum") return nil, errors.Wrap(err, "postings checksum")
} }