mirror of
https://gitee.com/milvus-io/milvus.git
synced 2026-01-07 19:31:51 +08:00
2. Trans to insertData. 3. Change dataFields data to Data, dim to Dim4. Add float vector and binary vector.5. Deserialize data and convert to InsertData.6. Move all data into InsertData.7. Add insert buffer and hash string. 8. Add minIOkV in insertBuffer node. 9. Init write node insertBuffer maxSize from writeNode.yaml. 10. Add ddBuffer. 11. Add ddBuffer binLog and minio. 12. Add ddNode unittest. 13. Remove redundant call. 14. Increase test time. 15. Delete ddl const, use request's timestamp instead. Signed-off-by: bigsheeper <yihao.dai@zilliz.com>
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)
|
|
}
|