Write hashmap pointers, simplify section writer

pull/5805/head
Fabian Reinartz 2016-12-10 10:13:54 +01:00
parent 3a528c3078
commit eb9af096f9
1 changed files with 30 additions and 18 deletions

View File

@ -205,6 +205,8 @@ func (w *indexWriter) write(wr io.Writer, b []byte) error {
// section writes a CRC32 checksummed section of length l and guarded by flag.
func (w *indexWriter) section(l uint32, flag byte, f func(w io.Writer) error) error {
l++ // account for flag byte
h := crc32.NewIEEE()
wr := io.MultiWriter(h, w.w)
@ -275,7 +277,7 @@ func (w *indexWriter) writeSymbols() error {
b = append(b, s...)
}
l := uint32(len(b) + 1)
l := uint32(len(b))
return w.section(l, flagStd, func(wr io.Writer) error {
return w.write(wr, b)
@ -300,7 +302,7 @@ func (w *indexWriter) writeSeries() error {
}
}
l := uint32(len(b) + 1)
l := uint32(len(b))
return w.section(l, flagStd, func(wr io.Writer) error {
return w.write(wr, b)
@ -318,7 +320,7 @@ func (w *indexWriter) WriteLabelIndex(names []string, values []string) error {
offset: uint32(w.n),
})
l := uint32(1 + len(values)*4)
l := uint32(len(values) * 4)
return w.section(l, flagStd, func(wr io.Writer) error {
for _, v := range values {
@ -364,10 +366,10 @@ type hashEntry struct {
const hashEntrySize = uint32(unsafe.Sizeof(hashEntry{}))
func (w *indexWriter) finalize() error {
l := 1 + uint32(len(w.labelIndexes))*hashEntrySize
func (w *indexWriter) writeHashmap(h []hashEntry) error {
l := uint32(len(h)) * hashEntrySize
err := w.section(l, flagStd, func(wr io.Writer) error {
return w.section(l, flagStd, func(wr io.Writer) error {
for _, e := range w.labelIndexes {
b := ((*[hashEntrySize]byte)(unsafe.Pointer(&e)))[:]
@ -377,24 +379,34 @@ func (w *indexWriter) finalize() error {
}
return nil
})
}
if err != nil {
func (w *indexWriter) finalize() error {
// Write out hash maps to jump to correct label index and postings sections.
lo := uint32(w.n)
if err := w.writeHashmap(w.labelIndexes); err != nil {
return err
}
err = w.section(l, flagStd, func(wr io.Writer) error {
for _, e := range w.postings {
b := ((*[hashEntrySize]byte)(unsafe.Pointer(&e)))[:]
po := uint32(w.n)
if err := w.writeHashmap(w.postings); err != nil {
return err
}
if err := w.write(w.w, b); err != nil {
return nil
}
}
return nil
})
// TODO(fabxc): write hashmap offsets.
// Terminate index file with offsets to hashmaps. This is the entry Pointer
// for any index query.
// TODO(fabxc): also store offset to series section to allow plain
// iteration over all existing series?
// TODO(fabxc): store references like these that are not resolved via direct
// mmap using explicit endianness?
if err := w.write(w.w, ((*[hashEntrySize]byte)(unsafe.Pointer(&lo)))[:]); err != nil {
return err
}
if err := w.write(w.w, ((*[hashEntrySize]byte)(unsafe.Pointer(&po)))[:]); err != nil {
return err
}
return err
return nil
}
func (w *indexWriter) Close() error {