mirror of https://github.com/prometheus/prometheus
Write hashmap pointers, simplify section writer
parent
3a528c3078
commit
eb9af096f9
48
writer.go
48
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.
|
||||
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 {
|
||||
|
|
Loading…
Reference in New Issue