Reduce allocation in log_file

pull/8796/head
Jason Wilder 2017-08-29 09:31:57 -06:00
parent d3e832b462
commit a5a2957567
1 changed files with 44 additions and 5 deletions
tsdb/index/tsi1

View File

@ -429,16 +429,55 @@ func (f *LogFile) DeleteTagValue(name, key, value []byte) error {
// AddSeriesList adds a list of series to the log file in bulk.
func (f *LogFile) AddSeriesList(names [][]byte, tagsSlice []models.Tags) error {
// Determine total size of names, keys, values.
var n int
for i := range names {
n += len(names[i])
tags := tagsSlice[i]
for j := range tags {
n += len(tags[j].Key) + len(tags[j].Value)
}
}
// Allocate names, keys, & values in one block.
buf := make([]byte, n)
// Clone all entries.
entries := make([]LogEntry, len(names))
for i := range names {
copy(buf, names[i])
clonedName := buf[:len(names[i])]
buf = buf[len(names[i]):]
// Clone tag set.
var clonedTags models.Tags
if len(tagsSlice[i]) > 0 {
clonedTags = make(models.Tags, len(tagsSlice[i]))
for j, tags := range tagsSlice[i] {
copy(buf, tags.Key)
key := buf[:len(tags.Key)]
buf = buf[len(tags.Key):]
copy(buf, tags.Value)
value := buf[:len(tags.Value)]
buf = buf[len(tags.Value):]
clonedTags[j] = models.Tag{Key: key, Value: value}
}
}
entries[i] = LogEntry{Name: clonedName, Tags: clonedTags}
}
f.mu.Lock()
defer f.mu.Unlock()
for i := range names {
// The name and tags are clone to prevent a memory leak
e := LogEntry{Name: []byte(string(names[i])), Tags: tagsSlice[i].Clone()}
if err := f.appendEntry(&e); err != nil {
for i := range entries {
if err := f.appendEntry(&entries[i]); err != nil {
return err
}
f.execEntry(&e)
f.execEntry(&entries[i])
}
return nil
}