mirror of
https://gitee.com/milvus-io/milvus.git
synced 2026-01-07 19:31:51 +08:00
112 lines
2.5 KiB
Go
112 lines
2.5 KiB
Go
package reader
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"strconv"
|
|
"sync"
|
|
)
|
|
|
|
type insertNode struct {
|
|
BaseNode
|
|
SegmentsMap *map[int64]*Segment
|
|
insertMsg *insertMsg
|
|
}
|
|
|
|
func (iNode *insertNode) Name() string {
|
|
return "iNode"
|
|
}
|
|
|
|
func (iNode *insertNode) Operate(in []*Msg) []*Msg {
|
|
if len(in) != 1 {
|
|
log.Println("Invalid operate message input in insertNode")
|
|
// TODO: add error handling
|
|
}
|
|
|
|
insertMsg, ok := (*in[0]).(*insertMsg)
|
|
if !ok {
|
|
log.Println("type assertion failed for insertMsg")
|
|
// TODO: add error handling
|
|
}
|
|
|
|
iNode.insertMsg = insertMsg
|
|
|
|
var err = iNode.preInsert()
|
|
if err != nil {
|
|
log.Println("preInsert failed")
|
|
// TODO: add error handling
|
|
}
|
|
|
|
wg := sync.WaitGroup{}
|
|
for segmentID := range iNode.insertMsg.insertData.insertRecords {
|
|
wg.Add(1)
|
|
go iNode.insert(segmentID, &wg)
|
|
}
|
|
wg.Wait()
|
|
|
|
var res Msg = &serviceTimeMsg{
|
|
timeRange: insertMsg.timeRange,
|
|
}
|
|
return []*Msg{&res}
|
|
}
|
|
|
|
func (iNode *insertNode) preInsert() error {
|
|
for segmentID := range iNode.insertMsg.insertData.insertRecords {
|
|
var targetSegment, err = iNode.getSegmentBySegmentID(segmentID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var numOfRecords = len(iNode.insertMsg.insertData.insertRecords[segmentID])
|
|
var offset = targetSegment.SegmentPreInsert(numOfRecords)
|
|
iNode.insertMsg.insertData.insertOffset[segmentID] = offset
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (iNode *insertNode) getSegmentBySegmentID(segmentID int64) (*Segment, error) {
|
|
targetSegment, ok := (*iNode.SegmentsMap)[segmentID]
|
|
|
|
if !ok {
|
|
return nil, errors.New("cannot found segment with id = " + strconv.FormatInt(segmentID, 10))
|
|
}
|
|
|
|
return targetSegment, nil
|
|
}
|
|
|
|
func (iNode *insertNode) insert(segmentID int64, wg *sync.WaitGroup) {
|
|
var targetSegment, err = iNode.getSegmentBySegmentID(segmentID)
|
|
if err != nil {
|
|
log.Println("cannot find segment:", segmentID)
|
|
// TODO: add error handling
|
|
return
|
|
}
|
|
|
|
ids := iNode.insertMsg.insertData.insertIDs[segmentID]
|
|
timestamps := iNode.insertMsg.insertData.insertTimestamps[segmentID]
|
|
records := iNode.insertMsg.insertData.insertRecords[segmentID]
|
|
offsets := iNode.insertMsg.insertData.insertOffset[segmentID]
|
|
|
|
err = targetSegment.SegmentInsert(offsets, &ids, ×tamps, &records)
|
|
if err != nil {
|
|
log.Println("insert failed")
|
|
// TODO: add error handling
|
|
return
|
|
}
|
|
|
|
fmt.Println("Do insert done, len = ", len(iNode.insertMsg.insertData.insertIDs[segmentID]))
|
|
wg.Done()
|
|
}
|
|
|
|
func newInsertNode() *insertNode {
|
|
baseNode := BaseNode{}
|
|
baseNode.SetMaxQueueLength(maxQueueLength)
|
|
baseNode.SetMaxParallelism(maxParallelism)
|
|
|
|
return &insertNode{
|
|
BaseNode: baseNode,
|
|
}
|
|
}
|