229 lines
4.5 KiB
Go
229 lines
4.5 KiB
Go
package tsm1_test
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/influxdata/influxdb/tsdb/engine/tsm1"
|
|
)
|
|
|
|
func TestDigest_None(t *testing.T) {
|
|
dir := MustTempDir()
|
|
dataDir := filepath.Join(dir, "data")
|
|
if err := os.Mkdir(dataDir, 0755); err != nil {
|
|
t.Fatalf("create data dir: %v", err)
|
|
}
|
|
|
|
df := MustTempFile(dir)
|
|
|
|
if err := tsm1.Digest(dir, df); err != nil {
|
|
t.Fatalf("digest error: %v", err)
|
|
}
|
|
|
|
df, err := os.Open(df.Name())
|
|
if err != nil {
|
|
t.Fatalf("open error: %v", err)
|
|
}
|
|
|
|
r, err := tsm1.NewDigestReader(df)
|
|
if err != nil {
|
|
t.Fatalf("NewDigestReader error: %v", err)
|
|
}
|
|
defer r.Close()
|
|
|
|
var count int
|
|
for {
|
|
_, _, err := r.ReadTimeSpan()
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
|
|
count++
|
|
}
|
|
|
|
if got, exp := count, 0; got != exp {
|
|
t.Fatalf("count mismatch: got %v, exp %v", got, exp)
|
|
}
|
|
}
|
|
|
|
func TestDigest_One(t *testing.T) {
|
|
dir := MustTempDir()
|
|
dataDir := filepath.Join(dir, "data")
|
|
if err := os.Mkdir(dataDir, 0755); err != nil {
|
|
t.Fatalf("create data dir: %v", err)
|
|
}
|
|
|
|
a1 := tsm1.NewValue(1, 1.1)
|
|
writes := map[string][]tsm1.Value{
|
|
"cpu,host=A#!~#value": []tsm1.Value{a1},
|
|
}
|
|
MustWriteTSM(dir, 1, writes)
|
|
|
|
df := MustTempFile(dir)
|
|
|
|
if err := tsm1.Digest(dir, df); err != nil {
|
|
t.Fatalf("digest error: %v", err)
|
|
}
|
|
|
|
df, err := os.Open(df.Name())
|
|
if err != nil {
|
|
t.Fatalf("open error: %v", err)
|
|
}
|
|
|
|
r, err := tsm1.NewDigestReader(df)
|
|
if err != nil {
|
|
t.Fatalf("NewDigestReader error: %v", err)
|
|
}
|
|
defer r.Close()
|
|
|
|
var count int
|
|
for {
|
|
key, _, err := r.ReadTimeSpan()
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
|
|
if got, exp := key, "cpu,host=A#!~#value"; got != exp {
|
|
t.Fatalf("key mismatch: got %v, exp %v", got, exp)
|
|
}
|
|
|
|
count++
|
|
}
|
|
|
|
if got, exp := count, 1; got != exp {
|
|
t.Fatalf("count mismatch: got %v, exp %v", got, exp)
|
|
}
|
|
}
|
|
|
|
func TestDigest_TimeFilter(t *testing.T) {
|
|
dir := MustTempDir()
|
|
dataDir := filepath.Join(dir, "data")
|
|
if err := os.Mkdir(dataDir, 0755); err != nil {
|
|
t.Fatalf("create data dir: %v", err)
|
|
}
|
|
|
|
a1 := tsm1.NewValue(1, 1.1)
|
|
writes := map[string][]tsm1.Value{
|
|
"cpu,host=A#!~#value": []tsm1.Value{a1},
|
|
}
|
|
MustWriteTSM(dir, 1, writes)
|
|
|
|
a2 := tsm1.NewValue(2, 2.1)
|
|
writes = map[string][]tsm1.Value{
|
|
"cpu,host=A#!~#value": []tsm1.Value{a2},
|
|
}
|
|
MustWriteTSM(dir, 2, writes)
|
|
|
|
a3 := tsm1.NewValue(3, 3.1)
|
|
writes = map[string][]tsm1.Value{
|
|
"cpu,host=A#!~#value": []tsm1.Value{a3},
|
|
}
|
|
MustWriteTSM(dir, 3, writes)
|
|
|
|
df := MustTempFile(dir)
|
|
|
|
if err := tsm1.DigestWithOptions(dir, tsm1.DigestOptions{MinTime: 2, MaxTime: 2}, df); err != nil {
|
|
t.Fatalf("digest error: %v", err)
|
|
}
|
|
|
|
df, err := os.Open(df.Name())
|
|
if err != nil {
|
|
t.Fatalf("open error: %v", err)
|
|
}
|
|
|
|
r, err := tsm1.NewDigestReader(df)
|
|
if err != nil {
|
|
t.Fatalf("NewDigestReader error: %v", err)
|
|
}
|
|
defer r.Close()
|
|
|
|
var count int
|
|
for {
|
|
key, ts, err := r.ReadTimeSpan()
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
|
|
if got, exp := key, "cpu,host=A#!~#value"; got != exp {
|
|
t.Fatalf("key mismatch: got %v, exp %v", got, exp)
|
|
}
|
|
|
|
for _, tr := range ts.Ranges {
|
|
if got, exp := tr.Max, int64(2); got != exp {
|
|
t.Fatalf("min time not filtered: got %v, exp %v", got, exp)
|
|
}
|
|
}
|
|
|
|
count++
|
|
}
|
|
|
|
if got, exp := count, 1; got != exp {
|
|
t.Fatalf("count mismatch: got %v, exp %v", got, exp)
|
|
}
|
|
}
|
|
|
|
func TestDigest_KeyFilter(t *testing.T) {
|
|
dir := MustTempDir()
|
|
dataDir := filepath.Join(dir, "data")
|
|
if err := os.Mkdir(dataDir, 0755); err != nil {
|
|
t.Fatalf("create data dir: %v", err)
|
|
}
|
|
|
|
a1 := tsm1.NewValue(1, 1.1)
|
|
writes := map[string][]tsm1.Value{
|
|
"cpu,host=A#!~#value": []tsm1.Value{a1},
|
|
}
|
|
MustWriteTSM(dir, 1, writes)
|
|
|
|
a2 := tsm1.NewValue(2, 2.1)
|
|
writes = map[string][]tsm1.Value{
|
|
"cpu,host=B#!~#value": []tsm1.Value{a2},
|
|
}
|
|
MustWriteTSM(dir, 2, writes)
|
|
|
|
a3 := tsm1.NewValue(3, 3.1)
|
|
writes = map[string][]tsm1.Value{
|
|
"cpu,host=C#!~#value": []tsm1.Value{a3},
|
|
}
|
|
MustWriteTSM(dir, 3, writes)
|
|
|
|
df := MustTempFile(dir)
|
|
|
|
if err := tsm1.DigestWithOptions(dir, tsm1.DigestOptions{
|
|
MinKey: []byte("cpu,host=B#!~#value"),
|
|
MaxKey: []byte("cpu,host=B#!~#value")}, df); err != nil {
|
|
t.Fatalf("digest error: %v", err)
|
|
}
|
|
|
|
df, err := os.Open(df.Name())
|
|
if err != nil {
|
|
t.Fatalf("open error: %v", err)
|
|
}
|
|
|
|
r, err := tsm1.NewDigestReader(df)
|
|
if err != nil {
|
|
t.Fatalf("NewDigestReader error: %v", err)
|
|
}
|
|
defer r.Close()
|
|
|
|
var count int
|
|
for {
|
|
key, _, err := r.ReadTimeSpan()
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
|
|
if got, exp := key, "cpu,host=B#!~#value"; got != exp {
|
|
t.Fatalf("key mismatch: got %v, exp %v", got, exp)
|
|
}
|
|
|
|
count++
|
|
}
|
|
|
|
if got, exp := count, 1; got != exp {
|
|
t.Fatalf("count mismatch: got %v, exp %v", got, exp)
|
|
}
|
|
}
|