mirror of https://github.com/prometheus/prometheus
Write hashmap pointers, simplify section writer
parent
3a528c3078
commit
eb9af096f9
50
writer.go
50
writer.go
|
@ -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.
|
// 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 {
|
func (w *indexWriter) section(l uint32, flag byte, f func(w io.Writer) error) error {
|
||||||
|
l++ // account for flag byte
|
||||||
|
|
||||||
h := crc32.NewIEEE()
|
h := crc32.NewIEEE()
|
||||||
wr := io.MultiWriter(h, w.w)
|
wr := io.MultiWriter(h, w.w)
|
||||||
|
|
||||||
|
@ -275,7 +277,7 @@ func (w *indexWriter) writeSymbols() error {
|
||||||
b = append(b, s...)
|
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.section(l, flagStd, func(wr io.Writer) error {
|
||||||
return w.write(wr, b)
|
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.section(l, flagStd, func(wr io.Writer) error {
|
||||||
return w.write(wr, b)
|
return w.write(wr, b)
|
||||||
|
@ -318,7 +320,7 @@ func (w *indexWriter) WriteLabelIndex(names []string, values []string) error {
|
||||||
offset: uint32(w.n),
|
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 {
|
return w.section(l, flagStd, func(wr io.Writer) error {
|
||||||
for _, v := range values {
|
for _, v := range values {
|
||||||
|
@ -364,10 +366,10 @@ type hashEntry struct {
|
||||||
|
|
||||||
const hashEntrySize = uint32(unsafe.Sizeof(hashEntry{}))
|
const hashEntrySize = uint32(unsafe.Sizeof(hashEntry{}))
|
||||||
|
|
||||||
func (w *indexWriter) finalize() error {
|
func (w *indexWriter) writeHashmap(h []hashEntry) error {
|
||||||
l := 1 + uint32(len(w.labelIndexes))*hashEntrySize
|
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 {
|
for _, e := range w.labelIndexes {
|
||||||
b := ((*[hashEntrySize]byte)(unsafe.Pointer(&e)))[:]
|
b := ((*[hashEntrySize]byte)(unsafe.Pointer(&e)))[:]
|
||||||
|
|
||||||
|
@ -377,24 +379,34 @@ func (w *indexWriter) finalize() error {
|
||||||
}
|
}
|
||||||
return nil
|
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
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = w.section(l, flagStd, func(wr io.Writer) error {
|
po := uint32(w.n)
|
||||||
for _, e := range w.postings {
|
if err := w.writeHashmap(w.postings); err != nil {
|
||||||
b := ((*[hashEntrySize]byte)(unsafe.Pointer(&e)))[:]
|
|
||||||
|
|
||||||
if err := w.write(w.w, b); err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
// TODO(fabxc): write hashmap offsets.
|
|
||||||
|
|
||||||
return err
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *indexWriter) Close() error {
|
func (w *indexWriter) Close() error {
|
||||||
|
|
Loading…
Reference in New Issue