mirror of
https://github.com/prometheus/prometheus.git
synced 2025-03-05 20:59:13 -08:00
TSDB: rebuild labels symbol-table on each compaction
Log begin/end for timing, plus some stats. Signed-off-by: Bryan Boreham <bjboreham@gmail.com>
This commit is contained in:
parent
e6356e64bd
commit
5281a6bc1b
|
@ -1407,6 +1407,9 @@ func (db *DB) compactHead(head *RangeHead) error {
|
||||||
if err = db.head.truncateMemory(head.BlockMaxTime()); err != nil {
|
if err = db.head.truncateMemory(head.BlockMaxTime()); err != nil {
|
||||||
return fmt.Errorf("head memory truncate: %w", err)
|
return fmt.Errorf("head memory truncate: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
db.head.RebuildSymbolTable(db.logger)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,9 @@
|
||||||
package tsdb
|
package tsdb
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/go-kit/log"
|
||||||
|
"github.com/go-kit/log/level"
|
||||||
|
|
||||||
"github.com/prometheus/prometheus/model/labels"
|
"github.com/prometheus/prometheus/model/labels"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -25,3 +28,40 @@ func (s *memSeries) labels() labels.Labels {
|
||||||
defer s.Unlock()
|
defer s.Unlock()
|
||||||
return s.lset
|
return s.lset
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RebuildSymbolTable goes through all the series in h, build a SymbolTable with all names and values,
|
||||||
|
// replace each series' Labels with one using that SymbolTable.
|
||||||
|
func (h *Head) RebuildSymbolTable(logger log.Logger) *labels.SymbolTable {
|
||||||
|
level.Info(logger).Log("msg", "RebuildSymbolTable starting")
|
||||||
|
st := labels.NewSymbolTable()
|
||||||
|
builder := labels.NewScratchBuilderWithSymbolTable(st, 0)
|
||||||
|
rebuildLabels := func(lbls labels.Labels) labels.Labels {
|
||||||
|
builder.Reset()
|
||||||
|
lbls.Range(func(l labels.Label) {
|
||||||
|
builder.Add(l.Name, l.Value)
|
||||||
|
})
|
||||||
|
return builder.Labels()
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < h.series.size; i++ {
|
||||||
|
h.series.locks[i].Lock()
|
||||||
|
|
||||||
|
for _, s := range h.series.hashes[i].unique {
|
||||||
|
s.Lock()
|
||||||
|
s.lset = rebuildLabels(s.lset)
|
||||||
|
s.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, all := range h.series.hashes[i].conflicts {
|
||||||
|
for _, s := range all {
|
||||||
|
s.Lock()
|
||||||
|
s.lset = rebuildLabels(s.lset)
|
||||||
|
s.Unlock()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h.series.locks[i].Unlock()
|
||||||
|
}
|
||||||
|
level.Info(logger).Log("msg", "RebuildSymbolTable finished", "size", st.Len())
|
||||||
|
return st
|
||||||
|
}
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
package tsdb
|
package tsdb
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/go-kit/log"
|
||||||
|
|
||||||
"github.com/prometheus/prometheus/model/labels"
|
"github.com/prometheus/prometheus/model/labels"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -23,3 +25,8 @@ import (
|
||||||
func (s *memSeries) labels() labels.Labels {
|
func (s *memSeries) labels() labels.Labels {
|
||||||
return s.lset
|
return s.lset
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// No-op when not using dedupelabels.
|
||||||
|
func (h *Head) RebuildSymbolTable(logger log.Logger) *labels.SymbolTable {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue