package integration import ( "context" "testing" "time" "github.com/golang/protobuf/proto" "github.com/stretchr/testify/assert" "go.uber.org/zap" "github.com/milvus-io/milvus-proto/go-api/commonpb" "github.com/milvus-io/milvus-proto/go-api/milvuspb" "github.com/milvus-io/milvus-proto/go-api/schemapb" "github.com/milvus-io/milvus/pkg/log" "github.com/milvus-io/milvus/pkg/util/distance" "github.com/milvus-io/milvus/pkg/util/funcutil" ) func TestGetIndexStatistics(t *testing.T) { ctx := context.Background() c, err := StartMiniCluster(ctx) assert.NoError(t, err) err = c.Start() assert.NoError(t, err) defer c.Stop() assert.NoError(t, err) prefix := "TestGetIndexStatistics" dbName := "" collectionName := prefix + funcutil.GenRandomStr() dim := 128 rowNum := 3000 schema := constructSchema(collectionName, dim, true) marshaledSchema, err := proto.Marshal(schema) assert.NoError(t, err) createCollectionStatus, err := c.proxy.CreateCollection(ctx, &milvuspb.CreateCollectionRequest{ DbName: dbName, CollectionName: collectionName, Schema: marshaledSchema, ShardsNum: 2, }) assert.NoError(t, err) if createCollectionStatus.GetErrorCode() != commonpb.ErrorCode_Success { log.Warn("createCollectionStatus fail reason", zap.String("reason", createCollectionStatus.GetReason())) } assert.Equal(t, createCollectionStatus.GetErrorCode(), commonpb.ErrorCode_Success) fVecColumn := newFloatVectorFieldData(floatVecField, rowNum, dim) hashKeys := generateHashKeys(rowNum) insertResult, err := c.proxy.Insert(ctx, &milvuspb.InsertRequest{ DbName: dbName, CollectionName: collectionName, FieldsData: []*schemapb.FieldData{fVecColumn}, HashKeys: hashKeys, NumRows: uint32(rowNum), }) assert.NoError(t, err) assert.Equal(t, insertResult.GetStatus().GetErrorCode(), commonpb.ErrorCode_Success) // flush flushResp, err := c.proxy.Flush(ctx, &milvuspb.FlushRequest{ DbName: dbName, CollectionNames: []string{collectionName}, }) assert.NoError(t, err) segmentIDs, has := flushResp.GetCollSegIDs()[collectionName] ids := segmentIDs.GetData() assert.NotEmpty(t, segmentIDs) assert.Equal(t, true, has) waitingForFlush(ctx, c, ids) // create index indexName := "_default" createIndexStatus, err := c.proxy.CreateIndex(ctx, &milvuspb.CreateIndexRequest{ CollectionName: collectionName, FieldName: floatVecField, IndexName: "_default", ExtraParams: constructIndexParam(dim, IndexFaissIvfFlat, distance.L2), }) if createIndexStatus.GetErrorCode() != commonpb.ErrorCode_Success { log.Warn("createIndexStatus fail reason", zap.String("reason", createIndexStatus.GetReason())) } assert.NoError(t, err) assert.Equal(t, commonpb.ErrorCode_Success, createIndexStatus.GetErrorCode()) getIndexStatisticsResponse, err := c.proxy.GetIndexStatistics(ctx, &milvuspb.GetIndexStatisticsRequest{ CollectionName: collectionName, IndexName: indexName, }) assert.NoError(t, err) indexInfos := getIndexStatisticsResponse.GetIndexDescriptions() assert.Equal(t, 1, len(indexInfos)) assert.Equal(t, int64(0), indexInfos[0].IndexedRows) assert.Equal(t, int64(3000), indexInfos[0].TotalRows) insertResult2, err := c.proxy.Insert(ctx, &milvuspb.InsertRequest{ DbName: dbName, CollectionName: collectionName, FieldsData: []*schemapb.FieldData{fVecColumn}, HashKeys: hashKeys, NumRows: uint32(rowNum), }) assert.NoError(t, err) _, err = c.proxy.Flush(ctx, &milvuspb.FlushRequest{ DbName: dbName, CollectionNames: []string{collectionName}, }) assert.NoError(t, err) segmentIDs2, has2 := flushResp.GetCollSegIDs()[collectionName] ids2 := segmentIDs2.GetData() assert.NotEmpty(t, segmentIDs) assert.Equal(t, true, has2) waitingForFlush(ctx, c, ids2) loadStatus, err := c.proxy.LoadCollection(ctx, &milvuspb.LoadCollectionRequest{ DbName: dbName, CollectionName: collectionName, }) assert.NoError(t, err) if loadStatus.GetErrorCode() != commonpb.ErrorCode_Success { log.Warn("loadStatus fail reason", zap.String("reason", loadStatus.GetReason())) } assert.Equal(t, commonpb.ErrorCode_Success, loadStatus.GetErrorCode()) for { loadProgress, err := c.proxy.GetLoadingProgress(ctx, &milvuspb.GetLoadingProgressRequest{ CollectionName: collectionName, }) if err != nil { panic("GetLoadingProgress fail") } if loadProgress.GetProgress() == 100 { break } time.Sleep(500 * time.Millisecond) } assert.NoError(t, err) assert.Equal(t, insertResult2.GetStatus().GetErrorCode(), commonpb.ErrorCode_Success) getIndexStatisticsResponse2, err := c.proxy.GetIndexStatistics(ctx, &milvuspb.GetIndexStatisticsRequest{ CollectionName: collectionName, IndexName: indexName, }) assert.NoError(t, err) indexInfos2 := getIndexStatisticsResponse2.GetIndexDescriptions() assert.Equal(t, 1, len(indexInfos2)) assert.Equal(t, int64(6000), indexInfos2[0].IndexedRows) assert.Equal(t, int64(6000), indexInfos2[0].TotalRows) log.Info("TestGetIndexStatistics succeed") }