1717package  querycoord
1818
1919import  (
20+ 	"context" 
21+ 
2022	"github.com/golang/protobuf/proto" 
2123	"github.com/milvus-io/milvus/internal/log" 
2224	"github.com/milvus-io/milvus/internal/proto/datapb" 
2325	"github.com/milvus-io/milvus/internal/proto/querypb" 
26+ 	"github.com/milvus-io/milvus/internal/util/retry" 
2427	"go.uber.org/zap" 
2528)
2629
2730// generateFullWatchDmChannelsRequest fill the WatchDmChannelsRequest by get segment infos from meta broker 
28- func  generateFullWatchDmChannelsRequest (broker  * globalMetaBroker , request  * querypb.WatchDmChannelsRequest ) (* querypb.WatchDmChannelsRequest , error ) {
31+ func  generateFullWatchDmChannelsRequest (ctx  context. Context ,  broker  * globalMetaBroker , request  * querypb.WatchDmChannelsRequest ) (* querypb.WatchDmChannelsRequest , error ) {
2932	cloned  :=  proto .Clone (request ).(* querypb.WatchDmChannelsRequest )
3033	vChannels  :=  cloned .GetInfos ()
3134
@@ -34,25 +37,74 @@ func generateFullWatchDmChannelsRequest(broker *globalMetaBroker, request *query
3437		reviseVChannelInfo (vChannel )
3538	}
3639
40+ 	vChannelDict  :=  make (map [string ]bool , len (vChannels ))
41+ 	for  _ , info  :=  range  vChannels  {
42+ 		vChannelDict [info .ChannelName ] =  true 
43+ 	}
44+ 	var  segmentInfos  []* datapb.SegmentInfo 
45+ 
46+ 	// if the return segmentInfos is less than required, this may because the segment is compacted. 
47+ 	// refresh the vchannels and segmentInfos needed. 
48+ 	retryFunc  :=  func () error  {
49+ 		newVChannels  :=  make ([]* datapb.VchannelInfo , 0 )
50+ 		newSegmentIds  :=  make ([]int64 , 0 )
51+ 
52+ 		newVChannelDict  :=  make (map [string ]bool )
53+ 		for  _ , partitionID  :=  range  request .GetLoadMeta ().GetPartitionIDs () {
54+ 			partitionVChannels , _ , err  :=  broker .getRecoveryInfo (ctx , request .GetCollectionID (), partitionID )
55+ 			if  err  !=  nil  {
56+ 				log .Error ("GetRecoveryInfo failed, retrying..." , zap .Error (err ))
57+ 				return  err 
58+ 			}
59+ 			for  _ , vchannel  :=  range  partitionVChannels  {
60+ 				if  vChannelDict [vchannel .GetChannelName ()] &&  ! newVChannelDict [vchannel .GetChannelName ()] {
61+ 					newVChannels  =  append (newVChannels , vchannel )
62+ 					newVChannelDict [vchannel .GetChannelName ()] =  true 
63+ 				}
64+ 			}
65+ 		}
66+ 
67+ 		for  _ , vChannel  :=  range  newVChannels  {
68+ 			newSegmentIds  =  append (newSegmentIds , vChannel .FlushedSegmentIds ... )
69+ 			newSegmentIds  =  append (newSegmentIds , vChannel .UnflushedSegmentIds ... )
70+ 			newSegmentIds  =  append (newSegmentIds , vChannel .DroppedSegmentIds ... )
71+ 		}
72+ 		newSegmentInfos , err  :=  broker .getDataSegmentInfosByIDs (ctx , newSegmentIds )
73+ 		if  err  !=  nil  {
74+ 			log .Error ("Get Vchannel SegmentInfos failed, retrying..." , zap .Error (err ))
75+ 			return  err 
76+ 		}
77+ 
78+ 		cloned .Infos  =  newVChannels 
79+ 		segmentInfos  =  newSegmentInfos 
80+ 		return  nil 
81+ 	}
82+ 
3783	// fill segmentInfos 
3884	segmentIds  :=  make ([]int64 , 0 )
3985	for  _ , vChannel  :=  range  vChannels  {
4086		segmentIds  =  append (segmentIds , vChannel .FlushedSegmentIds ... )
4187		segmentIds  =  append (segmentIds , vChannel .UnflushedSegmentIds ... )
4288		segmentIds  =  append (segmentIds , vChannel .DroppedSegmentIds ... )
4389	}
44- 	segmentInfos , err  :=  broker .getDataSegmentInfosByIDs (segmentIds )
90+ 	segmentInfos , err  :=  broker .getDataSegmentInfosByIDs (ctx , segmentIds )
91+ 
4592	if  err  !=  nil  {
4693		log .Error ("Get Vchannel SegmentInfos failed" , zap .Error (err ))
47- 		return  nil , err 
94+ 		retryErr  :=  retry .Do (ctx , retryFunc , retry .Attempts (20 ))
95+ 		if  retryErr  !=  nil  {
96+ 			log .Error ("Get Vchannel SegmentInfos failed after retry" , zap .Error (retryErr ))
97+ 			return  nil , retryErr 
98+ 		}
4899	}
100+ 
49101	segmentDict  :=  make (map [int64 ]* datapb.SegmentInfo )
50102	for  _ , info  :=  range  segmentInfos  {
51103		segmentDict [info .ID ] =  info 
52104	}
53105	cloned .SegmentInfos  =  segmentDict 
54106
55- 	return  cloned , err 
107+ 	return  cloned , nil 
56108}
57109
58110// thinWatchDmChannelsRequest will return a thin version of WatchDmChannelsRequest 
0 commit comments