diff --git a/tsdb/addsymbol.go b/tsdb/addsymbol.go new file mode 100644 index 0000000000..e6046c5ed1 --- /dev/null +++ b/tsdb/addsymbol.go @@ -0,0 +1,10 @@ +//go:build !stringlabels + +// Split out function which needs to be coded differently for stringlabels case. + +package tsdb + +func (sw *symbolsBatcher) addSymbol(sym string) error { + sw.buffer[sym] = struct{}{} + return sw.flushSymbols(false) +} diff --git a/tsdb/addsymbol_stringlabels.go b/tsdb/addsymbol_stringlabels.go new file mode 100644 index 0000000000..86f19c847f --- /dev/null +++ b/tsdb/addsymbol_stringlabels.go @@ -0,0 +1,15 @@ +//go:build stringlabels + +// Split out function which needs to be coded differently for stringlabels case. + +package tsdb + +import "strings" + +func (sw *symbolsBatcher) addSymbol(sym string) error { + if _, found := sw.buffer[sym]; !found { + sym = strings.Clone(sym) // So we don't retain reference to the entire labels block. + sw.buffer[sym] = struct{}{} + } + return sw.flushSymbols(false) +} diff --git a/tsdb/symbols_batch.go b/tsdb/symbols_batch.go index 13fe84f907..4ecc66bf02 100644 --- a/tsdb/symbols_batch.go +++ b/tsdb/symbols_batch.go @@ -145,11 +145,6 @@ func newSymbolsBatcher(limit int, dir string, flushers *symbolFlushers) *symbols } } -func (sw *symbolsBatcher) addSymbol(sym string) error { - sw.buffer[sym] = struct{}{} - return sw.flushSymbols(false) -} - func (sw *symbolsBatcher) flushSymbols(force bool) error { if !force && len(sw.buffer) < sw.limit { return nil