diff --git a/tsdb/head.go b/tsdb/head.go index 78df3da89..79e9aeb38 100644 --- a/tsdb/head.go +++ b/tsdb/head.go @@ -2418,3 +2418,34 @@ func (h *Head) ForEachSecondaryHash(fn func(secondaryHash []uint32)) { } } } + +// Go 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() *labels.SymbolTable { + 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.lset = rebuildLabels(s.lset) + } + + for _, all := range h.series.hashes[i].conflicts { + for _, s := range all { + s.lset = rebuildLabels(s.lset) + } + } + + h.series.locks[i].Unlock() + } + return st +}