Return created series ids from LogFile insertion
parent
52b5640a4a
commit
065d47e4f2
tsdb/index/tsi1
|
@ -509,10 +509,10 @@ func (f *LogFile) DeleteTagValue(name, key, value []byte) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddSeriesList adds a list of series to the log file in bulk.
|
// AddSeriesList adds a list of series to the log file in bulk.
|
||||||
func (f *LogFile) AddSeriesList(seriesSet *tsdb.SeriesIDSet, names [][]byte, tagsSlice []models.Tags) error {
|
func (f *LogFile) AddSeriesList(seriesSet *tsdb.SeriesIDSet, names [][]byte, tagsSlice []models.Tags) ([]uint64, error) {
|
||||||
seriesIDs, err := f.sfile.CreateSeriesListIfNotExists(names, tagsSlice)
|
seriesIDs, err := f.sfile.CreateSeriesListIfNotExists(names, tagsSlice)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var writeRequired bool
|
var writeRequired bool
|
||||||
|
@ -521,6 +521,7 @@ func (f *LogFile) AddSeriesList(seriesSet *tsdb.SeriesIDSet, names [][]byte, tag
|
||||||
for i := range names {
|
for i := range names {
|
||||||
if seriesSet.ContainsNoLock(seriesIDs[i]) {
|
if seriesSet.ContainsNoLock(seriesIDs[i]) {
|
||||||
// We don't need to allocate anything for this series.
|
// We don't need to allocate anything for this series.
|
||||||
|
seriesIDs[i] = 0
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
writeRequired = true
|
writeRequired = true
|
||||||
|
@ -530,7 +531,7 @@ func (f *LogFile) AddSeriesList(seriesSet *tsdb.SeriesIDSet, names [][]byte, tag
|
||||||
|
|
||||||
// Exit if all series already exist.
|
// Exit if all series already exist.
|
||||||
if !writeRequired {
|
if !writeRequired {
|
||||||
return nil
|
return seriesIDs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
f.mu.Lock()
|
f.mu.Lock()
|
||||||
|
@ -539,21 +540,25 @@ func (f *LogFile) AddSeriesList(seriesSet *tsdb.SeriesIDSet, names [][]byte, tag
|
||||||
seriesSet.Lock()
|
seriesSet.Lock()
|
||||||
defer seriesSet.Unlock()
|
defer seriesSet.Unlock()
|
||||||
|
|
||||||
for i := range entries {
|
for i := range entries { // NB - this doesn't evaluate all series ids returned from series file.
|
||||||
entry := &entries[i]
|
entry := &entries[i]
|
||||||
if seriesSet.ContainsNoLock(entry.SeriesID) {
|
if seriesSet.ContainsNoLock(entry.SeriesID) {
|
||||||
// We don't need to allocate anything for this series.
|
// We don't need to allocate anything for this series.
|
||||||
|
seriesIDs[i] = 0
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if err := f.appendEntry(entry); err != nil {
|
if err := f.appendEntry(entry); err != nil {
|
||||||
return err
|
return nil, err
|
||||||
}
|
}
|
||||||
f.execEntry(entry)
|
f.execEntry(entry)
|
||||||
seriesSet.AddNoLock(entry.SeriesID)
|
seriesSet.AddNoLock(entry.SeriesID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flush buffer and sync to disk.
|
// Flush buffer and sync to disk.
|
||||||
return f.FlushAndSync()
|
if err := f.FlushAndSync(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return seriesIDs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteSeriesID adds a tombstone for a series id.
|
// DeleteSeriesID adds a tombstone for a series id.
|
||||||
|
|
|
@ -7,12 +7,15 @@ import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime/pprof"
|
"runtime/pprof"
|
||||||
"sort"
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/influxdata/influxdb/pkg/slices"
|
||||||
|
|
||||||
"github.com/influxdata/influxdb/models"
|
"github.com/influxdata/influxdb/models"
|
||||||
"github.com/influxdata/influxdb/pkg/bloom"
|
"github.com/influxdata/influxdb/pkg/bloom"
|
||||||
"github.com/influxdata/influxdb/tsdb"
|
"github.com/influxdata/influxdb/tsdb"
|
||||||
|
@ -29,18 +32,58 @@ func TestLogFile_AddSeriesList(t *testing.T) {
|
||||||
seriesSet := tsdb.NewSeriesIDSet()
|
seriesSet := tsdb.NewSeriesIDSet()
|
||||||
|
|
||||||
// Add test data.
|
// Add test data.
|
||||||
if err := f.AddSeriesList(seriesSet, [][]byte{
|
ids, err := f.AddSeriesList(seriesSet,
|
||||||
[]byte("mem"),
|
slices.StringsToBytes("cpu", "mem"),
|
||||||
[]byte("cpu"),
|
[]models.Tags{
|
||||||
[]byte("cpu"),
|
models.NewTags(map[string]string{"region": "us-east"}),
|
||||||
}, []models.Tags{
|
models.NewTags(map[string]string{"host": "serverA"}),
|
||||||
{{Key: []byte("host"), Value: []byte("serverA")}},
|
},
|
||||||
{{Key: []byte("region"), Value: []byte("us-east")}},
|
)
|
||||||
{{Key: []byte("region"), Value: []byte("us-west")}},
|
|
||||||
}); err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returned series ids should match those in the seriesSet.
|
||||||
|
other := tsdb.NewSeriesIDSet(ids...)
|
||||||
|
if !other.Equals(seriesSet) {
|
||||||
|
t.Fatalf("got series ids %s, expected %s", other, seriesSet)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the same series again with a new one.
|
||||||
|
ids, err = f.AddSeriesList(seriesSet,
|
||||||
|
slices.StringsToBytes("cpu", "mem"),
|
||||||
|
[]models.Tags{
|
||||||
|
models.NewTags(map[string]string{"region": "us-west"}),
|
||||||
|
models.NewTags(map[string]string{"host": "serverA"}),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if got, exp := len(ids), 2; got != exp {
|
||||||
|
t.Fatalf("got %d series ids, expected %d", got, exp)
|
||||||
|
} else if got := ids[0]; got == 0 {
|
||||||
|
t.Error("series id was 0, expected it not to be")
|
||||||
|
} else if got := ids[1]; got != 0 {
|
||||||
|
t.Errorf("got series id %d, expected 0", got)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add only the same series IDs.
|
||||||
|
ids, err = f.AddSeriesList(seriesSet,
|
||||||
|
slices.StringsToBytes("cpu", "mem"),
|
||||||
|
[]models.Tags{
|
||||||
|
models.NewTags(map[string]string{"region": "us-west"}),
|
||||||
|
models.NewTags(map[string]string{"host": "serverA"}),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
if got, exp := ids, make([]uint64, 2); !reflect.DeepEqual(got, exp) {
|
||||||
|
t.Fatalf("got ids %v, expected %v", got, exp)
|
||||||
|
}
|
||||||
|
|
||||||
// Verify data.
|
// Verify data.
|
||||||
itr := f.MeasurementIterator()
|
itr := f.MeasurementIterator()
|
||||||
if e := itr.Next(); e == nil || string(e.Name()) != "cpu" {
|
if e := itr.Next(); e == nil || string(e.Name()) != "cpu" {
|
||||||
|
@ -82,7 +125,7 @@ func TestLogFile_SeriesStoredInOrder(t *testing.T) {
|
||||||
tv := fmt.Sprintf("server-%d", rand.Intn(50)) // Encourage adding duplicate series.
|
tv := fmt.Sprintf("server-%d", rand.Intn(50)) // Encourage adding duplicate series.
|
||||||
tvm[tv] = struct{}{}
|
tvm[tv] = struct{}{}
|
||||||
|
|
||||||
if err := f.AddSeriesList(seriesSet, [][]byte{
|
if _, err := f.AddSeriesList(seriesSet, [][]byte{
|
||||||
[]byte("mem"),
|
[]byte("mem"),
|
||||||
[]byte("cpu"),
|
[]byte("cpu"),
|
||||||
}, []models.Tags{
|
}, []models.Tags{
|
||||||
|
@ -133,7 +176,7 @@ func TestLogFile_DeleteMeasurement(t *testing.T) {
|
||||||
seriesSet := tsdb.NewSeriesIDSet()
|
seriesSet := tsdb.NewSeriesIDSet()
|
||||||
|
|
||||||
// Add test data.
|
// Add test data.
|
||||||
if err := f.AddSeriesList(seriesSet, [][]byte{
|
if _, err := f.AddSeriesList(seriesSet, [][]byte{
|
||||||
[]byte("mem"),
|
[]byte("mem"),
|
||||||
[]byte("cpu"),
|
[]byte("cpu"),
|
||||||
[]byte("cpu"),
|
[]byte("cpu"),
|
||||||
|
@ -172,7 +215,7 @@ func TestLogFile_Open(t *testing.T) {
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
// Add test data & close.
|
// Add test data & close.
|
||||||
if err := f.AddSeriesList(seriesSet, [][]byte{[]byte("cpu"), []byte("mem")}, []models.Tags{{{}}, {{}}}); err != nil {
|
if _, err := f.AddSeriesList(seriesSet, [][]byte{[]byte("cpu"), []byte("mem")}, []models.Tags{{{}}, {{}}}); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
} else if err := f.LogFile.Close(); err != nil {
|
} else if err := f.LogFile.Close(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -200,7 +243,7 @@ func TestLogFile_Open(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add more data & reopen.
|
// Add more data & reopen.
|
||||||
if err := f.AddSeriesList(seriesSet, [][]byte{[]byte("disk")}, []models.Tags{{{}}}); err != nil {
|
if _, err := f.AddSeriesList(seriesSet, [][]byte{[]byte("disk")}, []models.Tags{{{}}}); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
} else if err := f.Reopen(); err != nil {
|
} else if err := f.Reopen(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -232,7 +275,7 @@ func TestLogFile_Open(t *testing.T) {
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
// Add test data & close.
|
// Add test data & close.
|
||||||
if err := f.AddSeriesList(seriesSet, [][]byte{[]byte("cpu"), []byte("mem")}, []models.Tags{{{}}, {{}}}); err != nil {
|
if _, err := f.AddSeriesList(seriesSet, [][]byte{[]byte("cpu"), []byte("mem")}, []models.Tags{{{}}, {{}}}); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
} else if err := f.LogFile.Close(); err != nil {
|
} else if err := f.LogFile.Close(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
@ -313,7 +356,7 @@ func CreateLogFile(sfile *tsdb.SeriesFile, series []Series) (*LogFile, error) {
|
||||||
f := MustOpenLogFile(sfile)
|
f := MustOpenLogFile(sfile)
|
||||||
seriesSet := tsdb.NewSeriesIDSet()
|
seriesSet := tsdb.NewSeriesIDSet()
|
||||||
for _, serie := range series {
|
for _, serie := range series {
|
||||||
if err := f.AddSeriesList(seriesSet, [][]byte{serie.Name}, []models.Tags{serie.Tags}); err != nil {
|
if _, err := f.AddSeriesList(seriesSet, [][]byte{serie.Name}, []models.Tags{serie.Tags}); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -338,7 +381,7 @@ func GenerateLogFile(sfile *tsdb.SeriesFile, measurementN, tagN, valueN int) (*L
|
||||||
value := []byte(fmt.Sprintf("value%d", (j / pow(valueN, k) % valueN)))
|
value := []byte(fmt.Sprintf("value%d", (j / pow(valueN, k) % valueN)))
|
||||||
tags = append(tags, models.NewTag(key, value))
|
tags = append(tags, models.NewTag(key, value))
|
||||||
}
|
}
|
||||||
if err := f.AddSeriesList(seriesSet, [][]byte{name}, []models.Tags{tags}); err != nil {
|
if _, err := f.AddSeriesList(seriesSet, [][]byte{name}, []models.Tags{tags}); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -385,7 +428,7 @@ func benchmarkLogFile_AddSeries(b *testing.B, measurementN, seriesKeyN, seriesVa
|
||||||
|
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
for _, d := range data {
|
for _, d := range data {
|
||||||
if err := f.AddSeriesList(seriesSet, [][]byte{d.Name}, []models.Tags{d.Tags}); err != nil {
|
if _, err := f.AddSeriesList(seriesSet, [][]byte{d.Name}, []models.Tags{d.Tags}); err != nil {
|
||||||
b.Fatal(err)
|
b.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -417,7 +460,7 @@ func BenchmarkLogFile_WriteTo(b *testing.B) {
|
||||||
|
|
||||||
// Initialize log file with series data.
|
// Initialize log file with series data.
|
||||||
for i := 0; i < seriesN; i++ {
|
for i := 0; i < seriesN; i++ {
|
||||||
if err := f.AddSeriesList(
|
if _, err := f.AddSeriesList(
|
||||||
seriesSet,
|
seriesSet,
|
||||||
[][]byte{[]byte("cpu")},
|
[][]byte{[]byte("cpu")},
|
||||||
[]models.Tags{{
|
[]models.Tags{{
|
||||||
|
|
|
@ -655,7 +655,8 @@ func (p *Partition) createSeriesListIfNotExists(names [][]byte, tagsSlice []mode
|
||||||
|
|
||||||
// Ensure fileset cannot change during insert.
|
// Ensure fileset cannot change during insert.
|
||||||
p.mu.RLock()
|
p.mu.RLock()
|
||||||
if err := p.activeLogFile.AddSeriesList(p.seriesIDSet, names, tagsSlice); err != nil {
|
// Insert series into log file.
|
||||||
|
if _, err := p.activeLogFile.AddSeriesList(p.seriesIDSet, names, tagsSlice); err != nil {
|
||||||
p.mu.RUnlock()
|
p.mu.RUnlock()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue