mirror of https://github.com/milvus-io/milvus.git
Fix search failed due to metric type mismatch (#24691)
Signed-off-by: bigsheeper <yihao.dai@zilliz.com>pull/24688/head
parent
b71c967ed7
commit
5f7099a9bd
internal
querycoordv2/task
querynodev2
|
@ -253,6 +253,7 @@ func (ex *Executor) loadSegment(task *SegmentTask, step int) error {
|
||||||
log.Warn("failed to get partitions of collection", zap.Error(err))
|
log.Warn("failed to get partitions of collection", zap.Error(err))
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
loadMeta := packLoadMeta(
|
loadMeta := packLoadMeta(
|
||||||
ex.meta.GetLoadType(task.CollectionID()),
|
ex.meta.GetLoadType(task.CollectionID()),
|
||||||
"",
|
"",
|
||||||
|
|
|
@ -358,6 +358,10 @@ func (suite *TaskSuite) TestUnsubscribeChannelTask() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (suite *TaskSuite) expectationsForLoadSegments() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (suite *TaskSuite) TestLoadSegmentTask() {
|
func (suite *TaskSuite) TestLoadSegmentTask() {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
timeout := 10 * time.Second
|
timeout := 10 * time.Second
|
||||||
|
|
|
@ -33,6 +33,7 @@ import (
|
||||||
"github.com/milvus-io/milvus-proto/go-api/milvuspb"
|
"github.com/milvus-io/milvus-proto/go-api/milvuspb"
|
||||||
"github.com/milvus-io/milvus-proto/go-api/msgpb"
|
"github.com/milvus-io/milvus-proto/go-api/msgpb"
|
||||||
"github.com/milvus-io/milvus/internal/proto/datapb"
|
"github.com/milvus-io/milvus/internal/proto/datapb"
|
||||||
|
"github.com/milvus-io/milvus/internal/proto/indexpb"
|
||||||
"github.com/milvus-io/milvus/internal/proto/internalpb"
|
"github.com/milvus-io/milvus/internal/proto/internalpb"
|
||||||
"github.com/milvus-io/milvus/internal/proto/querypb"
|
"github.com/milvus-io/milvus/internal/proto/querypb"
|
||||||
"github.com/milvus-io/milvus/internal/proto/segcorepb"
|
"github.com/milvus-io/milvus/internal/proto/segcorepb"
|
||||||
|
@ -410,6 +411,21 @@ func (node *QueryNode) LoadPartitions(ctx context.Context, req *querypb.LoadPart
|
||||||
proportion := paramtable.Get().DataCoordCfg.SegmentSealProportion.GetAsFloat()
|
proportion := paramtable.Get().DataCoordCfg.SegmentSealProportion.GetAsFloat()
|
||||||
maxIndexRecordPerSegment = int64(threshold * proportion / float64(sizePerRecord))
|
maxIndexRecordPerSegment = int64(threshold * proportion / float64(sizePerRecord))
|
||||||
}
|
}
|
||||||
|
vecField, err := typeutil.GetVectorFieldSchema(req.GetSchema())
|
||||||
|
if err != nil {
|
||||||
|
return merr.Status(err), nil
|
||||||
|
}
|
||||||
|
indexInfo, ok := lo.Find(req.GetIndexInfoList(), func(info *indexpb.IndexInfo) bool {
|
||||||
|
return info.GetFieldID() == vecField.GetFieldID()
|
||||||
|
})
|
||||||
|
if !ok || indexInfo == nil {
|
||||||
|
err = fmt.Errorf("cannot find index info for %s field", vecField.GetName())
|
||||||
|
return merr.Status(err), nil
|
||||||
|
}
|
||||||
|
metricType, err := funcutil.GetAttrByKeyFromRepeatedKV(common.MetricTypeKey, indexInfo.GetIndexParams())
|
||||||
|
if err != nil {
|
||||||
|
return merr.Status(err), nil
|
||||||
|
}
|
||||||
node.manager.Collection.Put(req.GetCollectionID(), req.GetSchema(), &segcorepb.CollectionIndexMeta{
|
node.manager.Collection.Put(req.GetCollectionID(), req.GetSchema(), &segcorepb.CollectionIndexMeta{
|
||||||
IndexMetas: fieldIndexMetas,
|
IndexMetas: fieldIndexMetas,
|
||||||
MaxIndexRowCount: maxIndexRecordPerSegment,
|
MaxIndexRowCount: maxIndexRecordPerSegment,
|
||||||
|
@ -417,6 +433,7 @@ func (node *QueryNode) LoadPartitions(ctx context.Context, req *querypb.LoadPart
|
||||||
CollectionID: req.GetCollectionID(),
|
CollectionID: req.GetCollectionID(),
|
||||||
PartitionIDs: req.GetPartitionIDs(),
|
PartitionIDs: req.GetPartitionIDs(),
|
||||||
LoadType: querypb.LoadType_LoadCollection, // TODO: dyh, remove loadType in querynode
|
LoadType: querypb.LoadType_LoadCollection, // TODO: dyh, remove loadType in querynode
|
||||||
|
MetricType: metricType,
|
||||||
})
|
})
|
||||||
|
|
||||||
log.Info("load partitions done")
|
log.Info("load partitions done")
|
||||||
|
|
|
@ -32,12 +32,14 @@ import (
|
||||||
"github.com/milvus-io/milvus-proto/go-api/msgpb"
|
"github.com/milvus-io/milvus-proto/go-api/msgpb"
|
||||||
"github.com/milvus-io/milvus-proto/go-api/schemapb"
|
"github.com/milvus-io/milvus-proto/go-api/schemapb"
|
||||||
"github.com/milvus-io/milvus/internal/proto/datapb"
|
"github.com/milvus-io/milvus/internal/proto/datapb"
|
||||||
|
"github.com/milvus-io/milvus/internal/proto/indexpb"
|
||||||
"github.com/milvus-io/milvus/internal/proto/internalpb"
|
"github.com/milvus-io/milvus/internal/proto/internalpb"
|
||||||
"github.com/milvus-io/milvus/internal/proto/querypb"
|
"github.com/milvus-io/milvus/internal/proto/querypb"
|
||||||
"github.com/milvus-io/milvus/internal/querynodev2/delegator"
|
"github.com/milvus-io/milvus/internal/querynodev2/delegator"
|
||||||
"github.com/milvus-io/milvus/internal/querynodev2/segments"
|
"github.com/milvus-io/milvus/internal/querynodev2/segments"
|
||||||
"github.com/milvus-io/milvus/internal/storage"
|
"github.com/milvus-io/milvus/internal/storage"
|
||||||
"github.com/milvus-io/milvus/internal/util/dependency"
|
"github.com/milvus-io/milvus/internal/util/dependency"
|
||||||
|
"github.com/milvus-io/milvus/pkg/common"
|
||||||
"github.com/milvus-io/milvus/pkg/mq/msgstream"
|
"github.com/milvus-io/milvus/pkg/mq/msgstream"
|
||||||
"github.com/milvus-io/milvus/pkg/util/conc"
|
"github.com/milvus-io/milvus/pkg/util/conc"
|
||||||
"github.com/milvus-io/milvus/pkg/util/etcd"
|
"github.com/milvus-io/milvus/pkg/util/etcd"
|
||||||
|
@ -45,6 +47,7 @@ import (
|
||||||
"github.com/milvus-io/milvus/pkg/util/merr"
|
"github.com/milvus-io/milvus/pkg/util/merr"
|
||||||
"github.com/milvus-io/milvus/pkg/util/metricsinfo"
|
"github.com/milvus-io/milvus/pkg/util/metricsinfo"
|
||||||
"github.com/milvus-io/milvus/pkg/util/paramtable"
|
"github.com/milvus-io/milvus/pkg/util/paramtable"
|
||||||
|
"github.com/milvus-io/milvus/pkg/util/typeutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ServiceSuite struct {
|
type ServiceSuite struct {
|
||||||
|
@ -1477,10 +1480,47 @@ func (suite *ServiceSuite) TestLoadPartition() {
|
||||||
suite.NoError(err)
|
suite.NoError(err)
|
||||||
suite.Equal(commonpb.ErrorCode_UnexpectedError, status.GetErrorCode())
|
suite.Equal(commonpb.ErrorCode_UnexpectedError, status.GetErrorCode())
|
||||||
|
|
||||||
// collection not exist and schema is not nil
|
// no vec field in schema
|
||||||
|
req.Schema = &schemapb.CollectionSchema{}
|
||||||
|
status, err = suite.node.LoadPartitions(ctx, req)
|
||||||
|
suite.NoError(err)
|
||||||
|
suite.Equal(commonpb.ErrorCode_UnexpectedError, status.GetErrorCode())
|
||||||
|
|
||||||
|
// no indexInfo
|
||||||
req.Schema = segments.GenTestCollectionSchema(suite.collectionName, schemapb.DataType_Int64)
|
req.Schema = segments.GenTestCollectionSchema(suite.collectionName, schemapb.DataType_Int64)
|
||||||
status, err = suite.node.LoadPartitions(ctx, req)
|
status, err = suite.node.LoadPartitions(ctx, req)
|
||||||
suite.NoError(err)
|
suite.NoError(err)
|
||||||
|
suite.Equal(commonpb.ErrorCode_UnexpectedError, status.GetErrorCode())
|
||||||
|
|
||||||
|
// no metric type
|
||||||
|
vecField, err := typeutil.GetVectorFieldSchema(req.GetSchema())
|
||||||
|
suite.NoError(err)
|
||||||
|
req.IndexInfoList = []*indexpb.IndexInfo{
|
||||||
|
{
|
||||||
|
CollectionID: suite.collectionID,
|
||||||
|
FieldID: vecField.GetFieldID(),
|
||||||
|
IndexParams: []*commonpb.KeyValuePair{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
status, err = suite.node.LoadPartitions(ctx, req)
|
||||||
|
suite.NoError(err)
|
||||||
|
suite.Equal(commonpb.ErrorCode_UnexpectedError, status.GetErrorCode())
|
||||||
|
|
||||||
|
// collection not exist and schema is not nil
|
||||||
|
req.IndexInfoList = []*indexpb.IndexInfo{
|
||||||
|
{
|
||||||
|
CollectionID: suite.collectionID,
|
||||||
|
FieldID: vecField.GetFieldID(),
|
||||||
|
IndexParams: []*commonpb.KeyValuePair{
|
||||||
|
{
|
||||||
|
Key: common.MetricTypeKey,
|
||||||
|
Value: "L2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
status, err = suite.node.LoadPartitions(ctx, req)
|
||||||
|
suite.NoError(err)
|
||||||
suite.Equal(commonpb.ErrorCode_Success, status.ErrorCode)
|
suite.Equal(commonpb.ErrorCode_Success, status.ErrorCode)
|
||||||
|
|
||||||
// collection existed
|
// collection existed
|
||||||
|
|
Loading…
Reference in New Issue