influxdb/tsdb/tsm1/engine_delete_prefix_test.go

122 lines
3.6 KiB
Go
Raw Normal View History

2019-01-09 17:56:10 +00:00
package tsm1_test
import (
"bytes"
"context"
2019-01-09 17:56:10 +00:00
"reflect"
"testing"
"github.com/influxdata/influxdb/models"
"github.com/influxdata/influxdb/tsdb/tsm1"
2019-01-09 17:56:10 +00:00
)
func TestEngine_DeletePrefix(t *testing.T) {
2019-01-09 17:56:10 +00:00
// Create a few points.
2019-04-24 16:12:15 +00:00
p1 := MustParsePointString("cpu,host=0 value=1.1 6", "mm0")
p2 := MustParsePointString("cpu,host=A value=1.2 2", "mm0")
p3 := MustParsePointString("cpu,host=A value=1.3 3", "mm0")
p4 := MustParsePointString("cpu,host=B value=1.3 4", "mm0")
p5 := MustParsePointString("cpu,host=B value=1.3 5", "mm0")
p6 := MustParsePointString("cpu,host=C value=1.3 1", "mm0")
p7 := MustParsePointString("mem,host=C value=1.3 1", "mm1")
p8 := MustParsePointString("disk,host=C value=1.3 1", "mm2")
2019-01-09 17:56:10 +00:00
test: add benchmark to track cache deletion perf Benchmarks using a 24T / 32GB / NVME disk machine: goos: linux goarch: amd64 pkg: github.com/influxdata/influxdb/tsdb/tsm1 BenchmarkEngine_DeletePrefixRange_Cache/exists-24 20 280039668 ns/op 64073374 B/op 711421 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/exists-24 30 271810284 ns/op 64073207 B/op 711420 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/exists-24 30 263464797 ns/op 64072589 B/op 711415 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/exists-24 30 269460489 ns/op 64073344 B/op 711420 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/exists-24 30 268319443 ns/op 64073947 B/op 711425 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/exists-24 30 254945449 ns/op 64073463 B/op 711421 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/exists-24 30 270202990 ns/op 65616337 B/op 724440 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/exists-24 30 274113444 ns/op 64074764 B/op 711435 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/exists-24 30 264234897 ns/op 64073748 B/op 711428 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/exists-24 30 264406196 ns/op 64073797 B/op 711429 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/not_exists-24 30 250130623 ns/op 59202124 B/op 700036 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/not_exists-24 30 255092042 ns/op 59552365 B/op 706287 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/not_exists-24 30 274121068 ns/op 59202753 B/op 700043 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/not_exists-24 30 273088065 ns/op 59202702 B/op 700043 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/not_exists-24 30 264184087 ns/op 59202724 B/op 700043 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/not_exists-24 30 268075364 ns/op 59202718 B/op 700043 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/not_exists-24 30 265067057 ns/op 59202709 B/op 700043 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/not_exists-24 30 254749976 ns/op 60118957 B/op 701435 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/not_exists-24 30 266953837 ns/op 59203376 B/op 700051 allocs/op BenchmarkEngine_DeletePrefixRange_Cache/not_exists-24 30 275083559 ns/op 59203329 B/op 700050 allocs/op PASS ok github.com/influxdata/influxdb/tsdb/tsm1 261.273s
2019-08-29 20:51:24 +00:00
e, err := NewEngine(tsm1.NewConfig())
2019-01-09 17:56:10 +00:00
if err != nil {
t.Fatal(err)
}
if err := e.Open(context.Background()); err != nil {
2019-01-09 17:56:10 +00:00
t.Fatal(err)
}
defer e.Close()
if err := e.writePoints(p1, p2, p3, p4, p5, p6, p7, p8); err != nil {
t.Fatalf("failed to write points: %s", err.Error())
}
if err := e.WriteSnapshot(context.Background(), tsm1.CacheStatusColdNoWrites); err != nil {
2019-01-09 17:56:10 +00:00
t.Fatalf("failed to snapshot: %s", err.Error())
}
keys := e.FileStore.Keys()
if exp, got := 6, len(keys); exp != got {
t.Fatalf("series count mismatch: exp %v, got %v", exp, got)
}
if err := e.DeletePrefixRange(context.Background(), []byte("mm0"), 0, 3, nil); err != nil {
2019-01-09 17:56:10 +00:00
t.Fatalf("failed to delete series: %v", err)
}
keys = e.FileStore.Keys()
if exp, got := 4, len(keys); exp != got {
t.Fatalf("series count mismatch: exp %v, got %v", exp, got)
}
exp := map[string]byte{
2019-04-24 16:12:15 +00:00
"mm0,\x00=cpu,host=0,\xff=value#!~#value": 0,
"mm0,\x00=cpu,host=B,\xff=value#!~#value": 0,
"mm1,\x00=mem,host=C,\xff=value#!~#value": 0,
"mm2,\x00=disk,host=C,\xff=value#!~#value": 0,
2019-01-09 17:56:10 +00:00
}
if !reflect.DeepEqual(keys, exp) {
t.Fatalf("unexpected series in file store: %v != %v", keys, exp)
}
// Check that the series still exists in the index
2019-04-24 16:12:15 +00:00
iter, err := e.index.MeasurementSeriesIDIterator([]byte("mm0"))
2019-01-09 17:56:10 +00:00
if err != nil {
t.Fatalf("iterator error: %v", err)
}
defer iter.Close()
elem, err := iter.Next()
if err != nil {
t.Fatal(err)
}
if elem.SeriesID.IsZero() {
t.Fatalf("series index mismatch: EOF, exp 2 series")
}
// Lookup series.
name, tags := e.sfile.Series(elem.SeriesID)
2019-04-24 16:12:15 +00:00
if got, exp := name, []byte("mm0"); !bytes.Equal(got, exp) {
2019-01-09 17:56:10 +00:00
t.Fatalf("series mismatch: got %s, exp %s", got, exp)
}
2019-04-24 16:12:15 +00:00
if !tags.Equal(models.NewTags(map[string]string{models.FieldKeyTagKey: "value", models.MeasurementTagKey: "cpu", "host": "0"})) && !tags.Equal(models.NewTags(map[string]string{models.FieldKeyTagKey: "value", models.MeasurementTagKey: "cpu", "host": "B"})) {
2019-01-09 17:56:10 +00:00
t.Fatalf(`series mismatch: got %s, exp either "host=0" or "host=B"`, tags)
}
iter.Close()
// Deleting remaining series should remove them from the series.
if err := e.DeletePrefixRange(context.Background(), []byte("mm0"), 0, 9, nil); err != nil {
2019-01-09 17:56:10 +00:00
t.Fatalf("failed to delete series: %v", err)
}
keys = e.FileStore.Keys()
if exp, got := 2, len(keys); exp != got {
t.Fatalf("series count mismatch: exp %v, got %v", exp, got)
}
exp = map[string]byte{
2019-04-24 16:12:15 +00:00
"mm1,\x00=mem,host=C,\xff=value#!~#value": 0,
"mm2,\x00=disk,host=C,\xff=value#!~#value": 0,
2019-01-09 17:56:10 +00:00
}
if !reflect.DeepEqual(keys, exp) {
t.Fatalf("unexpected series in file store: %v != %v", keys, exp)
}
2019-04-24 16:12:15 +00:00
if iter, err = e.index.MeasurementSeriesIDIterator([]byte("mm0")); err != nil {
2019-01-09 17:56:10 +00:00
t.Fatalf("iterator error: %v", err)
}
if iter != nil {
defer iter.Close()
if elem, err = iter.Next(); err != nil {
t.Fatal(err)
}
if !elem.SeriesID.IsZero() {
t.Fatalf("got an undeleted series id, but series should be dropped from index")
}
2019-01-09 17:56:10 +00:00
}
}