2021-11-10 15:55:48 +00:00
// Licensed to the LF AI & Data foundation under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
2021-04-19 02:09:43 +00:00
// with the License. You may obtain a copy of the License at
//
2021-11-10 15:55:48 +00:00
// http://www.apache.org/licenses/LICENSE-2.0
2021-04-19 02:09:43 +00:00
//
2021-11-10 15:55:48 +00:00
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
2021-04-19 02:09:43 +00:00
2021-06-22 06:40:07 +00:00
package proxy
2020-11-03 06:53:36 +00:00
import (
2021-02-04 11:34:35 +00:00
"context"
2021-03-08 11:39:36 +00:00
"errors"
2021-02-08 06:20:29 +00:00
"fmt"
2020-11-26 08:01:31 +00:00
"math"
"strconv"
2021-07-14 10:51:54 +00:00
"strings"
2021-03-26 03:19:02 +00:00
2022-06-16 12:12:11 +00:00
"github.com/milvus-io/milvus/internal/proto/indexpb"
2022-04-29 05:35:49 +00:00
2021-12-08 06:15:03 +00:00
"github.com/golang/protobuf/proto"
2021-03-08 11:39:36 +00:00
"go.uber.org/zap"
2021-03-05 02:15:27 +00:00
2021-10-20 09:56:38 +00:00
"github.com/milvus-io/milvus/internal/common"
2021-04-22 06:45:57 +00:00
"github.com/milvus-io/milvus/internal/log"
2022-03-02 08:23:55 +00:00
"github.com/milvus-io/milvus/internal/metrics"
2022-03-03 13:57:56 +00:00
"github.com/milvus-io/milvus/internal/mq/msgstream"
2022-04-01 10:59:29 +00:00
"github.com/milvus-io/milvus/internal/types"
2022-09-16 08:56:49 +00:00
"github.com/milvus-io/milvus/api/commonpb"
"github.com/milvus-io/milvus/api/milvuspb"
"github.com/milvus-io/milvus/api/schemapb"
2021-04-22 06:45:57 +00:00
"github.com/milvus-io/milvus/internal/proto/datapb"
"github.com/milvus-io/milvus/internal/proto/internalpb"
2021-07-21 06:52:12 +00:00
"github.com/milvus-io/milvus/internal/proto/planpb"
2021-04-22 06:45:57 +00:00
"github.com/milvus-io/milvus/internal/proto/querypb"
2022-04-01 10:59:29 +00:00
2021-07-21 06:52:12 +00:00
"github.com/milvus-io/milvus/internal/util/funcutil"
"github.com/milvus-io/milvus/internal/util/indexparamcheck"
2021-10-20 09:56:38 +00:00
"github.com/milvus-io/milvus/internal/util/timerecord"
2021-09-22 11:33:54 +00:00
"github.com/milvus-io/milvus/internal/util/trace"
2021-04-22 06:45:57 +00:00
"github.com/milvus-io/milvus/internal/util/typeutil"
2020-11-03 06:53:36 +00:00
)
2021-02-23 01:58:06 +00:00
const (
2022-08-30 02:32:56 +00:00
AnnsFieldKey = "anns_field"
TopKKey = "topk"
MetricTypeKey = "metric_type"
SearchParamsKey = "params"
RoundDecimalKey = "round_decimal"
OffsetKey = "offset"
2022-09-01 10:54:58 +00:00
LimitKey = "limit"
2022-08-30 02:32:56 +00:00
2021-09-11 10:06:02 +00:00
InsertTaskName = "InsertTask"
2021-02-23 01:58:06 +00:00
CreateCollectionTaskName = "CreateCollectionTask"
DropCollectionTaskName = "DropCollectionTask"
2021-09-11 10:06:02 +00:00
SearchTaskName = "SearchTask"
2021-05-19 10:45:15 +00:00
RetrieveTaskName = "RetrieveTask"
2021-09-11 10:06:02 +00:00
QueryTaskName = "QueryTask"
2021-02-23 01:58:06 +00:00
HasCollectionTaskName = "HasCollectionTask"
DescribeCollectionTaskName = "DescribeCollectionTask"
GetCollectionStatisticsTaskName = "GetCollectionStatisticsTask"
2021-05-10 09:39:08 +00:00
GetPartitionStatisticsTaskName = "GetPartitionStatisticsTask"
2021-02-23 01:58:06 +00:00
ShowCollectionTaskName = "ShowCollectionTask"
CreatePartitionTaskName = "CreatePartitionTask"
DropPartitionTaskName = "DropPartitionTask"
HasPartitionTaskName = "HasPartitionTask"
ShowPartitionTaskName = "ShowPartitionTask"
2021-09-11 10:06:02 +00:00
CreateIndexTaskName = "CreateIndexTask"
DescribeIndexTaskName = "DescribeIndexTask"
DropIndexTaskName = "DropIndexTask"
GetIndexStateTaskName = "GetIndexStateTask"
GetIndexBuildProgressTaskName = "GetIndexBuildProgressTask"
FlushTaskName = "FlushTask"
2021-02-23 01:58:06 +00:00
LoadCollectionTaskName = "LoadCollectionTask"
ReleaseCollectionTaskName = "ReleaseCollectionTask"
2021-09-09 11:02:08 +00:00
LoadPartitionTaskName = "LoadPartitionsTask"
ReleasePartitionTaskName = "ReleasePartitionsTask"
2021-09-15 06:04:54 +00:00
deleteTaskName = "DeleteTask"
2021-09-18 03:13:51 +00:00
CreateAliasTaskName = "CreateAliasTask"
DropAliasTaskName = "DropAliasTask"
AlterAliasTaskName = "AlterAliasTask"
2021-09-22 02:15:54 +00:00
2022-01-04 06:13:44 +00:00
// minFloat32 minimum float.
2021-09-22 02:15:54 +00:00
minFloat32 = - 1 * float32 ( math . MaxFloat32 )
2021-02-23 01:58:06 +00:00
)
2020-11-03 06:53:36 +00:00
type task interface {
2021-03-25 06:41:46 +00:00
TraceCtx ( ) context . Context
2020-11-23 08:52:17 +00:00
ID ( ) UniqueID // return ReqID
SetID ( uid UniqueID ) // set ReqID
2021-02-23 01:58:06 +00:00
Name ( ) string
2021-01-16 07:06:19 +00:00
Type ( ) commonpb . MsgType
2020-11-05 10:01:33 +00:00
BeginTs ( ) Timestamp
EndTs ( ) Timestamp
2020-11-04 09:58:43 +00:00
SetTs ( ts Timestamp )
2021-01-22 01:36:18 +00:00
OnEnqueue ( ) error
2021-02-23 01:58:06 +00:00
PreExecute ( ctx context . Context ) error
Execute ( ctx context . Context ) error
PostExecute ( ctx context . Context ) error
2020-11-03 06:53:36 +00:00
WaitToFinish ( ) error
2020-11-05 10:01:33 +00:00
Notify ( err error )
2020-11-03 06:53:36 +00:00
}
2021-05-31 03:40:31 +00:00
type dmlTask interface {
task
2022-06-02 07:34:04 +00:00
getChannels ( ) ( [ ] pChan , error )
2021-06-15 02:19:38 +00:00
getPChanStats ( ) ( map [ pChan ] pChanStatistics , error )
2021-06-02 02:17:32 +00:00
}
2020-11-07 08:18:23 +00:00
type BaseInsertTask = msgstream . InsertMsg
2020-11-05 10:01:33 +00:00
2021-09-09 11:02:08 +00:00
type createCollectionTask struct {
2020-11-17 12:00:23 +00:00
Condition
2021-01-22 01:36:18 +00:00
* milvuspb . CreateCollectionRequest
2021-09-11 03:36:22 +00:00
ctx context . Context
rootCoord types . RootCoord
result * commonpb . Status
schema * schemapb . CollectionSchema
2020-11-05 10:01:33 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cct * createCollectionTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return cct . ctx
2021-01-22 01:36:18 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cct * createCollectionTask ) ID ( ) UniqueID {
2021-01-18 11:32:08 +00:00
return cct . Base . MsgID
2020-11-05 10:01:33 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cct * createCollectionTask ) SetID ( uid UniqueID ) {
2021-01-18 11:32:08 +00:00
cct . Base . MsgID = uid
2020-11-23 08:52:17 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cct * createCollectionTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return CreateCollectionTaskName
}
2021-09-09 11:02:08 +00:00
func ( cct * createCollectionTask ) Type ( ) commonpb . MsgType {
2021-01-18 11:32:08 +00:00
return cct . Base . MsgType
2020-11-05 10:01:33 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cct * createCollectionTask ) BeginTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return cct . Base . Timestamp
2020-11-05 10:01:33 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cct * createCollectionTask ) EndTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return cct . Base . Timestamp
2020-11-05 10:01:33 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cct * createCollectionTask ) SetTs ( ts Timestamp ) {
2021-01-18 11:32:08 +00:00
cct . Base . Timestamp = ts
2020-11-05 10:01:33 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cct * createCollectionTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
cct . Base = & commonpb . MsgBase { }
2021-09-11 10:06:02 +00:00
cct . Base . MsgType = commonpb . MsgType_CreateCollection
2022-04-24 14:03:44 +00:00
cct . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-02-23 01:58:06 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
func ( cct * createCollectionTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
cct . Base . MsgType = commonpb . MsgType_CreateCollection
2022-04-24 14:03:44 +00:00
cct . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-01-22 01:36:18 +00:00
cct . schema = & schemapb . CollectionSchema { }
err := proto . Unmarshal ( cct . Schema , cct . schema )
2021-09-11 10:06:02 +00:00
if err != nil {
return err
}
2021-06-21 03:42:18 +00:00
cct . schema . AutoID = false
2021-01-22 01:36:18 +00:00
2021-12-23 10:39:11 +00:00
if cct . ShardsNum > Params . ProxyCfg . MaxShardNum {
return fmt . Errorf ( "maximum shards's number should be limited to %d" , Params . ProxyCfg . MaxShardNum )
2021-09-08 07:00:00 +00:00
}
2021-12-23 10:39:11 +00:00
if int64 ( len ( cct . schema . Fields ) ) > Params . ProxyCfg . MaxFieldNum {
return fmt . Errorf ( "maximum field's number should be limited to %d" , Params . ProxyCfg . MaxFieldNum )
2020-11-26 08:01:31 +00:00
}
// validate collection name
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( cct . schema . Name ) ; err != nil {
2020-11-26 08:01:31 +00:00
return err
}
2022-03-03 08:57:56 +00:00
// validate whether field names duplicates
2021-10-26 02:38:41 +00:00
if err := validateDuplicatedFieldName ( cct . schema . Fields ) ; err != nil {
2020-11-30 11:38:23 +00:00
return err
}
2022-03-03 08:57:56 +00:00
// validate primary key definition
2021-10-25 15:42:29 +00:00
if err := validatePrimaryKey ( cct . schema ) ; err != nil {
2020-11-30 11:38:23 +00:00
return err
}
2022-03-03 08:57:56 +00:00
// validate auto id definition
2021-06-21 03:42:18 +00:00
if err := ValidateFieldAutoID ( cct . schema ) ; err != nil {
return err
}
2022-03-03 08:57:56 +00:00
// validate field type definition
if err := validateFieldType ( cct . schema ) ; err != nil {
return err
}
2020-11-26 08:01:31 +00:00
for _ , field := range cct . schema . Fields {
2022-03-03 08:57:56 +00:00
// validate field name
2021-10-23 10:25:37 +00:00
if err := validateFieldName ( field . Name ) ; err != nil {
2020-11-26 08:01:31 +00:00
return err
}
2022-03-03 08:57:56 +00:00
// validate vector field type parameters
2021-03-12 06:22:09 +00:00
if field . DataType == schemapb . DataType_FloatVector || field . DataType == schemapb . DataType_BinaryVector {
2022-04-29 05:35:49 +00:00
err = validateDimension ( field )
if err != nil {
return err
2020-11-26 08:01:31 +00:00
}
2022-04-29 05:35:49 +00:00
}
// valid max length per row parameters
2022-06-07 07:58:06 +00:00
// if max_length not specified, return error
2022-04-29 05:35:49 +00:00
if field . DataType == schemapb . DataType_VarChar {
err = validateMaxLengthPerRow ( cct . schema . Name , field )
if err != nil {
return err
2020-11-26 08:01:31 +00:00
}
}
}
2021-12-06 02:03:34 +00:00
if err := validateMultipleVectorFields ( cct . schema ) ; err != nil {
return err
}
2022-04-29 05:35:49 +00:00
cct . CreateCollectionRequest . Schema , err = proto . Marshal ( cct . schema )
if err != nil {
return err
}
2020-11-05 10:01:33 +00:00
return nil
2020-11-03 06:53:36 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cct * createCollectionTask ) Execute ( ctx context . Context ) error {
2021-01-22 01:36:18 +00:00
var err error
2021-06-21 09:28:03 +00:00
cct . result , err = cct . rootCoord . CreateCollection ( ctx , cct . CreateCollectionRequest )
2021-05-27 09:09:50 +00:00
return err
2020-11-03 06:53:36 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cct * createCollectionTask ) PostExecute ( ctx context . Context ) error {
2020-11-05 10:01:33 +00:00
return nil
2020-11-03 06:53:36 +00:00
}
2021-09-09 11:02:08 +00:00
type dropCollectionTask struct {
2020-11-17 12:00:23 +00:00
Condition
2021-01-22 01:36:18 +00:00
* milvuspb . DropCollectionRequest
2021-06-21 09:28:03 +00:00
ctx context . Context
rootCoord types . RootCoord
result * commonpb . Status
chMgr channelsMgr
chTicker channelsTimeTicker
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * dropCollectionTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return dct . ctx
2021-01-22 01:36:18 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * dropCollectionTask ) ID ( ) UniqueID {
2021-01-18 11:32:08 +00:00
return dct . Base . MsgID
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * dropCollectionTask ) SetID ( uid UniqueID ) {
2021-01-18 11:32:08 +00:00
dct . Base . MsgID = uid
2020-11-23 08:52:17 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * dropCollectionTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return DropCollectionTaskName
}
2021-09-09 11:02:08 +00:00
func ( dct * dropCollectionTask ) Type ( ) commonpb . MsgType {
2021-01-18 11:32:08 +00:00
return dct . Base . MsgType
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * dropCollectionTask ) BeginTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return dct . Base . Timestamp
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * dropCollectionTask ) EndTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return dct . Base . Timestamp
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * dropCollectionTask ) SetTs ( ts Timestamp ) {
2021-01-18 11:32:08 +00:00
dct . Base . Timestamp = ts
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * dropCollectionTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
dct . Base = & commonpb . MsgBase { }
return nil
}
2021-09-09 11:02:08 +00:00
func ( dct * dropCollectionTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
dct . Base . MsgType = commonpb . MsgType_DropCollection
2022-04-24 14:03:44 +00:00
dct . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-01-22 01:36:18 +00:00
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( dct . CollectionName ) ; err != nil {
2020-11-26 08:01:31 +00:00
return err
}
2020-11-09 09:25:53 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
func ( dct * dropCollectionTask ) Execute ( ctx context . Context ) error {
2022-09-27 11:18:54 +00:00
var err error
dct . result , err = dct . rootCoord . DropCollection ( ctx , dct . DropCollectionRequest )
if common . IsCollectionNotExistError ( err ) {
2022-09-05 05:29:11 +00:00
// make dropping collection idempotent.
dct . result = & commonpb . Status { ErrorCode : commonpb . ErrorCode_Success }
return nil
2021-02-01 02:53:13 +00:00
}
2022-09-27 11:18:54 +00:00
return err
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * dropCollectionTask ) PostExecute ( ctx context . Context ) error {
2020-11-30 14:14:19 +00:00
return nil
2020-11-09 09:25:53 +00:00
}
2021-08-14 03:18:10 +00:00
// Support wildcard in output fields:
// "*" - all scalar fields
// "%" - all vector fields
// For example, A and B are scalar fields, C and D are vector fields, duplicated fields will automatically be removed.
// output_fields=["*"] ==> [A,B]
// output_fields=["%"] ==> [C,D]
// output_fields=["*","%"] ==> [A,B,C,D]
// output_fields=["*",A] ==> [A,B]
// output_fields=["*",C] ==> [A,B,C]
2021-07-21 06:52:12 +00:00
func translateOutputFields ( outputFields [ ] string , schema * schemapb . CollectionSchema , addPrimary bool ) ( [ ] string , error ) {
var primaryFieldName string
scalarFieldNameMap := make ( map [ string ] bool )
vectorFieldNameMap := make ( map [ string ] bool )
resultFieldNameMap := make ( map [ string ] bool )
resultFieldNames := make ( [ ] string , 0 )
for _ , field := range schema . Fields {
if field . IsPrimaryKey {
primaryFieldName = field . Name
}
if field . DataType == schemapb . DataType_BinaryVector || field . DataType == schemapb . DataType_FloatVector {
vectorFieldNameMap [ field . Name ] = true
} else {
scalarFieldNameMap [ field . Name ] = true
}
}
for _ , outputFieldName := range outputFields {
outputFieldName = strings . TrimSpace ( outputFieldName )
if outputFieldName == "*" {
for fieldName := range scalarFieldNameMap {
resultFieldNameMap [ fieldName ] = true
}
} else if outputFieldName == "%" {
for fieldName := range vectorFieldNameMap {
resultFieldNameMap [ fieldName ] = true
}
} else {
resultFieldNameMap [ outputFieldName ] = true
}
}
if addPrimary {
resultFieldNameMap [ primaryFieldName ] = true
}
for fieldName := range resultFieldNameMap {
resultFieldNames = append ( resultFieldNames , fieldName )
}
return resultFieldNames , nil
}
2021-09-09 11:02:08 +00:00
type hasCollectionTask struct {
2020-11-17 12:00:23 +00:00
Condition
2021-01-22 01:36:18 +00:00
* milvuspb . HasCollectionRequest
2021-06-21 09:28:03 +00:00
ctx context . Context
rootCoord types . RootCoord
result * milvuspb . BoolResponse
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hct * hasCollectionTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return hct . ctx
2021-01-22 01:36:18 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hct * hasCollectionTask ) ID ( ) UniqueID {
2021-01-18 11:32:08 +00:00
return hct . Base . MsgID
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hct * hasCollectionTask ) SetID ( uid UniqueID ) {
2021-01-18 11:32:08 +00:00
hct . Base . MsgID = uid
2020-11-23 08:52:17 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hct * hasCollectionTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return HasCollectionTaskName
}
2021-09-09 11:02:08 +00:00
func ( hct * hasCollectionTask ) Type ( ) commonpb . MsgType {
2021-01-18 11:32:08 +00:00
return hct . Base . MsgType
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hct * hasCollectionTask ) BeginTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return hct . Base . Timestamp
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hct * hasCollectionTask ) EndTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return hct . Base . Timestamp
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hct * hasCollectionTask ) SetTs ( ts Timestamp ) {
2021-01-18 11:32:08 +00:00
hct . Base . Timestamp = ts
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hct * hasCollectionTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
hct . Base = & commonpb . MsgBase { }
return nil
}
2021-09-09 11:02:08 +00:00
func ( hct * hasCollectionTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
hct . Base . MsgType = commonpb . MsgType_HasCollection
2022-04-24 14:03:44 +00:00
hct . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-01-22 01:36:18 +00:00
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( hct . CollectionName ) ; err != nil {
2020-11-26 08:01:31 +00:00
return err
}
2020-11-09 09:25:53 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
func ( hct * hasCollectionTask ) Execute ( ctx context . Context ) error {
2021-01-22 01:36:18 +00:00
var err error
2021-06-21 09:28:03 +00:00
hct . result , err = hct . rootCoord . HasCollection ( ctx , hct . HasCollectionRequest )
2021-12-23 13:46:10 +00:00
if err != nil {
return err
}
2021-02-04 11:34:35 +00:00
if hct . result == nil {
return errors . New ( "has collection resp is nil" )
}
2021-03-10 14:06:22 +00:00
if hct . result . Status . ErrorCode != commonpb . ErrorCode_Success {
2021-02-04 11:34:35 +00:00
return errors . New ( hct . result . Status . Reason )
}
2021-12-23 13:46:10 +00:00
return nil
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hct * hasCollectionTask ) PostExecute ( ctx context . Context ) error {
2020-11-09 09:25:53 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
type describeCollectionTask struct {
2020-11-17 12:00:23 +00:00
Condition
2021-01-22 01:36:18 +00:00
* milvuspb . DescribeCollectionRequest
2021-06-21 09:28:03 +00:00
ctx context . Context
rootCoord types . RootCoord
result * milvuspb . DescribeCollectionResponse
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * describeCollectionTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return dct . ctx
2021-01-22 01:36:18 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * describeCollectionTask ) ID ( ) UniqueID {
2021-01-18 11:32:08 +00:00
return dct . Base . MsgID
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * describeCollectionTask ) SetID ( uid UniqueID ) {
2021-01-18 11:32:08 +00:00
dct . Base . MsgID = uid
2020-11-23 08:52:17 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * describeCollectionTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return DescribeCollectionTaskName
}
2021-09-09 11:02:08 +00:00
func ( dct * describeCollectionTask ) Type ( ) commonpb . MsgType {
2021-01-18 11:32:08 +00:00
return dct . Base . MsgType
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * describeCollectionTask ) BeginTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return dct . Base . Timestamp
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * describeCollectionTask ) EndTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return dct . Base . Timestamp
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * describeCollectionTask ) SetTs ( ts Timestamp ) {
2021-01-18 11:32:08 +00:00
dct . Base . Timestamp = ts
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * describeCollectionTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
dct . Base = & commonpb . MsgBase { }
return nil
}
2021-09-09 11:02:08 +00:00
func ( dct * describeCollectionTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
dct . Base . MsgType = commonpb . MsgType_DescribeCollection
2022-04-24 14:03:44 +00:00
dct . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-01-22 01:36:18 +00:00
2021-10-09 08:10:56 +00:00
if dct . CollectionID != 0 && len ( dct . CollectionName ) == 0 {
return nil
2020-11-26 08:01:31 +00:00
}
2021-10-09 08:10:56 +00:00
2021-10-23 02:53:12 +00:00
return validateCollectionName ( dct . CollectionName )
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * describeCollectionTask ) Execute ( ctx context . Context ) error {
2021-01-22 01:36:18 +00:00
var err error
2021-06-08 11:25:37 +00:00
dct . result = & milvuspb . DescribeCollectionResponse {
Status : & commonpb . Status {
ErrorCode : commonpb . ErrorCode_Success ,
} ,
Schema : & schemapb . CollectionSchema {
Name : "" ,
Description : "" ,
AutoID : false ,
Fields : make ( [ ] * schemapb . FieldSchema , 0 ) ,
} ,
CollectionID : 0 ,
VirtualChannelNames : nil ,
PhysicalChannelNames : nil ,
2022-09-02 11:20:59 +00:00
CollectionName : dct . GetCollectionName ( ) ,
2021-06-08 11:25:37 +00:00
}
2021-06-21 09:28:03 +00:00
result , err := dct . rootCoord . DescribeCollection ( ctx , dct . DescribeCollectionRequest )
2021-06-08 11:25:37 +00:00
2021-06-11 07:33:18 +00:00
if err != nil {
return err
2021-02-04 11:34:35 +00:00
}
2021-06-08 11:25:37 +00:00
2021-06-11 07:33:18 +00:00
if result . Status . ErrorCode != commonpb . ErrorCode_Success {
dct . result . Status = result . Status
} else {
dct . result . Schema . Name = result . Schema . Name
dct . result . Schema . Description = result . Schema . Description
dct . result . Schema . AutoID = result . Schema . AutoID
dct . result . CollectionID = result . CollectionID
dct . result . VirtualChannelNames = result . VirtualChannelNames
dct . result . PhysicalChannelNames = result . PhysicalChannelNames
2021-07-21 10:00:14 +00:00
dct . result . CreatedTimestamp = result . CreatedTimestamp
dct . result . CreatedUtcTimestamp = result . CreatedUtcTimestamp
2021-09-14 03:59:47 +00:00
dct . result . ShardsNum = result . ShardsNum
2021-12-21 11:49:02 +00:00
dct . result . ConsistencyLevel = result . ConsistencyLevel
2022-06-13 11:22:10 +00:00
dct . result . Aliases = result . Aliases
2021-06-11 07:33:18 +00:00
for _ , field := range result . Schema . Fields {
2021-09-13 09:12:19 +00:00
if field . FieldID >= common . StartOfUserFieldID {
2021-06-11 07:33:18 +00:00
dct . result . Schema . Fields = append ( dct . result . Schema . Fields , & schemapb . FieldSchema {
FieldID : field . FieldID ,
Name : field . Name ,
IsPrimaryKey : field . IsPrimaryKey ,
2021-06-21 03:42:18 +00:00
AutoID : field . AutoID ,
2021-06-11 07:33:18 +00:00
Description : field . Description ,
DataType : field . DataType ,
TypeParams : field . TypeParams ,
IndexParams : field . IndexParams ,
} )
}
2021-06-08 11:25:37 +00:00
}
}
2021-06-11 07:33:18 +00:00
return nil
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dct * describeCollectionTask ) PostExecute ( ctx context . Context ) error {
2021-02-02 11:54:31 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
type showCollectionsTask struct {
2020-11-17 12:00:23 +00:00
Condition
2021-03-12 06:22:09 +00:00
* milvuspb . ShowCollectionsRequest
2021-06-22 08:44:09 +00:00
ctx context . Context
rootCoord types . RootCoord
queryCoord types . QueryCoord
result * milvuspb . ShowCollectionsResponse
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( sct * showCollectionsTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return sct . ctx
2021-01-22 01:36:18 +00:00
}
2021-09-09 11:02:08 +00:00
func ( sct * showCollectionsTask ) ID ( ) UniqueID {
2021-01-18 11:32:08 +00:00
return sct . Base . MsgID
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( sct * showCollectionsTask ) SetID ( uid UniqueID ) {
2021-01-18 11:32:08 +00:00
sct . Base . MsgID = uid
2020-11-23 08:52:17 +00:00
}
2021-09-09 11:02:08 +00:00
func ( sct * showCollectionsTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return ShowCollectionTaskName
}
2021-09-09 11:02:08 +00:00
func ( sct * showCollectionsTask ) Type ( ) commonpb . MsgType {
2021-01-18 11:32:08 +00:00
return sct . Base . MsgType
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( sct * showCollectionsTask ) BeginTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return sct . Base . Timestamp
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( sct * showCollectionsTask ) EndTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return sct . Base . Timestamp
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( sct * showCollectionsTask ) SetTs ( ts Timestamp ) {
2021-01-18 11:32:08 +00:00
sct . Base . Timestamp = ts
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( sct * showCollectionsTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
sct . Base = & commonpb . MsgBase { }
return nil
}
2021-09-09 11:02:08 +00:00
func ( sct * showCollectionsTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
sct . Base . MsgType = commonpb . MsgType_ShowCollections
2022-04-24 14:03:44 +00:00
sct . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-08-02 14:39:25 +00:00
if sct . GetType ( ) == milvuspb . ShowType_InMemory {
for _ , collectionName := range sct . CollectionNames {
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( collectionName ) ; err != nil {
2021-08-02 14:39:25 +00:00
return err
}
}
}
2021-01-22 01:36:18 +00:00
2020-11-09 09:25:53 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
func ( sct * showCollectionsTask ) Execute ( ctx context . Context ) error {
2021-06-21 09:28:03 +00:00
respFromRootCoord , err := sct . rootCoord . ShowCollections ( ctx , sct . ShowCollectionsRequest )
2021-06-03 11:09:33 +00:00
if err != nil {
return err
2021-02-04 11:34:35 +00:00
}
2021-06-03 11:09:33 +00:00
2021-06-21 09:28:03 +00:00
if respFromRootCoord == nil {
2021-06-03 11:09:33 +00:00
return errors . New ( "failed to show collections" )
2021-02-04 11:34:35 +00:00
}
2021-06-03 11:09:33 +00:00
2021-06-21 09:28:03 +00:00
if respFromRootCoord . Status . ErrorCode != commonpb . ErrorCode_Success {
return errors . New ( respFromRootCoord . Status . Reason )
2021-06-03 11:09:33 +00:00
}
2021-08-02 14:39:25 +00:00
if sct . GetType ( ) == milvuspb . ShowType_InMemory {
IDs2Names := make ( map [ UniqueID ] string )
for offset , collectionName := range respFromRootCoord . CollectionNames {
collectionID := respFromRootCoord . CollectionIds [ offset ]
IDs2Names [ collectionID ] = collectionName
}
collectionIDs := make ( [ ] UniqueID , 0 )
for _ , collectionName := range sct . CollectionNames {
collectionID , err := globalMetaCache . GetCollectionID ( ctx , collectionName )
if err != nil {
log . Debug ( "Failed to get collection id." , zap . Any ( "collectionName" , collectionName ) ,
zap . Any ( "requestID" , sct . Base . MsgID ) , zap . Any ( "requestType" , "showCollections" ) )
return err
}
collectionIDs = append ( collectionIDs , collectionID )
IDs2Names [ collectionID ] = collectionName
}
2021-06-22 08:44:09 +00:00
resp , err := sct . queryCoord . ShowCollections ( ctx , & querypb . ShowCollectionsRequest {
2021-06-03 11:09:33 +00:00
Base : & commonpb . MsgBase {
MsgType : commonpb . MsgType_ShowCollections ,
2021-08-02 14:39:25 +00:00
MsgID : sct . Base . MsgID ,
Timestamp : sct . Base . Timestamp ,
SourceID : sct . Base . SourceID ,
2021-06-03 11:09:33 +00:00
} ,
//DbID: sct.ShowCollectionsRequest.DbName,
2021-08-02 14:39:25 +00:00
CollectionIDs : collectionIDs ,
2021-06-03 11:09:33 +00:00
} )
if err != nil {
return err
}
if resp == nil {
return errors . New ( "failed to show collections" )
}
if resp . Status . ErrorCode != commonpb . ErrorCode_Success {
2022-05-11 01:47:53 +00:00
// update collectionID to collection name, and return new error info to sdk
newErrorReason := resp . Status . Reason
for _ , collectionID := range collectionIDs {
newErrorReason = ReplaceID2Name ( newErrorReason , collectionID , IDs2Names [ collectionID ] )
}
return errors . New ( newErrorReason )
2021-06-03 11:09:33 +00:00
}
sct . result = & milvuspb . ShowCollectionsResponse {
2022-06-09 10:20:07 +00:00
Status : resp . Status ,
CollectionNames : make ( [ ] string , 0 , len ( resp . CollectionIDs ) ) ,
CollectionIds : make ( [ ] int64 , 0 , len ( resp . CollectionIDs ) ) ,
CreatedTimestamps : make ( [ ] uint64 , 0 , len ( resp . CollectionIDs ) ) ,
CreatedUtcTimestamps : make ( [ ] uint64 , 0 , len ( resp . CollectionIDs ) ) ,
InMemoryPercentages : make ( [ ] int64 , 0 , len ( resp . CollectionIDs ) ) ,
QueryServiceAvailable : make ( [ ] bool , 0 , len ( resp . CollectionIDs ) ) ,
2021-06-03 11:09:33 +00:00
}
2021-08-02 14:39:25 +00:00
for offset , id := range resp . CollectionIDs {
collectionName , ok := IDs2Names [ id ]
if ! ok {
log . Debug ( "Failed to get collection info." , zap . Any ( "collectionName" , collectionName ) ,
zap . Any ( "requestID" , sct . Base . MsgID ) , zap . Any ( "requestType" , "showCollections" ) )
return errors . New ( "failed to show collections" )
}
collectionInfo , err := globalMetaCache . GetCollectionInfo ( ctx , collectionName )
if err != nil {
log . Debug ( "Failed to get collection info." , zap . Any ( "collectionName" , collectionName ) ,
zap . Any ( "requestID" , sct . Base . MsgID ) , zap . Any ( "requestType" , "showCollections" ) )
return err
}
2021-06-03 11:09:33 +00:00
sct . result . CollectionIds = append ( sct . result . CollectionIds , id )
2021-08-02 14:39:25 +00:00
sct . result . CollectionNames = append ( sct . result . CollectionNames , collectionName )
sct . result . CreatedTimestamps = append ( sct . result . CreatedTimestamps , collectionInfo . createdTimestamp )
sct . result . CreatedUtcTimestamps = append ( sct . result . CreatedUtcTimestamps , collectionInfo . createdUtcTimestamp )
sct . result . InMemoryPercentages = append ( sct . result . InMemoryPercentages , resp . InMemoryPercentages [ offset ] )
2022-06-09 10:20:07 +00:00
sct . result . QueryServiceAvailable = append ( sct . result . QueryServiceAvailable , resp . QueryServiceAvailable [ offset ] )
2021-06-03 11:09:33 +00:00
}
2021-06-27 04:10:08 +00:00
} else {
sct . result = respFromRootCoord
2021-06-03 11:09:33 +00:00
}
return nil
2020-11-09 09:25:53 +00:00
}
2021-09-09 11:02:08 +00:00
func ( sct * showCollectionsTask ) PostExecute ( ctx context . Context ) error {
2020-11-09 09:25:53 +00:00
return nil
}
2020-11-19 09:09:22 +00:00
2021-09-09 11:02:08 +00:00
type createPartitionTask struct {
2020-11-19 09:09:22 +00:00
Condition
2021-01-22 01:36:18 +00:00
* milvuspb . CreatePartitionRequest
2021-06-21 09:28:03 +00:00
ctx context . Context
rootCoord types . RootCoord
result * commonpb . Status
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cpt * createPartitionTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return cpt . ctx
2021-01-22 01:36:18 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cpt * createPartitionTask ) ID ( ) UniqueID {
2021-01-18 11:32:08 +00:00
return cpt . Base . MsgID
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cpt * createPartitionTask ) SetID ( uid UniqueID ) {
2021-01-18 11:32:08 +00:00
cpt . Base . MsgID = uid
2020-11-23 08:52:17 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cpt * createPartitionTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return CreatePartitionTaskName
}
2021-09-09 11:02:08 +00:00
func ( cpt * createPartitionTask ) Type ( ) commonpb . MsgType {
2021-01-18 11:32:08 +00:00
return cpt . Base . MsgType
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cpt * createPartitionTask ) BeginTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return cpt . Base . Timestamp
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cpt * createPartitionTask ) EndTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return cpt . Base . Timestamp
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cpt * createPartitionTask ) SetTs ( ts Timestamp ) {
2021-01-18 11:32:08 +00:00
cpt . Base . Timestamp = ts
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( cpt * createPartitionTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
cpt . Base = & commonpb . MsgBase { }
return nil
}
2021-09-09 11:02:08 +00:00
func ( cpt * createPartitionTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
cpt . Base . MsgType = commonpb . MsgType_CreatePartition
2022-04-24 14:03:44 +00:00
cpt . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-01-22 01:36:18 +00:00
2021-01-18 11:32:08 +00:00
collName , partitionTag := cpt . CollectionName , cpt . PartitionName
2020-11-26 08:01:31 +00:00
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( collName ) ; err != nil {
2020-11-26 08:01:31 +00:00
return err
}
2021-10-23 10:23:44 +00:00
if err := validatePartitionTag ( partitionTag , true ) ; err != nil {
2020-11-26 08:01:31 +00:00
return err
}
2020-11-19 09:09:22 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
func ( cpt * createPartitionTask ) Execute ( ctx context . Context ) ( err error ) {
2021-06-21 09:28:03 +00:00
cpt . result , err = cpt . rootCoord . CreatePartition ( ctx , cpt . CreatePartitionRequest )
2022-09-16 03:12:47 +00:00
if err != nil {
return err
2021-02-04 11:34:35 +00:00
}
2021-03-10 14:06:22 +00:00
if cpt . result . ErrorCode != commonpb . ErrorCode_Success {
2021-02-04 11:34:35 +00:00
return errors . New ( cpt . result . Reason )
}
2020-11-19 09:09:22 +00:00
return err
}
2021-09-09 11:02:08 +00:00
func ( cpt * createPartitionTask ) PostExecute ( ctx context . Context ) error {
2020-11-19 09:09:22 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
type dropPartitionTask struct {
2020-11-19 09:09:22 +00:00
Condition
2021-01-22 01:36:18 +00:00
* milvuspb . DropPartitionRequest
2021-06-21 09:28:03 +00:00
ctx context . Context
rootCoord types . RootCoord
result * commonpb . Status
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dpt * dropPartitionTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return dpt . ctx
2021-01-22 01:36:18 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dpt * dropPartitionTask ) ID ( ) UniqueID {
2021-01-18 11:32:08 +00:00
return dpt . Base . MsgID
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dpt * dropPartitionTask ) SetID ( uid UniqueID ) {
2021-01-18 11:32:08 +00:00
dpt . Base . MsgID = uid
2020-11-23 08:52:17 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dpt * dropPartitionTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return DropPartitionTaskName
}
2021-09-09 11:02:08 +00:00
func ( dpt * dropPartitionTask ) Type ( ) commonpb . MsgType {
2021-01-18 11:32:08 +00:00
return dpt . Base . MsgType
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dpt * dropPartitionTask ) BeginTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return dpt . Base . Timestamp
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dpt * dropPartitionTask ) EndTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return dpt . Base . Timestamp
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dpt * dropPartitionTask ) SetTs ( ts Timestamp ) {
2021-01-18 11:32:08 +00:00
dpt . Base . Timestamp = ts
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( dpt * dropPartitionTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
dpt . Base = & commonpb . MsgBase { }
return nil
}
2021-09-09 11:02:08 +00:00
func ( dpt * dropPartitionTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
dpt . Base . MsgType = commonpb . MsgType_DropPartition
2022-04-24 14:03:44 +00:00
dpt . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-01-22 01:36:18 +00:00
2021-01-18 11:32:08 +00:00
collName , partitionTag := dpt . CollectionName , dpt . PartitionName
2020-11-26 08:01:31 +00:00
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( collName ) ; err != nil {
2020-11-26 08:01:31 +00:00
return err
}
2021-10-23 10:23:44 +00:00
if err := validatePartitionTag ( partitionTag , true ) ; err != nil {
2020-11-26 08:01:31 +00:00
return err
}
2020-11-19 09:09:22 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
func ( dpt * dropPartitionTask ) Execute ( ctx context . Context ) ( err error ) {
2021-06-21 09:28:03 +00:00
dpt . result , err = dpt . rootCoord . DropPartition ( ctx , dpt . DropPartitionRequest )
2022-09-16 03:12:47 +00:00
if err != nil {
return err
2021-02-04 11:34:35 +00:00
}
2021-03-10 14:06:22 +00:00
if dpt . result . ErrorCode != commonpb . ErrorCode_Success {
2021-02-04 11:34:35 +00:00
return errors . New ( dpt . result . Reason )
}
2020-11-19 09:09:22 +00:00
return err
}
2021-09-09 11:02:08 +00:00
func ( dpt * dropPartitionTask ) PostExecute ( ctx context . Context ) error {
2020-11-19 09:09:22 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
type hasPartitionTask struct {
2020-11-19 09:09:22 +00:00
Condition
2021-01-22 01:36:18 +00:00
* milvuspb . HasPartitionRequest
2021-06-21 09:28:03 +00:00
ctx context . Context
rootCoord types . RootCoord
result * milvuspb . BoolResponse
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hpt * hasPartitionTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return hpt . ctx
2021-01-22 01:36:18 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hpt * hasPartitionTask ) ID ( ) UniqueID {
2021-01-18 11:32:08 +00:00
return hpt . Base . MsgID
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hpt * hasPartitionTask ) SetID ( uid UniqueID ) {
2021-01-18 11:32:08 +00:00
hpt . Base . MsgID = uid
2020-11-23 08:52:17 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hpt * hasPartitionTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return HasPartitionTaskName
}
2021-09-09 11:02:08 +00:00
func ( hpt * hasPartitionTask ) Type ( ) commonpb . MsgType {
2021-01-18 11:32:08 +00:00
return hpt . Base . MsgType
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hpt * hasPartitionTask ) BeginTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return hpt . Base . Timestamp
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hpt * hasPartitionTask ) EndTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return hpt . Base . Timestamp
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hpt * hasPartitionTask ) SetTs ( ts Timestamp ) {
2021-01-18 11:32:08 +00:00
hpt . Base . Timestamp = ts
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( hpt * hasPartitionTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
hpt . Base = & commonpb . MsgBase { }
return nil
}
2021-09-09 11:02:08 +00:00
func ( hpt * hasPartitionTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
hpt . Base . MsgType = commonpb . MsgType_HasPartition
2022-04-24 14:03:44 +00:00
hpt . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-01-22 01:36:18 +00:00
2021-01-18 11:32:08 +00:00
collName , partitionTag := hpt . CollectionName , hpt . PartitionName
2020-11-26 08:01:31 +00:00
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( collName ) ; err != nil {
2020-11-26 08:01:31 +00:00
return err
}
2021-10-23 10:23:44 +00:00
if err := validatePartitionTag ( partitionTag , true ) ; err != nil {
2020-11-26 08:01:31 +00:00
return err
}
2020-11-19 09:09:22 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
func ( hpt * hasPartitionTask ) Execute ( ctx context . Context ) ( err error ) {
2021-06-21 09:28:03 +00:00
hpt . result , err = hpt . rootCoord . HasPartition ( ctx , hpt . HasPartitionRequest )
2022-09-16 03:12:47 +00:00
if err != nil {
return err
2021-02-04 11:34:35 +00:00
}
2021-03-10 14:06:22 +00:00
if hpt . result . Status . ErrorCode != commonpb . ErrorCode_Success {
2021-02-04 11:34:35 +00:00
return errors . New ( hpt . result . Status . Reason )
}
2020-11-19 09:09:22 +00:00
return err
}
2021-09-09 11:02:08 +00:00
func ( hpt * hasPartitionTask ) PostExecute ( ctx context . Context ) error {
2020-11-19 09:09:22 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
type showPartitionsTask struct {
2020-11-19 09:09:22 +00:00
Condition
2021-03-12 06:22:09 +00:00
* milvuspb . ShowPartitionsRequest
2021-08-02 14:39:25 +00:00
ctx context . Context
rootCoord types . RootCoord
queryCoord types . QueryCoord
result * milvuspb . ShowPartitionsResponse
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( spt * showPartitionsTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return spt . ctx
2021-01-22 01:36:18 +00:00
}
2021-09-09 11:02:08 +00:00
func ( spt * showPartitionsTask ) ID ( ) UniqueID {
2021-01-18 11:32:08 +00:00
return spt . Base . MsgID
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( spt * showPartitionsTask ) SetID ( uid UniqueID ) {
2021-01-18 11:32:08 +00:00
spt . Base . MsgID = uid
2020-11-23 08:52:17 +00:00
}
2021-09-09 11:02:08 +00:00
func ( spt * showPartitionsTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return ShowPartitionTaskName
}
2021-09-09 11:02:08 +00:00
func ( spt * showPartitionsTask ) Type ( ) commonpb . MsgType {
2021-01-18 11:32:08 +00:00
return spt . Base . MsgType
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( spt * showPartitionsTask ) BeginTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return spt . Base . Timestamp
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( spt * showPartitionsTask ) EndTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return spt . Base . Timestamp
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( spt * showPartitionsTask ) SetTs ( ts Timestamp ) {
2021-01-18 11:32:08 +00:00
spt . Base . Timestamp = ts
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( spt * showPartitionsTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
spt . Base = & commonpb . MsgBase { }
return nil
}
2021-09-09 11:02:08 +00:00
func ( spt * showPartitionsTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
spt . Base . MsgType = commonpb . MsgType_ShowPartitions
2022-04-24 14:03:44 +00:00
spt . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-01-22 01:36:18 +00:00
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( spt . CollectionName ) ; err != nil {
2020-11-26 08:01:31 +00:00
return err
}
2021-08-02 14:39:25 +00:00
if spt . GetType ( ) == milvuspb . ShowType_InMemory {
for _ , partitionName := range spt . PartitionNames {
2021-10-23 10:23:44 +00:00
if err := validatePartitionTag ( partitionName , true ) ; err != nil {
2021-08-02 14:39:25 +00:00
return err
}
}
}
2020-11-19 09:09:22 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
func ( spt * showPartitionsTask ) Execute ( ctx context . Context ) error {
2021-08-02 14:39:25 +00:00
respFromRootCoord , err := spt . rootCoord . ShowPartitions ( ctx , spt . ShowPartitionsRequest )
if err != nil {
return err
2021-01-31 06:55:36 +00:00
}
2021-08-02 14:39:25 +00:00
if respFromRootCoord == nil {
return errors . New ( "failed to show partitions" )
2021-02-04 11:34:35 +00:00
}
2021-08-02 14:39:25 +00:00
if respFromRootCoord . Status . ErrorCode != commonpb . ErrorCode_Success {
return errors . New ( respFromRootCoord . Status . Reason )
}
if spt . GetType ( ) == milvuspb . ShowType_InMemory {
collectionName := spt . CollectionName
collectionID , err := globalMetaCache . GetCollectionID ( ctx , collectionName )
if err != nil {
log . Debug ( "Failed to get collection id." , zap . Any ( "collectionName" , collectionName ) ,
zap . Any ( "requestID" , spt . Base . MsgID ) , zap . Any ( "requestType" , "showPartitions" ) )
return err
}
IDs2Names := make ( map [ UniqueID ] string )
for offset , partitionName := range respFromRootCoord . PartitionNames {
partitionID := respFromRootCoord . PartitionIDs [ offset ]
IDs2Names [ partitionID ] = partitionName
}
partitionIDs := make ( [ ] UniqueID , 0 )
for _ , partitionName := range spt . PartitionNames {
partitionID , err := globalMetaCache . GetPartitionID ( ctx , collectionName , partitionName )
if err != nil {
log . Debug ( "Failed to get partition id." , zap . Any ( "partitionName" , partitionName ) ,
zap . Any ( "requestID" , spt . Base . MsgID ) , zap . Any ( "requestType" , "showPartitions" ) )
return err
}
partitionIDs = append ( partitionIDs , partitionID )
IDs2Names [ partitionID ] = partitionName
}
resp , err := spt . queryCoord . ShowPartitions ( ctx , & querypb . ShowPartitionsRequest {
Base : & commonpb . MsgBase {
MsgType : commonpb . MsgType_ShowCollections ,
MsgID : spt . Base . MsgID ,
Timestamp : spt . Base . Timestamp ,
SourceID : spt . Base . SourceID ,
} ,
CollectionID : collectionID ,
PartitionIDs : partitionIDs ,
} )
if err != nil {
return err
}
if resp == nil {
return errors . New ( "failed to show partitions" )
}
if resp . Status . ErrorCode != commonpb . ErrorCode_Success {
return errors . New ( resp . Status . Reason )
}
spt . result = & milvuspb . ShowPartitionsResponse {
Status : resp . Status ,
PartitionNames : make ( [ ] string , 0 , len ( resp . PartitionIDs ) ) ,
PartitionIDs : make ( [ ] int64 , 0 , len ( resp . PartitionIDs ) ) ,
CreatedTimestamps : make ( [ ] uint64 , 0 , len ( resp . PartitionIDs ) ) ,
CreatedUtcTimestamps : make ( [ ] uint64 , 0 , len ( resp . PartitionIDs ) ) ,
InMemoryPercentages : make ( [ ] int64 , 0 , len ( resp . PartitionIDs ) ) ,
}
for offset , id := range resp . PartitionIDs {
partitionName , ok := IDs2Names [ id ]
if ! ok {
log . Debug ( "Failed to get partition id." , zap . Any ( "partitionName" , partitionName ) ,
zap . Any ( "requestID" , spt . Base . MsgID ) , zap . Any ( "requestType" , "showPartitions" ) )
return errors . New ( "failed to show partitions" )
}
partitionInfo , err := globalMetaCache . GetPartitionInfo ( ctx , collectionName , partitionName )
if err != nil {
log . Debug ( "Failed to get partition id." , zap . Any ( "partitionName" , partitionName ) ,
zap . Any ( "requestID" , spt . Base . MsgID ) , zap . Any ( "requestType" , "showPartitions" ) )
return err
}
spt . result . PartitionIDs = append ( spt . result . PartitionIDs , id )
spt . result . PartitionNames = append ( spt . result . PartitionNames , partitionName )
spt . result . CreatedTimestamps = append ( spt . result . CreatedTimestamps , partitionInfo . createdTimestamp )
spt . result . CreatedUtcTimestamps = append ( spt . result . CreatedUtcTimestamps , partitionInfo . createdUtcTimestamp )
spt . result . InMemoryPercentages = append ( spt . result . InMemoryPercentages , resp . InMemoryPercentages [ offset ] )
}
} else {
spt . result = respFromRootCoord
}
return nil
2020-11-19 09:09:22 +00:00
}
2021-09-09 11:02:08 +00:00
func ( spt * showPartitionsTask ) PostExecute ( ctx context . Context ) error {
2020-11-19 09:09:22 +00:00
return nil
}
2020-12-22 07:39:10 +00:00
2021-09-11 03:36:22 +00:00
type createIndexTask struct {
2020-12-22 07:39:10 +00:00
Condition
2021-01-22 01:36:18 +00:00
* milvuspb . CreateIndexRequest
2022-08-25 07:48:54 +00:00
ctx context . Context
rootCoord types . RootCoord
indexCoord types . IndexCoord
result * commonpb . Status
2022-03-02 08:23:55 +00:00
collectionID UniqueID
2022-08-25 07:48:54 +00:00
fieldSchema * schemapb . FieldSchema
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( cit * createIndexTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return cit . ctx
2021-01-22 01:36:18 +00:00
}
2021-09-11 03:36:22 +00:00
func ( cit * createIndexTask ) ID ( ) UniqueID {
2021-01-18 11:32:08 +00:00
return cit . Base . MsgID
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( cit * createIndexTask ) SetID ( uid UniqueID ) {
2021-01-18 11:32:08 +00:00
cit . Base . MsgID = uid
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( cit * createIndexTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return CreateIndexTaskName
}
2021-09-11 03:36:22 +00:00
func ( cit * createIndexTask ) Type ( ) commonpb . MsgType {
2021-01-18 11:32:08 +00:00
return cit . Base . MsgType
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( cit * createIndexTask ) BeginTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return cit . Base . Timestamp
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( cit * createIndexTask ) EndTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return cit . Base . Timestamp
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( cit * createIndexTask ) SetTs ( ts Timestamp ) {
2021-01-18 11:32:08 +00:00
cit . Base . Timestamp = ts
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( cit * createIndexTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
cit . Base = & commonpb . MsgBase { }
return nil
}
2022-04-29 10:01:49 +00:00
func parseIndexParams ( m [ ] * commonpb . KeyValuePair ) ( map [ string ] string , error ) {
2021-06-22 07:28:04 +00:00
indexParams := make ( map [ string ] string )
2022-04-29 10:01:49 +00:00
for _ , kv := range m {
2021-06-22 07:28:04 +00:00
if kv . Key == "params" { // TODO(dragondriver): change `params` to const variable
params , err := funcutil . ParseIndexParamsMap ( kv . Value )
if err != nil {
2022-04-29 10:01:49 +00:00
return nil , err
2021-06-22 07:28:04 +00:00
}
for k , v := range params {
indexParams [ k ] = v
}
} else {
indexParams [ kv . Key ] = kv . Value
}
}
2022-04-29 10:01:49 +00:00
_ , exist := indexParams [ "index_type" ] // TODO(dragondriver): change `index_type` to const variable
2021-06-22 07:28:04 +00:00
if ! exist {
2022-09-29 01:32:55 +00:00
//return nil, errors.New("there is no index_type in index params")
2022-04-29 10:01:49 +00:00
indexParams [ "index_type" ] = indexparamcheck . IndexFaissIvfPQ // IVF_PQ is the default index type
2021-06-22 07:28:04 +00:00
}
2022-04-29 10:01:49 +00:00
return indexParams , nil
}
2021-06-22 07:28:04 +00:00
2022-04-29 10:01:49 +00:00
func ( cit * createIndexTask ) getIndexedField ( ctx context . Context ) ( * schemapb . FieldSchema , error ) {
schema , err := globalMetaCache . GetCollectionSchema ( ctx , cit . GetCollectionName ( ) )
if err != nil {
log . Error ( "failed to get collection schema" , zap . Error ( err ) )
return nil , fmt . Errorf ( "failed to get collection schema: %s" , err )
}
schemaHelper , err := typeutil . CreateSchemaHelper ( schema )
if err != nil {
log . Error ( "failed to parse collection schema" , zap . Error ( err ) )
return nil , fmt . Errorf ( "failed to parse collection schema: %s" , err )
}
field , err := schemaHelper . GetFieldFromName ( cit . GetFieldName ( ) )
if err != nil {
log . Error ( "create index on non-exist field" , zap . Error ( err ) )
return nil , fmt . Errorf ( "cannot create index on non-exist field: %s" , cit . GetFieldName ( ) )
}
return field , nil
}
2022-04-29 05:35:49 +00:00
2022-04-29 10:01:49 +00:00
func fillDimension ( field * schemapb . FieldSchema , indexParams map [ string ] string ) error {
2022-03-21 06:23:24 +00:00
vecDataTypes := [ ] schemapb . DataType {
schemapb . DataType_FloatVector ,
schemapb . DataType_BinaryVector ,
}
2022-04-29 10:01:49 +00:00
if ! funcutil . SliceContain ( vecDataTypes , field . GetDataType ( ) ) {
return nil
}
params := make ( [ ] * commonpb . KeyValuePair , 0 , len ( field . GetTypeParams ( ) ) + len ( field . GetIndexParams ( ) ) )
params = append ( params , field . GetTypeParams ( ) ... )
params = append ( params , field . GetIndexParams ( ) ... )
dimensionInSchema , err := funcutil . GetAttrByKeyFromRepeatedKV ( "dim" , params )
if err != nil {
return fmt . Errorf ( "dimension not found in schema" )
}
dimension , exist := indexParams [ "dim" ]
if exist {
if dimensionInSchema != dimension {
return fmt . Errorf ( "dimension mismatch, dimension in schema: %s, dimension: %s" , dimensionInSchema , dimension )
2022-03-21 06:23:24 +00:00
}
2022-04-29 10:01:49 +00:00
} else {
indexParams [ "dim" ] = dimensionInSchema
}
return nil
}
func checkTrain ( field * schemapb . FieldSchema , indexParams map [ string ] string ) error {
indexType := indexParams [ "index_type" ]
// skip params check of non-vector field.
vecDataTypes := [ ] schemapb . DataType {
schemapb . DataType_FloatVector ,
schemapb . DataType_BinaryVector ,
}
if ! funcutil . SliceContain ( vecDataTypes , field . GetDataType ( ) ) {
return indexparamcheck . CheckIndexValid ( field . GetDataType ( ) , indexType , indexParams )
2022-03-21 06:23:24 +00:00
}
2021-06-22 07:28:04 +00:00
adapter , err := indexparamcheck . GetConfAdapterMgrInstance ( ) . GetAdapter ( indexType )
if err != nil {
log . Warn ( "Failed to get conf adapter" , zap . String ( "index_type" , indexType ) )
return fmt . Errorf ( "invalid index type: %s" , indexType )
}
2022-04-29 10:01:49 +00:00
if err := fillDimension ( field , indexParams ) ; err != nil {
return err
}
2022-09-21 12:16:51 +00:00
ok := adapter . CheckValidDataType ( field . GetDataType ( ) )
if ! ok {
log . Warn ( "Field data type don't support the index build type" , zap . String ( "fieldDataType" , field . GetDataType ( ) . String ( ) ) , zap . String ( "indexType" , indexType ) )
return fmt . Errorf ( "field data type %s don't support the index build type %s" , field . GetDataType ( ) . String ( ) , indexType )
}
ok = adapter . CheckTrain ( indexParams )
2021-06-22 07:28:04 +00:00
if ! ok {
log . Warn ( "Create index with invalid params" , zap . Any ( "index_params" , indexParams ) )
2022-04-29 10:01:49 +00:00
return fmt . Errorf ( "invalid index params: %v" , indexParams )
2021-06-22 07:28:04 +00:00
}
2020-12-22 07:39:10 +00:00
return nil
}
2022-04-29 10:01:49 +00:00
func ( cit * createIndexTask ) PreExecute ( ctx context . Context ) error {
cit . Base . MsgType = commonpb . MsgType_CreateIndex
cit . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
collName := cit . CollectionName
collID , err := globalMetaCache . GetCollectionID ( ctx , collName )
if err != nil {
return err
}
cit . collectionID = collID
field , err := cit . getIndexedField ( ctx )
if err != nil {
return err
}
2022-08-25 07:48:54 +00:00
cit . fieldSchema = field
2022-04-29 10:01:49 +00:00
// check index param, not accurate, only some static rules
indexParams , err := parseIndexParams ( cit . GetExtraParams ( ) )
if err != nil {
log . Error ( "failed to parse index params" , zap . Error ( err ) )
return fmt . Errorf ( "failed to parse index params: %s" , err )
}
return checkTrain ( field , indexParams )
}
2021-09-11 03:36:22 +00:00
func ( cit * createIndexTask ) Execute ( ctx context . Context ) error {
2022-08-25 07:48:54 +00:00
log . Debug ( "proxy create index" , zap . Int64 ( "collID" , cit . collectionID ) , zap . Int64 ( "fieldID" , cit . fieldSchema . GetFieldID ( ) ) ,
zap . String ( "indexName" , cit . GetIndexName ( ) ) , zap . Any ( "typeParams" , cit . fieldSchema . GetTypeParams ( ) ) ,
zap . Any ( "indexParams" , cit . GetExtraParams ( ) ) )
indexParams := cit . GetExtraParams ( )
if ! typeutil . IsVectorType ( cit . fieldSchema . DataType ) {
if cit . fieldSchema . DataType == schemapb . DataType_VarChar {
indexParams = [ ] * commonpb . KeyValuePair { { Key : "index_type" , Value : DefaultStringIndexType } }
} else {
indexParams = [ ] * commonpb . KeyValuePair { { Key : "index_type" , Value : DefaultIndexType } }
}
}
if cit . IndexName == "" {
2022-09-29 09:14:54 +00:00
cit . IndexName = Params . CommonCfg . DefaultIndexName + "_" + strconv . FormatInt ( cit . fieldSchema . GetFieldID ( ) , 10 )
2022-08-25 07:48:54 +00:00
}
2021-02-04 11:34:35 +00:00
var err error
2022-08-25 07:48:54 +00:00
req := & indexpb . CreateIndexRequest {
CollectionID : cit . collectionID ,
FieldID : cit . fieldSchema . GetFieldID ( ) ,
IndexName : cit . GetIndexName ( ) ,
TypeParams : cit . fieldSchema . GetTypeParams ( ) ,
IndexParams : indexParams ,
Timestamp : cit . BeginTs ( ) ,
}
cit . result , err = cit . indexCoord . CreateIndex ( ctx , req )
//cit.result, err = cit.rootCoord.CreateIndex(ctx, cit.CreateIndexRequest)
2022-09-16 03:12:47 +00:00
if err != nil {
return err
2021-02-04 11:34:35 +00:00
}
2021-03-10 14:06:22 +00:00
if cit . result . ErrorCode != commonpb . ErrorCode_Success {
2021-02-04 11:34:35 +00:00
return errors . New ( cit . result . Reason )
}
2020-12-22 07:39:10 +00:00
return err
}
2021-09-11 03:36:22 +00:00
func ( cit * createIndexTask ) PostExecute ( ctx context . Context ) error {
2020-12-22 07:39:10 +00:00
return nil
}
2021-09-11 03:36:22 +00:00
type describeIndexTask struct {
2020-12-22 07:39:10 +00:00
Condition
2021-01-22 01:36:18 +00:00
* milvuspb . DescribeIndexRequest
2022-08-25 07:48:54 +00:00
ctx context . Context
indexCoord types . IndexCoord
result * milvuspb . DescribeIndexResponse
2022-03-02 08:23:55 +00:00
collectionID UniqueID
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( dit * describeIndexTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return dit . ctx
2021-01-22 01:36:18 +00:00
}
2021-09-11 03:36:22 +00:00
func ( dit * describeIndexTask ) ID ( ) UniqueID {
2021-01-18 11:32:08 +00:00
return dit . Base . MsgID
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( dit * describeIndexTask ) SetID ( uid UniqueID ) {
2021-01-18 11:32:08 +00:00
dit . Base . MsgID = uid
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( dit * describeIndexTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return DescribeIndexTaskName
}
2021-09-11 03:36:22 +00:00
func ( dit * describeIndexTask ) Type ( ) commonpb . MsgType {
2021-01-18 11:32:08 +00:00
return dit . Base . MsgType
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( dit * describeIndexTask ) BeginTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return dit . Base . Timestamp
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( dit * describeIndexTask ) EndTs ( ) Timestamp {
2021-01-18 11:32:08 +00:00
return dit . Base . Timestamp
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( dit * describeIndexTask ) SetTs ( ts Timestamp ) {
2021-01-18 11:32:08 +00:00
dit . Base . Timestamp = ts
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( dit * describeIndexTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
dit . Base = & commonpb . MsgBase { }
return nil
}
2021-09-11 03:36:22 +00:00
func ( dit * describeIndexTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
dit . Base . MsgType = commonpb . MsgType_DescribeIndex
2022-04-24 14:03:44 +00:00
dit . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-01-22 01:36:18 +00:00
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( dit . CollectionName ) ; err != nil {
2020-12-22 07:39:10 +00:00
return err
}
2022-03-02 08:23:55 +00:00
collID , _ := globalMetaCache . GetCollectionID ( ctx , dit . CollectionName )
dit . collectionID = collID
2020-12-22 07:39:10 +00:00
return nil
}
2021-09-11 03:36:22 +00:00
func ( dit * describeIndexTask ) Execute ( ctx context . Context ) error {
2022-08-25 07:48:54 +00:00
schema , err := globalMetaCache . GetCollectionSchema ( ctx , dit . GetCollectionName ( ) )
if err != nil {
log . Error ( "failed to get collection schema" , zap . Error ( err ) )
return fmt . Errorf ( "failed to get collection schema: %s" , err )
2021-02-04 11:34:35 +00:00
}
2022-08-25 07:48:54 +00:00
schemaHelper , err := typeutil . CreateSchemaHelper ( schema )
if err != nil {
log . Error ( "failed to parse collection schema" , zap . Error ( err ) )
return fmt . Errorf ( "failed to parse collection schema: %s" , err )
}
2022-09-26 11:10:53 +00:00
resp , err := dit . indexCoord . DescribeIndex ( ctx , & indexpb . DescribeIndexRequest { CollectionID : dit . collectionID , IndexName : dit . IndexName } )
2022-08-25 07:48:54 +00:00
if err != nil || resp == nil {
return err
}
dit . result = & milvuspb . DescribeIndexResponse { }
dit . result . Status = resp . GetStatus ( )
2021-03-10 14:06:22 +00:00
if dit . result . Status . ErrorCode != commonpb . ErrorCode_Success {
2021-02-04 11:34:35 +00:00
return errors . New ( dit . result . Status . Reason )
}
2022-08-25 07:48:54 +00:00
for _ , indexInfo := range resp . IndexInfos {
field , err := schemaHelper . GetFieldFromID ( indexInfo . FieldID )
if err != nil {
log . Error ( "failed to get collection field" , zap . Error ( err ) )
return fmt . Errorf ( "failed to get collection field: %d" , indexInfo . FieldID )
}
dit . result . IndexDescriptions = append ( dit . result . IndexDescriptions , & milvuspb . IndexDescription {
2022-09-27 11:12:54 +00:00
IndexName : indexInfo . GetIndexName ( ) ,
IndexID : indexInfo . GetIndexID ( ) ,
FieldName : field . Name ,
Params : indexInfo . GetIndexParams ( ) ,
IndexedRows : indexInfo . GetIndexedRows ( ) ,
TotalRows : indexInfo . GetTotalRows ( ) ,
State : indexInfo . GetState ( ) ,
IndexStateFailReason : indexInfo . GetIndexStateFailReason ( ) ,
2022-08-25 07:48:54 +00:00
} )
}
2020-12-22 07:39:10 +00:00
return err
}
2021-09-11 03:36:22 +00:00
func ( dit * describeIndexTask ) PostExecute ( ctx context . Context ) error {
2020-12-22 07:39:10 +00:00
return nil
}
2021-09-11 03:36:22 +00:00
type dropIndexTask struct {
2021-02-20 10:30:37 +00:00
Condition
2021-02-23 01:58:06 +00:00
ctx context . Context
2021-02-20 10:30:37 +00:00
* milvuspb . DropIndexRequest
2022-08-25 07:48:54 +00:00
indexCoord types . IndexCoord
result * commonpb . Status
2022-03-02 08:23:55 +00:00
collectionID UniqueID
2021-02-20 10:30:37 +00:00
}
2021-09-11 03:36:22 +00:00
func ( dit * dropIndexTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return dit . ctx
2021-02-20 10:30:37 +00:00
}
2021-09-11 03:36:22 +00:00
func ( dit * dropIndexTask ) ID ( ) UniqueID {
2021-02-20 10:30:37 +00:00
return dit . Base . MsgID
}
2021-09-11 03:36:22 +00:00
func ( dit * dropIndexTask ) SetID ( uid UniqueID ) {
2021-02-20 10:30:37 +00:00
dit . Base . MsgID = uid
}
2021-09-11 03:36:22 +00:00
func ( dit * dropIndexTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return DropIndexTaskName
}
2021-09-11 03:36:22 +00:00
func ( dit * dropIndexTask ) Type ( ) commonpb . MsgType {
2021-02-20 10:30:37 +00:00
return dit . Base . MsgType
}
2021-09-11 03:36:22 +00:00
func ( dit * dropIndexTask ) BeginTs ( ) Timestamp {
2021-02-20 10:30:37 +00:00
return dit . Base . Timestamp
}
2021-09-11 03:36:22 +00:00
func ( dit * dropIndexTask ) EndTs ( ) Timestamp {
2021-02-20 10:30:37 +00:00
return dit . Base . Timestamp
}
2021-09-11 03:36:22 +00:00
func ( dit * dropIndexTask ) SetTs ( ts Timestamp ) {
2021-02-20 10:30:37 +00:00
dit . Base . Timestamp = ts
}
2021-09-11 03:36:22 +00:00
func ( dit * dropIndexTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
dit . Base = & commonpb . MsgBase { }
return nil
}
2021-09-11 03:36:22 +00:00
func ( dit * dropIndexTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
dit . Base . MsgType = commonpb . MsgType_DropIndex
2022-04-24 14:03:44 +00:00
dit . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-02-20 10:30:37 +00:00
collName , fieldName := dit . CollectionName , dit . FieldName
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( collName ) ; err != nil {
2021-02-20 10:30:37 +00:00
return err
}
2021-10-23 10:25:37 +00:00
if err := validateFieldName ( fieldName ) ; err != nil {
2021-02-20 10:30:37 +00:00
return err
}
2021-06-30 09:56:12 +00:00
if dit . IndexName == "" {
2022-01-10 11:03:35 +00:00
dit . IndexName = Params . CommonCfg . DefaultIndexName
2021-06-30 09:56:12 +00:00
}
2022-03-02 08:23:55 +00:00
collID , _ := globalMetaCache . GetCollectionID ( ctx , dit . CollectionName )
dit . collectionID = collID
2021-02-20 10:30:37 +00:00
return nil
}
2021-09-11 03:36:22 +00:00
func ( dit * dropIndexTask ) Execute ( ctx context . Context ) error {
2021-02-20 10:30:37 +00:00
var err error
2022-08-25 07:48:54 +00:00
dit . result , err = dit . indexCoord . DropIndex ( ctx , & indexpb . DropIndexRequest {
CollectionID : dit . collectionID ,
2022-09-23 01:36:51 +00:00
PartitionIDs : nil ,
2022-08-25 07:48:54 +00:00
IndexName : dit . IndexName ,
} )
2021-02-20 10:30:37 +00:00
if dit . result == nil {
return errors . New ( "drop index resp is nil" )
}
2021-03-10 14:06:22 +00:00
if dit . result . ErrorCode != commonpb . ErrorCode_Success {
2021-02-20 10:30:37 +00:00
return errors . New ( dit . result . Reason )
}
return err
}
2021-09-11 03:36:22 +00:00
func ( dit * dropIndexTask ) PostExecute ( ctx context . Context ) error {
2021-02-20 10:30:37 +00:00
return nil
}
2022-09-27 11:12:54 +00:00
// Deprecated: use describeIndexTask instead
2021-09-11 03:36:22 +00:00
type getIndexBuildProgressTask struct {
2021-04-28 03:15:28 +00:00
Condition
* milvuspb . GetIndexBuildProgressRequest
2021-06-21 10:22:13 +00:00
ctx context . Context
indexCoord types . IndexCoord
rootCoord types . RootCoord
dataCoord types . DataCoord
result * milvuspb . GetIndexBuildProgressResponse
2022-03-02 08:23:55 +00:00
collectionID UniqueID
2021-04-28 03:15:28 +00:00
}
2021-09-11 03:36:22 +00:00
func ( gibpt * getIndexBuildProgressTask ) TraceCtx ( ) context . Context {
2021-04-28 03:15:28 +00:00
return gibpt . ctx
}
2021-09-11 03:36:22 +00:00
func ( gibpt * getIndexBuildProgressTask ) ID ( ) UniqueID {
2021-04-28 03:15:28 +00:00
return gibpt . Base . MsgID
}
2021-09-11 03:36:22 +00:00
func ( gibpt * getIndexBuildProgressTask ) SetID ( uid UniqueID ) {
2021-04-28 03:15:28 +00:00
gibpt . Base . MsgID = uid
}
2021-09-11 03:36:22 +00:00
func ( gibpt * getIndexBuildProgressTask ) Name ( ) string {
2021-04-28 03:15:28 +00:00
return GetIndexBuildProgressTaskName
}
2021-09-11 03:36:22 +00:00
func ( gibpt * getIndexBuildProgressTask ) Type ( ) commonpb . MsgType {
2021-04-28 03:15:28 +00:00
return gibpt . Base . MsgType
}
2021-09-11 03:36:22 +00:00
func ( gibpt * getIndexBuildProgressTask ) BeginTs ( ) Timestamp {
2021-04-28 03:15:28 +00:00
return gibpt . Base . Timestamp
}
2021-09-11 03:36:22 +00:00
func ( gibpt * getIndexBuildProgressTask ) EndTs ( ) Timestamp {
2021-04-28 03:15:28 +00:00
return gibpt . Base . Timestamp
}
2021-09-11 03:36:22 +00:00
func ( gibpt * getIndexBuildProgressTask ) SetTs ( ts Timestamp ) {
2021-04-28 03:15:28 +00:00
gibpt . Base . Timestamp = ts
}
2021-09-11 03:36:22 +00:00
func ( gibpt * getIndexBuildProgressTask ) OnEnqueue ( ) error {
2021-04-28 03:15:28 +00:00
gibpt . Base = & commonpb . MsgBase { }
return nil
}
2021-09-11 03:36:22 +00:00
func ( gibpt * getIndexBuildProgressTask ) PreExecute ( ctx context . Context ) error {
2021-04-28 03:15:28 +00:00
gibpt . Base . MsgType = commonpb . MsgType_GetIndexBuildProgress
2022-04-24 14:03:44 +00:00
gibpt . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-04-28 03:15:28 +00:00
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( gibpt . CollectionName ) ; err != nil {
2021-04-28 03:15:28 +00:00
return err
}
return nil
}
2021-09-11 03:36:22 +00:00
func ( gibpt * getIndexBuildProgressTask ) Execute ( ctx context . Context ) error {
2021-04-28 03:15:28 +00:00
collectionName := gibpt . CollectionName
collectionID , err := globalMetaCache . GetCollectionID ( ctx , collectionName )
if err != nil { // err is not nil if collection not exists
return err
}
2022-03-02 08:23:55 +00:00
gibpt . collectionID = collectionID
2021-04-28 03:15:28 +00:00
if gibpt . IndexName == "" {
2022-01-10 11:03:35 +00:00
gibpt . IndexName = Params . CommonCfg . DefaultIndexName
2021-04-28 03:15:28 +00:00
}
2022-08-25 07:48:54 +00:00
resp , err := gibpt . indexCoord . GetIndexBuildProgress ( ctx , & indexpb . GetIndexBuildProgressRequest {
CollectionID : collectionID ,
IndexName : gibpt . IndexName ,
2021-04-28 03:15:28 +00:00
} )
if err != nil {
return err
}
gibpt . result = & milvuspb . GetIndexBuildProgressResponse {
2022-08-25 07:48:54 +00:00
Status : resp . Status ,
TotalRows : resp . GetTotalRows ( ) ,
IndexedRows : resp . GetIndexedRows ( ) ,
2021-04-28 03:15:28 +00:00
}
return nil
}
2021-09-11 03:36:22 +00:00
func ( gibpt * getIndexBuildProgressTask ) PostExecute ( ctx context . Context ) error {
2021-04-28 03:15:28 +00:00
return nil
}
2022-09-27 11:12:54 +00:00
// Deprecated: use describeIndexTask instead
2021-09-11 03:36:22 +00:00
type getIndexStateTask struct {
2020-12-22 07:39:10 +00:00
Condition
2021-03-12 06:22:09 +00:00
* milvuspb . GetIndexStateRequest
2021-06-21 09:28:03 +00:00
ctx context . Context
indexCoord types . IndexCoord
rootCoord types . RootCoord
result * milvuspb . GetIndexStateResponse
2022-03-02 08:23:55 +00:00
collectionID UniqueID
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( gist * getIndexStateTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return gist . ctx
2021-01-22 01:36:18 +00:00
}
2021-09-11 03:36:22 +00:00
func ( gist * getIndexStateTask ) ID ( ) UniqueID {
2021-02-23 01:58:06 +00:00
return gist . Base . MsgID
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( gist * getIndexStateTask ) SetID ( uid UniqueID ) {
2021-02-23 01:58:06 +00:00
gist . Base . MsgID = uid
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( gist * getIndexStateTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return GetIndexStateTaskName
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( gist * getIndexStateTask ) Type ( ) commonpb . MsgType {
2021-02-23 01:58:06 +00:00
return gist . Base . MsgType
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( gist * getIndexStateTask ) BeginTs ( ) Timestamp {
2021-02-23 01:58:06 +00:00
return gist . Base . Timestamp
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( gist * getIndexStateTask ) EndTs ( ) Timestamp {
2021-02-23 01:58:06 +00:00
return gist . Base . Timestamp
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( gist * getIndexStateTask ) SetTs ( ts Timestamp ) {
2021-02-23 01:58:06 +00:00
gist . Base . Timestamp = ts
}
2021-09-11 03:36:22 +00:00
func ( gist * getIndexStateTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
gist . Base = & commonpb . MsgBase { }
return nil
}
2021-01-22 01:36:18 +00:00
2021-09-11 03:36:22 +00:00
func ( gist * getIndexStateTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
gist . Base . MsgType = commonpb . MsgType_GetIndexState
2022-04-24 14:03:44 +00:00
gist . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-02-23 01:58:06 +00:00
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( gist . CollectionName ) ; err != nil {
2020-12-22 07:39:10 +00:00
return err
}
return nil
}
2022-04-29 05:35:49 +00:00
func ( gist * getIndexStateTask ) Execute ( ctx context . Context ) error {
if gist . IndexName == "" {
gist . IndexName = Params . CommonCfg . DefaultIndexName
}
2022-08-25 07:48:54 +00:00
collectionID , err := globalMetaCache . GetCollectionID ( ctx , gist . CollectionName )
if err != nil {
return err
}
state , err := gist . indexCoord . GetIndexState ( ctx , & indexpb . GetIndexStateRequest {
CollectionID : collectionID ,
IndexName : gist . IndexName ,
} )
2022-04-29 05:35:49 +00:00
if err != nil {
return err
}
2021-06-21 12:34:16 +00:00
gist . result = & milvuspb . GetIndexStateResponse {
Status : & commonpb . Status {
ErrorCode : commonpb . ErrorCode_Success ,
Reason : "" ,
} ,
2022-08-25 07:48:54 +00:00
State : state . GetState ( ) ,
FailReason : state . GetFailReason ( ) ,
2021-02-19 01:52:06 +00:00
}
2021-01-28 12:51:44 +00:00
return nil
2020-12-22 07:39:10 +00:00
}
2021-09-11 03:36:22 +00:00
func ( gist * getIndexStateTask ) PostExecute ( ctx context . Context ) error {
2020-12-22 07:39:10 +00:00
return nil
}
2021-02-02 02:58:39 +00:00
2021-09-11 03:36:22 +00:00
type flushTask struct {
2021-02-02 02:58:39 +00:00
Condition
* milvuspb . FlushRequest
2021-06-21 10:22:13 +00:00
ctx context . Context
dataCoord types . DataCoord
2021-06-23 08:56:11 +00:00
result * milvuspb . FlushResponse
2021-02-02 02:58:39 +00:00
}
2021-09-11 03:36:22 +00:00
func ( ft * flushTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return ft . ctx
2021-02-02 02:58:39 +00:00
}
2021-09-11 03:36:22 +00:00
func ( ft * flushTask ) ID ( ) UniqueID {
2021-02-02 02:58:39 +00:00
return ft . Base . MsgID
}
2021-09-11 03:36:22 +00:00
func ( ft * flushTask ) SetID ( uid UniqueID ) {
2021-02-02 02:58:39 +00:00
ft . Base . MsgID = uid
}
2021-09-11 03:36:22 +00:00
func ( ft * flushTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return FlushTaskName
}
2021-09-11 03:36:22 +00:00
func ( ft * flushTask ) Type ( ) commonpb . MsgType {
2021-02-02 02:58:39 +00:00
return ft . Base . MsgType
}
2021-09-11 03:36:22 +00:00
func ( ft * flushTask ) BeginTs ( ) Timestamp {
2021-02-02 02:58:39 +00:00
return ft . Base . Timestamp
}
2021-09-11 03:36:22 +00:00
func ( ft * flushTask ) EndTs ( ) Timestamp {
2021-02-02 02:58:39 +00:00
return ft . Base . Timestamp
}
2021-09-11 03:36:22 +00:00
func ( ft * flushTask ) SetTs ( ts Timestamp ) {
2021-02-02 02:58:39 +00:00
ft . Base . Timestamp = ts
}
2021-09-11 03:36:22 +00:00
func ( ft * flushTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
ft . Base = & commonpb . MsgBase { }
return nil
}
2021-09-11 03:36:22 +00:00
func ( ft * flushTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
ft . Base . MsgType = commonpb . MsgType_Flush
2022-04-24 14:03:44 +00:00
ft . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-02-02 02:58:39 +00:00
return nil
}
2021-09-11 03:36:22 +00:00
func ( ft * flushTask ) Execute ( ctx context . Context ) error {
2021-06-23 08:56:11 +00:00
coll2Segments := make ( map [ string ] * schemapb . LongArray )
2022-09-09 01:58:37 +00:00
flushColl2Segments := make ( map [ string ] * schemapb . LongArray )
coll2SealTimes := make ( map [ string ] int64 )
2021-02-03 09:30:10 +00:00
for _ , collName := range ft . CollectionNames {
2021-02-26 09:44:24 +00:00
collID , err := globalMetaCache . GetCollectionID ( ctx , collName )
2021-02-03 09:30:10 +00:00
if err != nil {
return err
}
flushReq := & datapb . FlushRequest {
Base : & commonpb . MsgBase {
2021-03-10 06:45:35 +00:00
MsgType : commonpb . MsgType_Flush ,
2021-02-03 09:30:10 +00:00
MsgID : ft . Base . MsgID ,
Timestamp : ft . Base . Timestamp ,
SourceID : ft . Base . SourceID ,
} ,
DbID : 0 ,
CollectionID : collID ,
}
2021-06-23 08:56:11 +00:00
resp , err := ft . dataCoord . Flush ( ctx , flushReq )
if err != nil {
2021-11-29 04:25:17 +00:00
return fmt . Errorf ( "failed to call flush to data coordinator: %s" , err . Error ( ) )
2021-02-03 09:30:10 +00:00
}
2021-06-23 08:56:11 +00:00
if resp . Status . ErrorCode != commonpb . ErrorCode_Success {
return errors . New ( resp . Status . Reason )
2021-02-03 09:30:10 +00:00
}
2021-06-23 08:56:11 +00:00
coll2Segments [ collName ] = & schemapb . LongArray { Data : resp . GetSegmentIDs ( ) }
2022-09-09 01:58:37 +00:00
flushColl2Segments [ collName ] = & schemapb . LongArray { Data : resp . GetFlushSegmentIDs ( ) }
coll2SealTimes [ collName ] = resp . GetTimeOfSeal ( )
2021-02-02 02:58:39 +00:00
}
2021-06-23 08:56:11 +00:00
ft . result = & milvuspb . FlushResponse {
Status : & commonpb . Status {
ErrorCode : commonpb . ErrorCode_Success ,
Reason : "" ,
} ,
2022-09-09 01:58:37 +00:00
DbName : "" ,
CollSegIDs : coll2Segments ,
FlushCollSegIDs : flushColl2Segments ,
CollSealTimes : coll2SealTimes ,
2021-02-02 02:58:39 +00:00
}
2021-02-03 09:30:10 +00:00
return nil
2021-02-02 02:58:39 +00:00
}
2021-09-11 03:36:22 +00:00
func ( ft * flushTask ) PostExecute ( ctx context . Context ) error {
2021-02-02 02:58:39 +00:00
return nil
}
2021-02-04 07:31:02 +00:00
2021-09-09 11:02:08 +00:00
type loadCollectionTask struct {
2021-02-04 07:31:02 +00:00
Condition
* milvuspb . LoadCollectionRequest
2021-06-22 08:44:09 +00:00
ctx context . Context
queryCoord types . QueryCoord
result * commonpb . Status
2022-03-02 08:23:55 +00:00
collectionID UniqueID
2021-02-04 07:31:02 +00:00
}
2021-09-09 11:02:08 +00:00
func ( lct * loadCollectionTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return lct . ctx
2021-02-04 07:31:02 +00:00
}
2021-09-09 11:02:08 +00:00
func ( lct * loadCollectionTask ) ID ( ) UniqueID {
2021-02-04 07:31:02 +00:00
return lct . Base . MsgID
}
2021-09-09 11:02:08 +00:00
func ( lct * loadCollectionTask ) SetID ( uid UniqueID ) {
2021-02-04 07:31:02 +00:00
lct . Base . MsgID = uid
}
2021-09-09 11:02:08 +00:00
func ( lct * loadCollectionTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return LoadCollectionTaskName
}
2021-09-09 11:02:08 +00:00
func ( lct * loadCollectionTask ) Type ( ) commonpb . MsgType {
2021-02-04 07:31:02 +00:00
return lct . Base . MsgType
}
2021-09-09 11:02:08 +00:00
func ( lct * loadCollectionTask ) BeginTs ( ) Timestamp {
2021-02-04 07:31:02 +00:00
return lct . Base . Timestamp
}
2021-09-09 11:02:08 +00:00
func ( lct * loadCollectionTask ) EndTs ( ) Timestamp {
2021-02-04 07:31:02 +00:00
return lct . Base . Timestamp
}
2021-09-09 11:02:08 +00:00
func ( lct * loadCollectionTask ) SetTs ( ts Timestamp ) {
2021-02-04 07:31:02 +00:00
lct . Base . Timestamp = ts
}
2021-09-09 11:02:08 +00:00
func ( lct * loadCollectionTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
lct . Base = & commonpb . MsgBase { }
return nil
}
2021-09-09 11:02:08 +00:00
func ( lct * loadCollectionTask ) PreExecute ( ctx context . Context ) error {
2021-12-13 02:01:18 +00:00
log . Debug ( "loadCollectionTask PreExecute" , zap . String ( "role" , typeutil . ProxyRole ) , zap . Int64 ( "msgID" , lct . Base . MsgID ) )
2021-03-10 06:45:35 +00:00
lct . Base . MsgType = commonpb . MsgType_LoadCollection
2022-04-24 14:03:44 +00:00
lct . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-02-04 07:31:02 +00:00
collName := lct . CollectionName
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( collName ) ; err != nil {
2021-02-04 07:31:02 +00:00
return err
}
2022-06-21 09:26:15 +00:00
// To compat with LoadCollcetion before Milvus@2.1
if lct . ReplicaNumber == 0 {
lct . ReplicaNumber = 1
}
2021-02-04 07:31:02 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
func ( lct * loadCollectionTask ) Execute ( ctx context . Context ) ( err error ) {
2021-12-13 02:01:18 +00:00
log . Debug ( "loadCollectionTask Execute" , zap . String ( "role" , typeutil . ProxyRole ) , zap . Int64 ( "msgID" , lct . Base . MsgID ) )
2021-02-26 09:44:24 +00:00
collID , err := globalMetaCache . GetCollectionID ( ctx , lct . CollectionName )
2021-02-04 07:31:02 +00:00
if err != nil {
return err
}
2022-07-05 13:16:20 +00:00
2022-03-02 08:23:55 +00:00
lct . collectionID = collID
2021-02-26 09:44:24 +00:00
collSchema , err := globalMetaCache . GetCollectionSchema ( ctx , lct . CollectionName )
2021-02-06 13:17:18 +00:00
if err != nil {
return err
}
2021-02-04 07:31:02 +00:00
request := & querypb . LoadCollectionRequest {
Base : & commonpb . MsgBase {
2021-03-10 06:45:35 +00:00
MsgType : commonpb . MsgType_LoadCollection ,
2021-02-04 07:31:02 +00:00
MsgID : lct . Base . MsgID ,
Timestamp : lct . Base . Timestamp ,
SourceID : lct . Base . SourceID ,
} ,
2022-04-20 08:15:41 +00:00
DbID : 0 ,
CollectionID : collID ,
Schema : collSchema ,
ReplicaNumber : lct . ReplicaNumber ,
2021-02-04 07:31:02 +00:00
}
2021-12-13 02:01:18 +00:00
log . Debug ( "send LoadCollectionRequest to query coordinator" , zap . String ( "role" , typeutil . ProxyRole ) ,
zap . Int64 ( "msgID" , request . Base . MsgID ) , zap . Int64 ( "collectionID" , request . CollectionID ) ,
2021-03-13 03:59:24 +00:00
zap . Any ( "schema" , request . Schema ) )
2021-06-22 08:44:09 +00:00
lct . result , err = lct . queryCoord . LoadCollection ( ctx , request )
2021-03-13 03:59:24 +00:00
if err != nil {
2021-06-22 08:44:09 +00:00
return fmt . Errorf ( "call query coordinator LoadCollection: %s" , err )
2021-03-13 03:59:24 +00:00
}
return nil
2021-02-04 07:31:02 +00:00
}
2021-09-09 11:02:08 +00:00
func ( lct * loadCollectionTask ) PostExecute ( ctx context . Context ) error {
2021-12-13 02:01:18 +00:00
log . Debug ( "loadCollectionTask PostExecute" , zap . String ( "role" , typeutil . ProxyRole ) ,
zap . Int64 ( "msgID" , lct . Base . MsgID ) )
2021-02-04 07:31:02 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
type releaseCollectionTask struct {
2021-02-04 07:31:02 +00:00
Condition
* milvuspb . ReleaseCollectionRequest
2021-06-22 08:44:09 +00:00
ctx context . Context
queryCoord types . QueryCoord
result * commonpb . Status
chMgr channelsMgr
2022-03-02 08:23:55 +00:00
collectionID UniqueID
2021-02-04 07:31:02 +00:00
}
2021-09-09 11:02:08 +00:00
func ( rct * releaseCollectionTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return rct . ctx
2021-02-04 07:31:02 +00:00
}
2021-09-09 11:02:08 +00:00
func ( rct * releaseCollectionTask ) ID ( ) UniqueID {
2021-02-04 07:31:02 +00:00
return rct . Base . MsgID
}
2021-09-09 11:02:08 +00:00
func ( rct * releaseCollectionTask ) SetID ( uid UniqueID ) {
2021-02-04 07:31:02 +00:00
rct . Base . MsgID = uid
}
2021-09-09 11:02:08 +00:00
func ( rct * releaseCollectionTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return ReleaseCollectionTaskName
}
2021-09-09 11:02:08 +00:00
func ( rct * releaseCollectionTask ) Type ( ) commonpb . MsgType {
2021-02-04 07:31:02 +00:00
return rct . Base . MsgType
}
2021-09-09 11:02:08 +00:00
func ( rct * releaseCollectionTask ) BeginTs ( ) Timestamp {
2021-02-04 07:31:02 +00:00
return rct . Base . Timestamp
}
2021-09-09 11:02:08 +00:00
func ( rct * releaseCollectionTask ) EndTs ( ) Timestamp {
2021-02-04 07:31:02 +00:00
return rct . Base . Timestamp
}
2021-09-09 11:02:08 +00:00
func ( rct * releaseCollectionTask ) SetTs ( ts Timestamp ) {
2021-02-04 07:31:02 +00:00
rct . Base . Timestamp = ts
}
2021-09-09 11:02:08 +00:00
func ( rct * releaseCollectionTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
rct . Base = & commonpb . MsgBase { }
return nil
}
2021-09-09 11:02:08 +00:00
func ( rct * releaseCollectionTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
rct . Base . MsgType = commonpb . MsgType_ReleaseCollection
2022-04-24 14:03:44 +00:00
rct . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-02-04 07:31:02 +00:00
collName := rct . CollectionName
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( collName ) ; err != nil {
2021-02-04 07:31:02 +00:00
return err
}
return nil
}
2021-09-09 11:02:08 +00:00
func ( rct * releaseCollectionTask ) Execute ( ctx context . Context ) ( err error ) {
2021-02-26 09:44:24 +00:00
collID , err := globalMetaCache . GetCollectionID ( ctx , rct . CollectionName )
2021-02-04 07:31:02 +00:00
if err != nil {
return err
}
2022-03-02 08:23:55 +00:00
rct . collectionID = collID
2021-02-04 07:31:02 +00:00
request := & querypb . ReleaseCollectionRequest {
Base : & commonpb . MsgBase {
2021-03-10 06:45:35 +00:00
MsgType : commonpb . MsgType_ReleaseCollection ,
2021-02-04 07:31:02 +00:00
MsgID : rct . Base . MsgID ,
Timestamp : rct . Base . Timestamp ,
SourceID : rct . Base . SourceID ,
} ,
DbID : 0 ,
CollectionID : collID ,
}
2021-06-18 02:33:58 +00:00
2021-06-22 08:44:09 +00:00
rct . result , err = rct . queryCoord . ReleaseCollection ( ctx , request )
2021-06-18 02:33:58 +00:00
2022-05-19 02:13:56 +00:00
globalMetaCache . RemoveCollection ( ctx , rct . CollectionName )
2021-06-18 02:33:58 +00:00
2021-02-04 07:31:02 +00:00
return err
}
2021-09-09 11:02:08 +00:00
func ( rct * releaseCollectionTask ) PostExecute ( ctx context . Context ) error {
2022-05-17 03:11:56 +00:00
globalMetaCache . ClearShards ( rct . CollectionName )
2021-02-04 07:31:02 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
type loadPartitionsTask struct {
2021-02-04 07:31:02 +00:00
Condition
2021-03-12 06:22:09 +00:00
* milvuspb . LoadPartitionsRequest
2021-06-22 08:44:09 +00:00
ctx context . Context
queryCoord types . QueryCoord
result * commonpb . Status
2022-03-02 08:23:55 +00:00
collectionID UniqueID
2021-02-04 07:31:02 +00:00
}
2021-09-09 11:02:08 +00:00
func ( lpt * loadPartitionsTask ) TraceCtx ( ) context . Context {
2021-03-25 06:41:46 +00:00
return lpt . ctx
}
2021-09-09 11:02:08 +00:00
func ( lpt * loadPartitionsTask ) ID ( ) UniqueID {
2021-02-04 07:31:02 +00:00
return lpt . Base . MsgID
}
2021-09-09 11:02:08 +00:00
func ( lpt * loadPartitionsTask ) SetID ( uid UniqueID ) {
2021-02-04 07:31:02 +00:00
lpt . Base . MsgID = uid
}
2021-09-09 11:02:08 +00:00
func ( lpt * loadPartitionsTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return LoadPartitionTaskName
}
2021-09-09 11:02:08 +00:00
func ( lpt * loadPartitionsTask ) Type ( ) commonpb . MsgType {
2021-02-04 07:31:02 +00:00
return lpt . Base . MsgType
}
2021-09-09 11:02:08 +00:00
func ( lpt * loadPartitionsTask ) BeginTs ( ) Timestamp {
2021-02-04 07:31:02 +00:00
return lpt . Base . Timestamp
}
2021-09-09 11:02:08 +00:00
func ( lpt * loadPartitionsTask ) EndTs ( ) Timestamp {
2021-02-04 07:31:02 +00:00
return lpt . Base . Timestamp
}
2021-09-09 11:02:08 +00:00
func ( lpt * loadPartitionsTask ) SetTs ( ts Timestamp ) {
2021-02-04 07:31:02 +00:00
lpt . Base . Timestamp = ts
}
2021-09-09 11:02:08 +00:00
func ( lpt * loadPartitionsTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
lpt . Base = & commonpb . MsgBase { }
return nil
}
2021-09-09 11:02:08 +00:00
func ( lpt * loadPartitionsTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
lpt . Base . MsgType = commonpb . MsgType_LoadPartitions
2022-04-24 14:03:44 +00:00
lpt . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-02-04 07:31:02 +00:00
collName := lpt . CollectionName
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( collName ) ; err != nil {
2021-02-04 07:31:02 +00:00
return err
}
return nil
}
2021-09-09 11:02:08 +00:00
func ( lpt * loadPartitionsTask ) Execute ( ctx context . Context ) error {
2021-02-04 07:31:02 +00:00
var partitionIDs [ ] int64
2021-02-26 09:44:24 +00:00
collID , err := globalMetaCache . GetCollectionID ( ctx , lpt . CollectionName )
2021-02-04 07:31:02 +00:00
if err != nil {
return err
}
2022-03-02 08:23:55 +00:00
lpt . collectionID = collID
2021-02-26 09:44:24 +00:00
collSchema , err := globalMetaCache . GetCollectionSchema ( ctx , lpt . CollectionName )
2021-02-06 13:17:18 +00:00
if err != nil {
return err
}
2021-02-04 07:31:02 +00:00
for _ , partitionName := range lpt . PartitionNames {
2021-02-26 09:44:24 +00:00
partitionID , err := globalMetaCache . GetPartitionID ( ctx , lpt . CollectionName , partitionName )
2021-02-04 07:31:02 +00:00
if err != nil {
return err
}
partitionIDs = append ( partitionIDs , partitionID )
}
2021-03-12 06:22:09 +00:00
request := & querypb . LoadPartitionsRequest {
2021-02-04 07:31:02 +00:00
Base : & commonpb . MsgBase {
2021-03-10 06:45:35 +00:00
MsgType : commonpb . MsgType_LoadPartitions ,
2021-02-04 07:31:02 +00:00
MsgID : lpt . Base . MsgID ,
Timestamp : lpt . Base . Timestamp ,
SourceID : lpt . Base . SourceID ,
} ,
2022-04-20 08:15:41 +00:00
DbID : 0 ,
CollectionID : collID ,
PartitionIDs : partitionIDs ,
Schema : collSchema ,
ReplicaNumber : lpt . ReplicaNumber ,
2021-02-04 07:31:02 +00:00
}
2021-06-22 08:44:09 +00:00
lpt . result , err = lpt . queryCoord . LoadPartitions ( ctx , request )
2021-02-04 07:31:02 +00:00
return err
}
2021-09-09 11:02:08 +00:00
func ( lpt * loadPartitionsTask ) PostExecute ( ctx context . Context ) error {
2021-02-04 07:31:02 +00:00
return nil
}
2021-09-09 11:02:08 +00:00
type releasePartitionsTask struct {
2021-02-04 07:31:02 +00:00
Condition
2021-03-12 06:22:09 +00:00
* milvuspb . ReleasePartitionsRequest
2021-06-22 08:44:09 +00:00
ctx context . Context
queryCoord types . QueryCoord
result * commonpb . Status
2022-03-02 08:23:55 +00:00
collectionID UniqueID
2021-02-04 07:31:02 +00:00
}
2021-09-09 11:02:08 +00:00
func ( rpt * releasePartitionsTask ) TraceCtx ( ) context . Context {
2021-02-23 01:58:06 +00:00
return rpt . ctx
2021-02-04 07:31:02 +00:00
}
2021-09-09 11:02:08 +00:00
func ( rpt * releasePartitionsTask ) ID ( ) UniqueID {
2021-02-04 07:31:02 +00:00
return rpt . Base . MsgID
}
2021-09-09 11:02:08 +00:00
func ( rpt * releasePartitionsTask ) SetID ( uid UniqueID ) {
2021-02-04 07:31:02 +00:00
rpt . Base . MsgID = uid
}
2021-09-09 11:02:08 +00:00
func ( rpt * releasePartitionsTask ) Type ( ) commonpb . MsgType {
2021-02-04 07:31:02 +00:00
return rpt . Base . MsgType
}
2021-09-09 11:02:08 +00:00
func ( rpt * releasePartitionsTask ) Name ( ) string {
2021-02-23 01:58:06 +00:00
return ReleasePartitionTaskName
}
2021-09-09 11:02:08 +00:00
func ( rpt * releasePartitionsTask ) BeginTs ( ) Timestamp {
2021-02-04 07:31:02 +00:00
return rpt . Base . Timestamp
}
2021-09-09 11:02:08 +00:00
func ( rpt * releasePartitionsTask ) EndTs ( ) Timestamp {
2021-02-04 07:31:02 +00:00
return rpt . Base . Timestamp
}
2021-09-09 11:02:08 +00:00
func ( rpt * releasePartitionsTask ) SetTs ( ts Timestamp ) {
2021-02-04 07:31:02 +00:00
rpt . Base . Timestamp = ts
}
2021-09-09 11:02:08 +00:00
func ( rpt * releasePartitionsTask ) OnEnqueue ( ) error {
2021-02-23 01:58:06 +00:00
rpt . Base = & commonpb . MsgBase { }
return nil
}
2021-09-09 11:02:08 +00:00
func ( rpt * releasePartitionsTask ) PreExecute ( ctx context . Context ) error {
2021-03-10 06:45:35 +00:00
rpt . Base . MsgType = commonpb . MsgType_ReleasePartitions
2022-04-24 14:03:44 +00:00
rpt . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-02-04 07:31:02 +00:00
collName := rpt . CollectionName
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( collName ) ; err != nil {
2021-02-04 07:31:02 +00:00
return err
}
return nil
}
2021-09-09 11:02:08 +00:00
func ( rpt * releasePartitionsTask ) Execute ( ctx context . Context ) ( err error ) {
2021-02-04 07:31:02 +00:00
var partitionIDs [ ] int64
2021-02-26 09:44:24 +00:00
collID , err := globalMetaCache . GetCollectionID ( ctx , rpt . CollectionName )
2021-02-04 07:31:02 +00:00
if err != nil {
return err
}
2022-03-02 08:23:55 +00:00
rpt . collectionID = collID
2021-02-04 07:31:02 +00:00
for _ , partitionName := range rpt . PartitionNames {
2021-02-26 09:44:24 +00:00
partitionID , err := globalMetaCache . GetPartitionID ( ctx , rpt . CollectionName , partitionName )
2021-02-04 07:31:02 +00:00
if err != nil {
return err
}
partitionIDs = append ( partitionIDs , partitionID )
}
2021-03-12 06:22:09 +00:00
request := & querypb . ReleasePartitionsRequest {
2021-02-04 07:31:02 +00:00
Base : & commonpb . MsgBase {
2021-03-10 06:45:35 +00:00
MsgType : commonpb . MsgType_ReleasePartitions ,
2021-02-04 07:31:02 +00:00
MsgID : rpt . Base . MsgID ,
Timestamp : rpt . Base . Timestamp ,
SourceID : rpt . Base . SourceID ,
} ,
DbID : 0 ,
CollectionID : collID ,
PartitionIDs : partitionIDs ,
}
2021-06-22 08:44:09 +00:00
rpt . result , err = rpt . queryCoord . ReleasePartitions ( ctx , request )
2021-02-04 07:31:02 +00:00
return err
}
2021-09-09 11:02:08 +00:00
func ( rpt * releasePartitionsTask ) PostExecute ( ctx context . Context ) error {
2022-05-17 03:11:56 +00:00
globalMetaCache . ClearShards ( rpt . CollectionName )
2021-02-04 07:31:02 +00:00
return nil
}
2021-08-26 04:15:52 +00:00
2021-10-25 14:20:20 +00:00
type BaseDeleteTask = msgstream . DeleteMsg
2021-09-15 06:04:54 +00:00
type deleteTask struct {
2021-08-26 04:15:52 +00:00
Condition
2021-10-25 14:20:20 +00:00
BaseDeleteTask
2022-04-02 09:43:29 +00:00
ctx context . Context
deleteExpr string
//req *milvuspb.DeleteRequest
2021-10-10 23:48:55 +00:00
result * milvuspb . MutationResult
chMgr channelsMgr
chTicker channelsTimeTicker
vChannels [ ] vChan
pChannels [ ] pChan
2022-03-02 08:23:55 +00:00
collectionID UniqueID
2022-04-02 09:43:29 +00:00
schema * schemapb . CollectionSchema
2021-08-26 04:15:52 +00:00
}
2021-09-15 06:04:54 +00:00
func ( dt * deleteTask ) TraceCtx ( ) context . Context {
2021-08-26 04:15:52 +00:00
return dt . ctx
}
2021-09-15 06:04:54 +00:00
func ( dt * deleteTask ) ID ( ) UniqueID {
2021-08-26 04:15:52 +00:00
return dt . Base . MsgID
}
2021-09-15 06:04:54 +00:00
func ( dt * deleteTask ) SetID ( uid UniqueID ) {
2021-08-26 04:15:52 +00:00
dt . Base . MsgID = uid
}
2021-09-15 06:04:54 +00:00
func ( dt * deleteTask ) Type ( ) commonpb . MsgType {
2021-08-26 04:15:52 +00:00
return dt . Base . MsgType
}
2021-09-15 06:04:54 +00:00
func ( dt * deleteTask ) Name ( ) string {
return deleteTaskName
2021-08-26 04:15:52 +00:00
}
2021-09-15 06:04:54 +00:00
func ( dt * deleteTask ) BeginTs ( ) Timestamp {
2021-08-26 04:15:52 +00:00
return dt . Base . Timestamp
}
2021-09-15 06:04:54 +00:00
func ( dt * deleteTask ) EndTs ( ) Timestamp {
2021-08-26 04:15:52 +00:00
return dt . Base . Timestamp
}
2021-09-15 06:04:54 +00:00
func ( dt * deleteTask ) SetTs ( ts Timestamp ) {
2021-08-26 04:15:52 +00:00
dt . Base . Timestamp = ts
}
2021-09-15 06:04:54 +00:00
func ( dt * deleteTask ) OnEnqueue ( ) error {
2021-10-10 23:48:55 +00:00
dt . DeleteRequest . Base = & commonpb . MsgBase { }
2021-08-26 04:15:52 +00:00
return nil
}
2021-11-24 08:01:17 +00:00
func ( dt * deleteTask ) getPChanStats ( ) ( map [ pChan ] pChanStatistics , error ) {
ret := make ( map [ pChan ] pChanStatistics )
channels , err := dt . getChannels ( )
if err != nil {
return ret , err
}
beginTs := dt . BeginTs ( )
endTs := dt . EndTs ( )
for _ , channel := range channels {
ret [ channel ] = pChanStatistics {
minTs : beginTs ,
maxTs : endTs ,
}
}
return ret , nil
}
func ( dt * deleteTask ) getChannels ( ) ( [ ] pChan , error ) {
collID , err := globalMetaCache . GetCollectionID ( dt . ctx , dt . CollectionName )
if err != nil {
return nil , err
}
2022-06-02 07:34:04 +00:00
return dt . chMgr . getChannels ( collID )
2021-11-24 08:01:17 +00:00
}
2022-04-02 09:43:29 +00:00
func getPrimaryKeysFromExpr ( schema * schemapb . CollectionSchema , expr string ) ( res * schemapb . IDs , rowNum int64 , err error ) {
2021-10-10 23:48:55 +00:00
if len ( expr ) == 0 {
log . Warn ( "empty expr" )
return
}
2021-10-13 12:30:32 +00:00
plan , err := createExprPlan ( schema , expr )
2021-10-10 23:48:55 +00:00
if err != nil {
2022-04-02 09:43:29 +00:00
return res , 0 , fmt . Errorf ( "failed to create expr plan, expr = %s" , expr )
2021-10-10 23:48:55 +00:00
}
// delete request only support expr "id in [a, b]"
termExpr , ok := plan . Node . ( * planpb . PlanNode_Predicates ) . Predicates . Expr . ( * planpb . Expr_TermExpr )
if ! ok {
2022-05-13 10:19:53 +00:00
return res , 0 , fmt . Errorf ( "invalid plan node type, only pk in [1, 2] supported" )
2021-10-10 23:48:55 +00:00
}
2022-04-02 09:43:29 +00:00
res = & schemapb . IDs { }
rowNum = int64 ( len ( termExpr . TermExpr . Values ) )
switch termExpr . TermExpr . ColumnInfo . GetDataType ( ) {
case schemapb . DataType_Int64 :
ids := make ( [ ] int64 , 0 )
for _ , v := range termExpr . TermExpr . Values {
ids = append ( ids , v . GetInt64Val ( ) )
}
res . IdField = & schemapb . IDs_IntId {
IntId : & schemapb . LongArray {
Data : ids ,
} ,
}
case schemapb . DataType_VarChar :
ids := make ( [ ] string , 0 )
for _ , v := range termExpr . TermExpr . Values {
ids = append ( ids , v . GetStringVal ( ) )
}
res . IdField = & schemapb . IDs_StrId {
StrId : & schemapb . StringArray {
Data : ids ,
} ,
}
default :
return res , 0 , fmt . Errorf ( "invalid field data type specifyed in delete expr" )
2021-10-10 23:48:55 +00:00
}
2022-04-02 09:43:29 +00:00
return res , rowNum , nil
2021-10-10 23:48:55 +00:00
}
2021-09-15 06:04:54 +00:00
func ( dt * deleteTask ) PreExecute ( ctx context . Context ) error {
dt . Base . MsgType = commonpb . MsgType_Delete
2022-04-24 14:03:44 +00:00
dt . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-08-26 04:15:52 +00:00
2021-10-10 23:48:55 +00:00
dt . result = & milvuspb . MutationResult {
Status : & commonpb . Status {
ErrorCode : commonpb . ErrorCode_Success ,
} ,
IDs : & schemapb . IDs {
IdField : nil ,
} ,
Timestamp : dt . BeginTs ( ) ,
}
2022-04-02 09:43:29 +00:00
collName := dt . CollectionName
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( collName ) ; err != nil {
2021-10-10 23:48:55 +00:00
log . Error ( "Invalid collection name" , zap . String ( "collectionName" , collName ) )
return err
}
collID , err := globalMetaCache . GetCollectionID ( ctx , collName )
if err != nil {
log . Debug ( "Failed to get collection id" , zap . String ( "collectionName" , collName ) )
2021-08-26 04:15:52 +00:00
return err
}
2021-10-10 23:48:55 +00:00
dt . DeleteRequest . CollectionID = collID
2022-03-02 08:23:55 +00:00
dt . collectionID = collID
2021-08-26 04:15:52 +00:00
2021-10-18 12:08:42 +00:00
// If partitionName is not empty, partitionID will be set.
2022-04-02 09:43:29 +00:00
if len ( dt . PartitionName ) > 0 {
partName := dt . PartitionName
2021-10-23 10:23:44 +00:00
if err := validatePartitionTag ( partName , true ) ; err != nil {
2021-10-10 23:48:55 +00:00
log . Error ( "Invalid partition name" , zap . String ( "partitionName" , partName ) )
2021-10-09 14:50:39 +00:00
return err
}
2021-10-10 23:48:55 +00:00
partID , err := globalMetaCache . GetPartitionID ( ctx , collName , partName )
if err != nil {
log . Debug ( "Failed to get partition id" , zap . String ( "collectionName" , collName ) , zap . String ( "partitionName" , partName ) )
return err
}
dt . DeleteRequest . PartitionID = partID
2021-10-18 12:08:42 +00:00
} else {
dt . DeleteRequest . PartitionID = common . InvalidPartitionID
2021-10-10 23:48:55 +00:00
}
2022-04-02 09:43:29 +00:00
schema , err := globalMetaCache . GetCollectionSchema ( ctx , collName )
2021-10-10 23:48:55 +00:00
if err != nil {
2022-04-02 09:43:29 +00:00
log . Error ( "Failed to get collection schema" , zap . String ( "collectionName" , collName ) )
2021-10-10 23:48:55 +00:00
return err
}
2022-04-02 09:43:29 +00:00
dt . schema = schema
2021-10-10 23:48:55 +00:00
2022-04-02 09:43:29 +00:00
// get delete.primaryKeys from delete expr
primaryKeys , numRow , err := getPrimaryKeysFromExpr ( schema , dt . deleteExpr )
2021-10-10 23:48:55 +00:00
if err != nil {
log . Error ( "Failed to get primary keys from expr" , zap . Error ( err ) )
return err
}
2022-04-02 09:43:29 +00:00
dt . DeleteRequest . NumRows = numRow
2021-10-10 23:48:55 +00:00
dt . DeleteRequest . PrimaryKeys = primaryKeys
2022-04-02 09:43:29 +00:00
log . Debug ( "get primary keys from expr" , zap . Int64 ( "len of primary keys" , dt . DeleteRequest . NumRows ) )
2021-10-10 23:48:55 +00:00
// set result
2022-04-02 09:43:29 +00:00
dt . result . IDs = primaryKeys
dt . result . DeleteCnt = dt . DeleteRequest . NumRows
2021-10-10 23:48:55 +00:00
2022-04-02 09:43:29 +00:00
dt . Timestamps = make ( [ ] uint64 , numRow )
2021-10-14 06:48:34 +00:00
for index := range dt . Timestamps {
dt . Timestamps [ index ] = dt . BeginTs ( )
}
2021-08-26 04:15:52 +00:00
return nil
}
2021-09-15 06:04:54 +00:00
func ( dt * deleteTask ) Execute ( ctx context . Context ) ( err error ) {
2021-10-10 23:48:55 +00:00
sp , ctx := trace . StartSpanFromContextWithOperationName ( dt . ctx , "Proxy-Delete-Execute" )
defer sp . Finish ( )
2022-04-27 15:03:47 +00:00
tr := timerecord . NewTimeRecorder ( fmt . Sprintf ( "proxy execute delete %d" , dt . ID ( ) ) )
2021-10-11 08:31:44 +00:00
collID := dt . DeleteRequest . CollectionID
2022-06-09 09:34:09 +00:00
stream , err := dt . chMgr . getOrCreateDmlStream ( collID )
2021-10-11 08:31:44 +00:00
if err != nil {
2022-06-02 07:34:04 +00:00
return err
2021-10-11 08:31:44 +00:00
}
2022-03-25 06:27:25 +00:00
// hash primary keys to channels
channelNames , err := dt . chMgr . getVChannels ( collID )
if err != nil {
log . Error ( "get vChannels failed" , zap . Int64 ( "collectionID" , collID ) , zap . Error ( err ) )
dt . result . Status . ErrorCode = commonpb . ErrorCode_UnexpectedError
dt . result . Status . Reason = err . Error ( )
return err
}
dt . HashValues = typeutil . HashPK2Channels ( dt . result . IDs , channelNames )
2022-06-02 07:34:04 +00:00
log . Info ( "send delete request to virtual channels" ,
zap . String ( "collection" , dt . GetCollectionName ( ) ) ,
zap . Int64 ( "collection_id" , collID ) ,
zap . Strings ( "virtual_channels" , channelNames ) ,
zap . Int64 ( "task_id" , dt . ID ( ) ) )
2022-04-27 15:03:47 +00:00
tr . Record ( "get vchannels" )
2022-03-25 06:27:25 +00:00
// repack delete msg by dmChannel
result := make ( map [ uint32 ] msgstream . TsMsg )
collectionName := dt . CollectionName
collectionID := dt . CollectionID
partitionID := dt . PartitionID
partitionName := dt . PartitionName
proxyID := dt . Base . SourceID
for index , key := range dt . HashValues {
ts := dt . Timestamps [ index ]
_ , ok := result [ key ]
if ! ok {
sliceRequest := internalpb . DeleteRequest {
Base : & commonpb . MsgBase {
MsgType : commonpb . MsgType_Delete ,
MsgID : dt . Base . MsgID ,
Timestamp : ts ,
SourceID : proxyID ,
} ,
CollectionID : collectionID ,
PartitionID : partitionID ,
CollectionName : collectionName ,
PartitionName : partitionName ,
2022-04-02 09:43:29 +00:00
PrimaryKeys : & schemapb . IDs { } ,
2021-10-25 14:20:20 +00:00
}
2022-03-25 06:27:25 +00:00
deleteMsg := & msgstream . DeleteMsg {
BaseMsg : msgstream . BaseMsg {
Ctx : ctx ,
} ,
DeleteRequest : sliceRequest ,
}
result [ key ] = deleteMsg
2021-10-25 14:20:20 +00:00
}
2022-03-25 06:27:25 +00:00
curMsg := result [ key ] . ( * msgstream . DeleteMsg )
curMsg . HashValues = append ( curMsg . HashValues , dt . HashValues [ index ] )
curMsg . Timestamps = append ( curMsg . Timestamps , dt . Timestamps [ index ] )
2022-04-02 09:43:29 +00:00
typeutil . AppendIDs ( curMsg . PrimaryKeys , dt . PrimaryKeys , index )
curMsg . NumRows ++
2021-10-25 14:20:20 +00:00
}
2022-03-25 06:27:25 +00:00
// send delete request to log broker
msgPack := & msgstream . MsgPack {
BeginTs : dt . BeginTs ( ) ,
EndTs : dt . EndTs ( ) ,
2021-10-25 14:20:20 +00:00
}
for _ , msg := range result {
if msg != nil {
2022-03-25 06:27:25 +00:00
msgPack . Msgs = append ( msgPack . Msgs , msg )
2021-10-25 14:20:20 +00:00
}
}
2022-04-27 15:03:47 +00:00
tr . Record ( "pack messages" )
2022-03-25 06:27:25 +00:00
err = stream . Produce ( msgPack )
2021-10-11 08:31:44 +00:00
if err != nil {
dt . result . Status . ErrorCode = commonpb . ErrorCode_UnexpectedError
dt . result . Status . Reason = err . Error ( )
return err
}
2022-04-27 15:03:47 +00:00
sendMsgDur := tr . Record ( "send delete request to dml channels" )
metrics . ProxySendMutationReqLatency . WithLabelValues ( strconv . FormatInt ( Params . ProxyCfg . GetNodeID ( ) , 10 ) , metrics . DeleteLabel ) . Observe ( float64 ( sendMsgDur . Milliseconds ( ) ) )
2021-08-26 04:15:52 +00:00
return nil
}
2021-09-15 06:04:54 +00:00
func ( dt * deleteTask ) PostExecute ( ctx context . Context ) error {
2021-08-26 04:15:52 +00:00
return nil
}
2021-09-18 03:13:51 +00:00
2021-12-28 14:22:46 +00:00
// CreateAliasTask contains task information of CreateAlias
2021-09-18 03:13:51 +00:00
type CreateAliasTask struct {
Condition
* milvuspb . CreateAliasRequest
ctx context . Context
rootCoord types . RootCoord
result * commonpb . Status
}
2021-11-17 08:13:17 +00:00
// TraceCtx returns the trace context of the task.
2021-09-18 03:13:51 +00:00
func ( c * CreateAliasTask ) TraceCtx ( ) context . Context {
return c . ctx
}
2021-11-17 08:13:17 +00:00
// ID return the id of the task
2021-09-18 03:13:51 +00:00
func ( c * CreateAliasTask ) ID ( ) UniqueID {
return c . Base . MsgID
}
2021-11-17 08:13:17 +00:00
// SetID sets the id of the task
2021-09-18 03:13:51 +00:00
func ( c * CreateAliasTask ) SetID ( uid UniqueID ) {
c . Base . MsgID = uid
}
2021-11-17 08:13:17 +00:00
// Name returns the name of the task
2021-09-18 03:13:51 +00:00
func ( c * CreateAliasTask ) Name ( ) string {
return CreateAliasTaskName
}
2021-11-17 08:13:17 +00:00
// Type returns the type of the task
2021-09-18 03:13:51 +00:00
func ( c * CreateAliasTask ) Type ( ) commonpb . MsgType {
return c . Base . MsgType
}
2021-12-23 03:05:09 +00:00
// BeginTs returns the ts
2021-09-18 03:13:51 +00:00
func ( c * CreateAliasTask ) BeginTs ( ) Timestamp {
return c . Base . Timestamp
}
2021-12-23 03:05:09 +00:00
// EndTs returns the ts
2021-09-18 03:13:51 +00:00
func ( c * CreateAliasTask ) EndTs ( ) Timestamp {
return c . Base . Timestamp
}
2021-12-23 03:05:09 +00:00
// SetTs sets the ts
2021-09-18 03:13:51 +00:00
func ( c * CreateAliasTask ) SetTs ( ts Timestamp ) {
c . Base . Timestamp = ts
}
2021-12-29 14:40:27 +00:00
// OnEnqueue defines the behavior task enqueued
2021-09-18 03:13:51 +00:00
func ( c * CreateAliasTask ) OnEnqueue ( ) error {
c . Base = & commonpb . MsgBase { }
return nil
}
2021-12-29 14:40:27 +00:00
// PreExecute defines the action before task execution
2021-09-18 03:13:51 +00:00
func ( c * CreateAliasTask ) PreExecute ( ctx context . Context ) error {
c . Base . MsgType = commonpb . MsgType_CreateAlias
2022-04-24 14:03:44 +00:00
c . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-09-18 03:13:51 +00:00
collAlias := c . Alias
// collection alias uses the same format as collection name
if err := ValidateCollectionAlias ( collAlias ) ; err != nil {
return err
}
collName := c . CollectionName
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( collName ) ; err != nil {
2021-09-18 03:13:51 +00:00
return err
}
return nil
}
2021-12-29 14:40:27 +00:00
// Execute defines the actual execution of create alias
2021-09-18 03:13:51 +00:00
func ( c * CreateAliasTask ) Execute ( ctx context . Context ) error {
var err error
c . result , err = c . rootCoord . CreateAlias ( ctx , c . CreateAliasRequest )
return err
}
2021-12-29 14:40:27 +00:00
// PostExecute defines the post execution, do nothing for create alias
2021-09-18 03:13:51 +00:00
func ( c * CreateAliasTask ) PostExecute ( ctx context . Context ) error {
return nil
}
2021-12-17 10:46:38 +00:00
// DropAliasTask is the task to drop alias
2021-09-18 03:13:51 +00:00
type DropAliasTask struct {
Condition
* milvuspb . DropAliasRequest
ctx context . Context
rootCoord types . RootCoord
result * commonpb . Status
}
2022-01-10 10:33:46 +00:00
// TraceCtx returns the context for trace
2021-09-18 03:13:51 +00:00
func ( d * DropAliasTask ) TraceCtx ( ) context . Context {
return d . ctx
}
2022-01-10 10:33:46 +00:00
// ID returns the MsgID
2021-09-18 03:13:51 +00:00
func ( d * DropAliasTask ) ID ( ) UniqueID {
return d . Base . MsgID
}
2022-01-10 10:33:46 +00:00
// SetID sets the MsgID
2021-09-18 03:13:51 +00:00
func ( d * DropAliasTask ) SetID ( uid UniqueID ) {
d . Base . MsgID = uid
}
2022-01-10 10:33:46 +00:00
// Name returns the name of the task
2021-09-18 03:13:51 +00:00
func ( d * DropAliasTask ) Name ( ) string {
return DropAliasTaskName
}
func ( d * DropAliasTask ) Type ( ) commonpb . MsgType {
return d . Base . MsgType
}
func ( d * DropAliasTask ) BeginTs ( ) Timestamp {
return d . Base . Timestamp
}
func ( d * DropAliasTask ) EndTs ( ) Timestamp {
return d . Base . Timestamp
}
func ( d * DropAliasTask ) SetTs ( ts Timestamp ) {
d . Base . Timestamp = ts
}
func ( d * DropAliasTask ) OnEnqueue ( ) error {
d . Base = & commonpb . MsgBase { }
return nil
}
func ( d * DropAliasTask ) PreExecute ( ctx context . Context ) error {
d . Base . MsgType = commonpb . MsgType_DropAlias
2022-04-24 14:03:44 +00:00
d . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-09-18 03:13:51 +00:00
collAlias := d . Alias
if err := ValidateCollectionAlias ( collAlias ) ; err != nil {
return err
}
return nil
}
func ( d * DropAliasTask ) Execute ( ctx context . Context ) error {
var err error
d . result , err = d . rootCoord . DropAlias ( ctx , d . DropAliasRequest )
return err
}
func ( d * DropAliasTask ) PostExecute ( ctx context . Context ) error {
return nil
}
2021-12-24 05:33:45 +00:00
// AlterAliasTask is the task to alter alias
2021-09-18 03:13:51 +00:00
type AlterAliasTask struct {
Condition
* milvuspb . AlterAliasRequest
ctx context . Context
rootCoord types . RootCoord
result * commonpb . Status
}
func ( a * AlterAliasTask ) TraceCtx ( ) context . Context {
return a . ctx
}
func ( a * AlterAliasTask ) ID ( ) UniqueID {
return a . Base . MsgID
}
func ( a * AlterAliasTask ) SetID ( uid UniqueID ) {
a . Base . MsgID = uid
}
func ( a * AlterAliasTask ) Name ( ) string {
return AlterAliasTaskName
}
func ( a * AlterAliasTask ) Type ( ) commonpb . MsgType {
return a . Base . MsgType
}
func ( a * AlterAliasTask ) BeginTs ( ) Timestamp {
return a . Base . Timestamp
}
func ( a * AlterAliasTask ) EndTs ( ) Timestamp {
return a . Base . Timestamp
}
func ( a * AlterAliasTask ) SetTs ( ts Timestamp ) {
a . Base . Timestamp = ts
}
func ( a * AlterAliasTask ) OnEnqueue ( ) error {
a . Base = & commonpb . MsgBase { }
return nil
}
func ( a * AlterAliasTask ) PreExecute ( ctx context . Context ) error {
a . Base . MsgType = commonpb . MsgType_AlterAlias
2022-04-24 14:03:44 +00:00
a . Base . SourceID = Params . ProxyCfg . GetNodeID ( )
2021-09-18 03:13:51 +00:00
collAlias := a . Alias
// collection alias uses the same format as collection name
if err := ValidateCollectionAlias ( collAlias ) ; err != nil {
return err
}
collName := a . CollectionName
2021-10-23 02:53:12 +00:00
if err := validateCollectionName ( collName ) ; err != nil {
2021-09-18 03:13:51 +00:00
return err
}
return nil
}
func ( a * AlterAliasTask ) Execute ( ctx context . Context ) error {
var err error
a . result , err = a . rootCoord . AlterAlias ( ctx , a . AlterAliasRequest )
return err
}
func ( a * AlterAliasTask ) PostExecute ( ctx context . Context ) error {
return nil
}