提交 31b400a9 编写于 作者: D dragondriver 提交者: zhenshan.cao

Refactor the workflow of receiving search result from query node (#5527)

Signed-off-by: Ndragondriver <jiquan.long@zilliz.com>
上级 54ab03e2
...@@ -1130,6 +1130,7 @@ func (node *ProxyNode) Search(ctx context.Context, request *milvuspb.SearchReque ...@@ -1130,6 +1130,7 @@ func (node *ProxyNode) Search(ctx context.Context, request *milvuspb.SearchReque
queryMsgStream: node.queryMsgStream, queryMsgStream: node.queryMsgStream,
resultBuf: make(chan []*internalpb.SearchResults), resultBuf: make(chan []*internalpb.SearchResults),
query: request, query: request,
chMgr: node.chMgr,
} }
err := node.sched.DqQueue.Enqueue(qt) err := node.sched.DqQueue.Enqueue(qt)
......
...@@ -104,6 +104,11 @@ type dmlTask interface { ...@@ -104,6 +104,11 @@ type dmlTask interface {
getStatistics(pchan pChan) (pChanStatistics, error) getStatistics(pchan pChan) (pChanStatistics, error)
} }
type dqlTask interface {
task
getVChannels() ([]vChan, error)
}
type BaseInsertTask = msgstream.InsertMsg type BaseInsertTask = msgstream.InsertMsg
type InsertTask struct { type InsertTask struct {
...@@ -978,6 +983,7 @@ type SearchTask struct { ...@@ -978,6 +983,7 @@ type SearchTask struct {
resultBuf chan []*internalpb.SearchResults resultBuf chan []*internalpb.SearchResults
result *milvuspb.SearchResults result *milvuspb.SearchResults
query *milvuspb.SearchRequest query *milvuspb.SearchRequest
chMgr channelsMgr
} }
func (st *SearchTask) TraceCtx() context.Context { func (st *SearchTask) TraceCtx() context.Context {
...@@ -1017,6 +1023,23 @@ func (st *SearchTask) OnEnqueue() error { ...@@ -1017,6 +1023,23 @@ func (st *SearchTask) OnEnqueue() error {
return nil return nil
} }
func (st *SearchTask) getVChannels() ([]vChan, error) {
collID, err := globalMetaCache.GetCollectionID(st.ctx, st.query.CollectionName)
if err != nil {
return nil, err
}
_, err = st.chMgr.getChannels(collID)
if err != nil {
err := st.chMgr.createDMLMsgStream(collID)
if err != nil {
return nil, err
}
}
return st.chMgr.getVChannels(collID)
}
func (st *SearchTask) PreExecute(ctx context.Context) error { func (st *SearchTask) PreExecute(ctx context.Context) error {
st.Base.MsgType = commonpb.MsgType_Search st.Base.MsgType = commonpb.MsgType_Search
st.Base.SourceID = Params.ProxyID st.Base.SourceID = Params.ProxyID
......
...@@ -423,6 +423,63 @@ func (sched *TaskScheduler) queryLoop() { ...@@ -423,6 +423,63 @@ func (sched *TaskScheduler) queryLoop() {
} }
} }
type searchResultBuf struct {
usedVChans map[interface{}]struct{} // set of vChan
receivedVChansSet map[interface{}]struct{} // set of vChan
receivedSealedSegmentIDsSet map[interface{}]struct{} // set of UniqueID
receivedGlobalSegmentIDsSet map[interface{}]struct{} // set of UniqueID
resultBuf []*internalpb.SearchResults
}
func newSearchResultBuf() *searchResultBuf {
return &searchResultBuf{
usedVChans: make(map[interface{}]struct{}),
receivedVChansSet: make(map[interface{}]struct{}),
receivedSealedSegmentIDsSet: make(map[interface{}]struct{}),
receivedGlobalSegmentIDsSet: make(map[interface{}]struct{}),
resultBuf: make([]*internalpb.SearchResults, 0),
}
}
func setContain(m1, m2 map[interface{}]struct{}) bool {
if len(m1) < len(m2) {
return false
}
for k2 := range m2 {
_, ok := m1[k2]
if !ok {
return false
}
}
return true
}
func (sr *searchResultBuf) readyToReduce() bool {
if !setContain(sr.receivedVChansSet, sr.usedVChans) {
return false
}
return setContain(sr.receivedSealedSegmentIDsSet, sr.receivedGlobalSegmentIDsSet)
}
func (sr *searchResultBuf) addPartialResult(result *internalpb.SearchResults) {
sr.resultBuf = append(sr.resultBuf, result)
for _, vchan := range result.ChannelIDsSearched {
sr.receivedVChansSet[vchan] = struct{}{}
}
for _, sealedSegment := range result.SealedSegmentIDsSearched {
sr.receivedSealedSegmentIDsSet[sealedSegment] = struct{}{}
}
for _, globalSegment := range result.GlobalSealedSegmentIDs {
sr.receivedGlobalSegmentIDsSet[globalSegment] = struct{}{}
}
}
func (sched *TaskScheduler) queryResultLoop() { func (sched *TaskScheduler) queryResultLoop() {
defer sched.wg.Done() defer sched.wg.Done()
...@@ -436,7 +493,7 @@ func (sched *TaskScheduler) queryResultLoop() { ...@@ -436,7 +493,7 @@ func (sched *TaskScheduler) queryResultLoop() {
queryResultMsgStream.Start() queryResultMsgStream.Start()
defer queryResultMsgStream.Close() defer queryResultMsgStream.Close()
queryResultBuf := make(map[UniqueID][]*internalpb.SearchResults) queryResultBuf := make(map[UniqueID]*searchResultBuf)
retrieveResultBuf := make(map[UniqueID][]*internalpb.RetrieveResults) retrieveResultBuf := make(map[UniqueID][]*internalpb.RetrieveResults)
for { for {
...@@ -462,30 +519,36 @@ func (sched *TaskScheduler) queryResultLoop() { ...@@ -462,30 +519,36 @@ func (sched *TaskScheduler) queryResultLoop() {
continue continue
} }
st, ok := t.(*SearchTask)
if !ok {
delete(queryResultBuf, reqID)
continue
}
_, ok = queryResultBuf[reqID] _, ok = queryResultBuf[reqID]
if !ok { if !ok {
queryResultBuf[reqID] = make([]*internalpb.SearchResults, 0) queryResultBuf[reqID] = newSearchResultBuf()
vchans, err := st.getVChannels()
if err != nil {
delete(queryResultBuf, reqID)
continue
}
for _, vchan := range vchans {
queryResultBuf[reqID].usedVChans[vchan] = struct{}{}
}
} }
queryResultBuf[reqID] = append(queryResultBuf[reqID], &searchResultMsg.SearchResults) queryResultBuf[reqID].addPartialResult(&searchResultMsg.SearchResults)
//t := sched.getTaskByReqID(reqID) //t := sched.getTaskByReqID(reqID)
{ {
colName := t.(*SearchTask).query.CollectionName colName := t.(*SearchTask).query.CollectionName
log.Debug("Getcollection", zap.String("collection name", colName), zap.String("reqID", reqIDStr), zap.Int("answer cnt", len(queryResultBuf[reqID]))) log.Debug("Getcollection", zap.String("collection name", colName), zap.String("reqID", reqIDStr), zap.Int("answer cnt", len(queryResultBuf[reqID].resultBuf)))
} }
if len(queryResultBuf[reqID]) == queryNodeNum {
t := sched.getTaskByReqID(reqID)
if t != nil {
qt, ok := t.(*SearchTask)
if ok {
qt.resultBuf <- queryResultBuf[reqID]
delete(queryResultBuf, reqID)
}
} else {
// log.Printf("task with reqID %v is nil", reqID) if queryResultBuf[reqID].readyToReduce() {
} st.resultBuf <- queryResultBuf[reqID].resultBuf
} }
sp.Finish() sp.Finish()
} }
if retrieveResultMsg, rtOk := tsMsg.(*msgstream.RetrieveResultMsg); rtOk { if retrieveResultMsg, rtOk := tsMsg.(*msgstream.RetrieveResultMsg); rtOk {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册