2021-01-21 10:01:29 +08:00
|
|
|
package masterservice
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"math/rand"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
etcdkv "github.com/zilliztech/milvus-distributed/internal/kv/etcd"
|
|
|
|
"github.com/zilliztech/milvus-distributed/internal/proto/commonpb"
|
|
|
|
"github.com/zilliztech/milvus-distributed/internal/proto/datapb"
|
|
|
|
pb "github.com/zilliztech/milvus-distributed/internal/proto/etcdpb"
|
|
|
|
"github.com/zilliztech/milvus-distributed/internal/proto/schemapb"
|
|
|
|
"go.etcd.io/etcd/clientv3"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestMetaTable(t *testing.T) {
|
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
randVal := rand.Int()
|
2021-01-23 17:56:57 +08:00
|
|
|
Params.Init()
|
|
|
|
etcdAddr := Params.EtcdAddress
|
2021-01-21 10:01:29 +08:00
|
|
|
rootPath := fmt.Sprintf("/test/meta/%d", randVal)
|
|
|
|
|
|
|
|
etcdCli, err := clientv3.New(clientv3.Config{Endpoints: []string{etcdAddr}})
|
|
|
|
assert.Nil(t, err)
|
|
|
|
ekv := etcdkv.NewEtcdKV(etcdCli, rootPath)
|
|
|
|
assert.NotNil(t, ekv)
|
|
|
|
mt, err := NewMetaTable(ekv)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
collInfo := &pb.CollectionInfo{
|
|
|
|
ID: 1,
|
|
|
|
Schema: &schemapb.CollectionSchema{
|
|
|
|
Name: "testColl",
|
|
|
|
Description: "",
|
|
|
|
AutoID: false,
|
|
|
|
Fields: []*schemapb.FieldSchema{
|
|
|
|
{
|
|
|
|
FieldID: 110,
|
|
|
|
Name: "field110",
|
|
|
|
IsPrimaryKey: false,
|
|
|
|
Description: "",
|
|
|
|
DataType: 0,
|
|
|
|
TypeParams: []*commonpb.KeyValuePair{
|
|
|
|
{
|
|
|
|
Key: "field110-k1",
|
|
|
|
Value: "field110-v1",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Key: "field110-k2",
|
|
|
|
Value: "field110-v2",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
IndexParams: []*commonpb.KeyValuePair{
|
|
|
|
{
|
|
|
|
Key: "field110-i1",
|
|
|
|
Value: "field110-v1",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Key: "field110-i2",
|
|
|
|
Value: "field110-v2",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
CreateTime: 0,
|
|
|
|
PartitionIDs: nil,
|
|
|
|
}
|
|
|
|
partInfo := &pb.PartitionInfo{
|
|
|
|
PartitionName: "testPart",
|
|
|
|
PartitionID: 10,
|
|
|
|
SegmentIDs: nil,
|
|
|
|
}
|
|
|
|
|
|
|
|
t.Run("add collection", func(t *testing.T) {
|
|
|
|
err = mt.AddCollection(collInfo, partInfo)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
collMeta, err := mt.GetCollectionByName("testColl")
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, collMeta.PartitionIDs[0], int64(10))
|
|
|
|
assert.Equal(t, len(collMeta.PartitionIDs), 1)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("add segment", func(t *testing.T) {
|
|
|
|
seg := &datapb.SegmentInfo{
|
|
|
|
SegmentID: 100,
|
|
|
|
CollectionID: 1,
|
|
|
|
PartitionID: 10,
|
|
|
|
}
|
|
|
|
assert.Nil(t, mt.AddSegment(seg))
|
|
|
|
assert.NotNil(t, mt.AddSegment(seg))
|
|
|
|
seg.SegmentID = 101
|
|
|
|
seg.CollectionID = 2
|
|
|
|
assert.NotNil(t, mt.AddSegment(seg))
|
|
|
|
seg.CollectionID = 1
|
|
|
|
seg.PartitionID = 11
|
|
|
|
assert.NotNil(t, mt.AddSegment(seg))
|
|
|
|
seg.PartitionID = 10
|
|
|
|
assert.Nil(t, mt.AddSegment(seg))
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("add segment index", func(t *testing.T) {
|
|
|
|
seg := pb.SegmentIndexInfo{
|
|
|
|
SegmentID: 100,
|
|
|
|
FieldID: 110,
|
|
|
|
IndexID: 200,
|
|
|
|
BuildID: 201,
|
|
|
|
}
|
|
|
|
idx := pb.IndexInfo{
|
|
|
|
IndexName: "idx200",
|
|
|
|
IndexID: 200,
|
|
|
|
IndexParams: []*commonpb.KeyValuePair{
|
|
|
|
{
|
|
|
|
Key: "field110-i1",
|
|
|
|
Value: "field110-v1",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Key: "field110-i2",
|
|
|
|
Value: "field110-v2",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
err := mt.AddIndex(&seg, &idx)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.NotNil(t, mt.AddIndex(&seg, &idx))
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("get not indexed segments", func(t *testing.T) {
|
|
|
|
params := []*commonpb.KeyValuePair{
|
|
|
|
{
|
|
|
|
Key: "field110-i1",
|
|
|
|
Value: "field110-v1",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Key: "field110-i2",
|
|
|
|
Value: "field110-v2",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
tparams := []*commonpb.KeyValuePair{
|
|
|
|
{
|
|
|
|
Key: "field110-k1",
|
|
|
|
Value: "field110-v1",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Key: "field110-k2",
|
|
|
|
Value: "field110-v2",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
_, field, err := mt.GetNotIndexedSegments("collTest", "field110", params)
|
|
|
|
assert.NotNil(t, err)
|
|
|
|
seg, field, err := mt.GetNotIndexedSegments("testColl", "field110", params)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, len(seg), 1)
|
|
|
|
assert.Equal(t, seg[0], int64(101))
|
|
|
|
assert.True(t, EqualKeyPairArray(field.TypeParams, tparams))
|
|
|
|
|
|
|
|
params = []*commonpb.KeyValuePair{
|
|
|
|
{
|
|
|
|
Key: "field110-i1",
|
|
|
|
Value: "field110-v1",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
seg, field, err = mt.GetNotIndexedSegments("testColl", "field110", params)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, len(seg), 2)
|
|
|
|
assert.Equal(t, seg[0], int64(100))
|
|
|
|
assert.Equal(t, seg[1], int64(101))
|
|
|
|
assert.True(t, EqualKeyPairArray(field.TypeParams, tparams))
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("get index by name", func(t *testing.T) {
|
|
|
|
idx, err := mt.GetIndexByName("testColl", "field110", "idx200")
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, len(idx), 1)
|
|
|
|
assert.Equal(t, idx[0].IndexID, int64(200))
|
|
|
|
params := []*commonpb.KeyValuePair{
|
|
|
|
{
|
|
|
|
Key: "field110-i1",
|
|
|
|
Value: "field110-v1",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Key: "field110-i2",
|
|
|
|
Value: "field110-v2",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
assert.True(t, EqualKeyPairArray(idx[0].IndexParams, params))
|
|
|
|
|
|
|
|
_, err = mt.GetIndexByName("testColl", "field111", "idx200")
|
|
|
|
assert.NotNil(t, err)
|
|
|
|
idx, err = mt.GetIndexByName("testColl", "field110", "idx201")
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Zero(t, len(idx))
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|