mirror of
https://github.com/prometheus/prometheus.git
synced 2024-11-09 23:24:05 -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 {
|
||||
return fmt.Errorf("head memory truncate: %w", err)
|
||||
}
|
||||
|
||||
db.head.RebuildSymbolTable(db.logger)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -16,6 +16,9 @@
|
|||
package tsdb
|
||||
|
||||
import (
|
||||
"github.com/go-kit/log"
|
||||
"github.com/go-kit/log/level"
|
||||
|
||||
"github.com/prometheus/prometheus/model/labels"
|
||||
)
|
||||
|
||||
|
@ -25,3 +28,40 @@ func (s *memSeries) labels() labels.Labels {
|
|||
defer s.Unlock()
|
||||
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
|
||||
|
||||
import (
|
||||
"github.com/go-kit/log"
|
||||
|
||||
"github.com/prometheus/prometheus/model/labels"
|
||||
)
|
||||
|
||||
|
@ -23,3 +25,8 @@ import (
|
|||
func (s *memSeries) labels() labels.Labels {
|
||||
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