mirror of
https://gitee.com/milvus-io/milvus.git
synced 2026-01-07 19:31:51 +08:00
96 lines
2.2 KiB
Go
96 lines
2.2 KiB
Go
package master
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/zilliztech/milvus-distributed/internal/proto/internalpb"
|
|
)
|
|
|
|
type createIndexTask struct {
|
|
baseTask
|
|
req *internalpb.CreateIndexRequest
|
|
indexBuildScheduler *IndexBuildScheduler
|
|
indexLoadScheduler *IndexLoadScheduler
|
|
segManager *SegmentManager
|
|
}
|
|
|
|
func (task *createIndexTask) Type() internalpb.MsgType {
|
|
return internalpb.MsgType_kCreateIndex
|
|
}
|
|
|
|
func (task *createIndexTask) Ts() (Timestamp, error) {
|
|
return task.req.Timestamp, nil
|
|
}
|
|
|
|
func (task *createIndexTask) Execute() error {
|
|
// modify schema
|
|
if err := task.mt.UpdateFieldIndexParams(task.req.CollectionName, task.req.FieldName, task.req.ExtraParams); err != nil {
|
|
return err
|
|
}
|
|
// check if closed segment has the same index build history
|
|
collMeta, err := task.mt.GetCollectionByName(task.req.CollectionName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
var fieldID int64 = -1
|
|
for _, fieldSchema := range collMeta.Schema.Fields {
|
|
if fieldSchema.Name == task.req.FieldName {
|
|
fieldID = fieldSchema.FieldID
|
|
break
|
|
}
|
|
}
|
|
if fieldID == -1 {
|
|
return fmt.Errorf("can not find field name %s", task.req.FieldName)
|
|
}
|
|
|
|
for _, segID := range collMeta.SegmentIDs {
|
|
segMeta, err := task.mt.GetSegmentByID(segID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if segMeta.CloseTime == 0 {
|
|
continue
|
|
}
|
|
hasIndexMeta, err := task.mt.HasFieldIndexMeta(segID, fieldID, task.req.ExtraParams)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if hasIndexMeta {
|
|
// load index
|
|
indexMeta, err := task.mt.GetFieldIndexMeta(segID, fieldID, task.req.ExtraParams)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = task.indexLoadScheduler.Enqueue(&IndexLoadInfo{
|
|
segmentID: segID,
|
|
fieldID: fieldID,
|
|
fieldName: task.req.FieldName,
|
|
indexFilePaths: indexMeta.IndexFilePaths,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
// create index
|
|
for _, kv := range segMeta.BinlogFilePaths {
|
|
if kv.FieldID != fieldID {
|
|
continue
|
|
}
|
|
err := task.indexBuildScheduler.Enqueue(&IndexBuildInfo{
|
|
segmentID: segID,
|
|
fieldID: fieldID,
|
|
binlogFilePath: kv.BinlogFiles,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
// close unfilled segment
|
|
return task.segManager.ForceClose(collMeta.ID)
|
|
}
|