2021-04-19 05:47:10 +00:00
// Copyright (C) 2019-2020 Zilliz. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
// or implied. See the License for the specific language governing permissions and limitations under the License.
2021-06-22 08:44:09 +00:00
package querycoord
2021-04-15 07:15:46 +00:00
import (
"context"
2021-06-23 09:44:12 +00:00
"errors"
2021-04-15 07:15:46 +00:00
"fmt"
2021-06-30 09:48:19 +00:00
"time"
2021-04-15 07:15:46 +00:00
2021-06-19 03:45:09 +00:00
"github.com/golang/protobuf/proto"
2021-04-15 07:15:46 +00:00
"go.uber.org/zap"
2021-04-22 06:45:57 +00:00
"github.com/milvus-io/milvus/internal/log"
"github.com/milvus-io/milvus/internal/proto/commonpb"
"github.com/milvus-io/milvus/internal/proto/datapb"
"github.com/milvus-io/milvus/internal/proto/internalpb"
"github.com/milvus-io/milvus/internal/proto/milvuspb"
2021-07-02 02:40:13 +00:00
"github.com/milvus-io/milvus/internal/proto/proxypb"
2021-04-22 06:45:57 +00:00
"github.com/milvus-io/milvus/internal/proto/querypb"
"github.com/milvus-io/milvus/internal/types"
2021-06-30 08:18:13 +00:00
"github.com/milvus-io/milvus/internal/util/trace"
"github.com/opentracing/opentracing-go"
2021-04-15 07:15:46 +00:00
)
2021-06-19 03:45:09 +00:00
const (
2021-06-22 08:44:09 +00:00
triggerTaskPrefix = "queryCoord-triggerTask"
activeTaskPrefix = "queryCoord-activeTask"
taskInfoPrefix = "queryCoord-taskInfo"
loadBalanceInfoPrefix = "queryCoord-loadBalanceInfo"
2021-06-19 03:45:09 +00:00
)
type taskState int
const (
taskUndo taskState = 0
taskDoing taskState = 1
taskDone taskState = 3
taskExpired taskState = 4
)
2021-04-15 07:15:46 +00:00
type task interface {
TraceCtx ( ) context . Context
ID ( ) UniqueID // return ReqId
2021-06-15 04:41:40 +00:00
SetID ( id UniqueID )
2021-06-26 08:08:11 +00:00
MsgBase ( ) * commonpb . MsgBase
2021-04-15 07:15:46 +00:00
Type ( ) commonpb . MsgType
Timestamp ( ) Timestamp
2021-06-30 08:18:13 +00:00
PreExecute ( ctx context . Context ) error
2021-04-15 07:15:46 +00:00
Execute ( ctx context . Context ) error
2021-06-30 08:18:13 +00:00
PostExecute ( ctx context . Context ) error
2021-04-15 07:15:46 +00:00
WaitToFinish ( ) error
Notify ( err error )
2021-06-15 04:41:40 +00:00
TaskPriority ( ) querypb . TriggerCondition
GetParentTask ( ) task
GetChildTask ( ) [ ] task
AddChildTask ( t task )
2021-06-19 03:45:09 +00:00
IsValid ( ) bool
Reschedule ( ) ( [ ] task , error )
Marshal ( ) string
State ( ) taskState
SetState ( state taskState )
2021-04-15 07:15:46 +00:00
}
type BaseTask struct {
Condition
ctx context . Context
cancel context . CancelFunc
result * commonpb . Status
2021-06-19 03:45:09 +00:00
state taskState
2021-06-15 04:41:40 +00:00
taskID UniqueID
triggerCondition querypb . TriggerCondition
parentTask task
childTasks [ ] task
}
func ( bt * BaseTask ) ID ( ) UniqueID {
return bt . taskID
}
func ( bt * BaseTask ) SetID ( id UniqueID ) {
bt . taskID = id
2021-04-15 07:15:46 +00:00
}
func ( bt * BaseTask ) TraceCtx ( ) context . Context {
return bt . ctx
}
2021-06-15 04:41:40 +00:00
func ( bt * BaseTask ) TaskPriority ( ) querypb . TriggerCondition {
return bt . triggerCondition
}
func ( bt * BaseTask ) GetParentTask ( ) task {
return bt . parentTask
}
func ( bt * BaseTask ) GetChildTask ( ) [ ] task {
return bt . childTasks
}
func ( bt * BaseTask ) AddChildTask ( t task ) {
bt . childTasks = append ( bt . childTasks , t )
}
2021-06-19 03:45:09 +00:00
func ( bt * BaseTask ) IsValid ( ) bool {
return true
}
func ( bt * BaseTask ) Reschedule ( ) ( [ ] task , error ) {
return nil , nil
}
func ( bt * BaseTask ) State ( ) taskState {
return bt . state
}
func ( bt * BaseTask ) SetState ( state taskState ) {
bt . state = state
}
2021-06-15 04:41:40 +00:00
//************************grpcTask***************************//
2021-04-15 07:15:46 +00:00
type LoadCollectionTask struct {
BaseTask
* querypb . LoadCollectionRequest
2021-06-21 10:22:13 +00:00
rootCoord types . RootCoord
dataCoord types . DataCoord
cluster * queryNodeCluster
meta * meta
2021-06-19 03:45:09 +00:00
}
2021-06-26 08:08:11 +00:00
func ( lct * LoadCollectionTask ) MsgBase ( ) * commonpb . MsgBase {
return lct . Base
}
2021-06-19 03:45:09 +00:00
func ( lct * LoadCollectionTask ) Marshal ( ) string {
return proto . MarshalTextString ( lct . LoadCollectionRequest )
2021-04-15 07:15:46 +00:00
}
func ( lct * LoadCollectionTask ) Type ( ) commonpb . MsgType {
return lct . Base . MsgType
}
func ( lct * LoadCollectionTask ) Timestamp ( ) Timestamp {
return lct . Base . Timestamp
}
2021-06-30 08:18:13 +00:00
func ( lct * LoadCollectionTask ) PreExecute ( ctx context . Context ) error {
2021-04-15 07:15:46 +00:00
collectionID := lct . CollectionID
schema := lct . Schema
2021-06-23 09:44:12 +00:00
status := & commonpb . Status {
ErrorCode : commonpb . ErrorCode_Success ,
}
lct . result = status
2021-04-15 07:15:46 +00:00
log . Debug ( "start do LoadCollectionTask" ,
zap . Int64 ( "msgID" , lct . ID ( ) ) ,
zap . Int64 ( "collectionID" , collectionID ) ,
zap . Stringer ( "schema" , schema ) )
2021-06-30 08:18:13 +00:00
return nil
2021-04-15 07:15:46 +00:00
}
func ( lct * LoadCollectionTask ) Execute ( ctx context . Context ) error {
collectionID := lct . CollectionID
status := & commonpb . Status {
ErrorCode : commonpb . ErrorCode_UnexpectedError ,
}
showPartitionRequest := & milvuspb . ShowPartitionsRequest {
Base : & commonpb . MsgBase {
MsgType : commonpb . MsgType_ShowPartitions ,
} ,
CollectionID : collectionID ,
}
2021-07-01 07:24:17 +00:00
showPartitionResponse , err := lct . rootCoord . ShowPartitions ( ctx , showPartitionRequest )
2021-04-15 07:15:46 +00:00
if err != nil {
status . Reason = err . Error ( )
lct . result = status
return err
}
2021-06-24 13:10:13 +00:00
log . Debug ( "loadCollectionTask: get collection's all partitionIDs" , zap . Int64 ( "collectionID" , collectionID ) , zap . Int64s ( "partitionIDs" , showPartitionResponse . PartitionIDs ) )
partitionIDs := showPartitionResponse . PartitionIDs
2021-06-23 09:44:12 +00:00
toLoadPartitionIDs := make ( [ ] UniqueID , 0 )
2021-06-24 13:10:13 +00:00
hasCollection := lct . meta . hasCollection ( collectionID )
2021-06-26 08:08:11 +00:00
watchPartition := false
2021-06-24 13:10:13 +00:00
if hasCollection {
2021-06-26 08:08:11 +00:00
watchPartition = true
2021-06-24 13:10:13 +00:00
loadCollection , _ := lct . meta . getLoadCollection ( collectionID )
if loadCollection {
for _ , partitionID := range partitionIDs {
hasReleasePartition := lct . meta . hasReleasePartition ( collectionID , partitionID )
if hasReleasePartition {
toLoadPartitionIDs = append ( toLoadPartitionIDs , partitionID )
}
}
} else {
for _ , partitionID := range partitionIDs {
hasPartition := lct . meta . hasPartition ( collectionID , partitionID )
if ! hasPartition {
toLoadPartitionIDs = append ( toLoadPartitionIDs , partitionID )
}
}
2021-06-23 09:44:12 +00:00
}
2021-06-24 13:10:13 +00:00
} else {
toLoadPartitionIDs = partitionIDs
2021-06-23 09:44:12 +00:00
}
2021-06-24 13:10:13 +00:00
2021-06-23 09:44:12 +00:00
log . Debug ( "loadCollectionTask: toLoadPartitionIDs" , zap . Int64s ( "partitionIDs" , toLoadPartitionIDs ) )
2021-06-24 13:10:13 +00:00
lct . meta . addCollection ( collectionID , lct . Schema )
lct . meta . setLoadCollection ( collectionID , true )
for _ , id := range toLoadPartitionIDs {
lct . meta . addPartition ( collectionID , id )
}
2021-06-23 09:44:12 +00:00
2021-06-26 08:08:11 +00:00
loadSegmentReqs := make ( [ ] * querypb . LoadSegmentsRequest , 0 )
watchDmChannelReqs := make ( [ ] * querypb . WatchDmChannelsRequest , 0 )
2021-06-15 04:41:40 +00:00
channelsToWatch := make ( [ ] string , 0 )
segmentsToLoad := make ( [ ] UniqueID , 0 )
2021-06-23 09:44:12 +00:00
for _ , partitionID := range toLoadPartitionIDs {
2021-06-16 03:09:56 +00:00
getRecoveryInfoRequest := & datapb . GetRecoveryInfoRequest {
2021-06-15 04:41:40 +00:00
Base : lct . Base ,
CollectionID : collectionID ,
PartitionID : partitionID ,
}
2021-06-30 08:18:13 +00:00
recoveryInfo , err := lct . dataCoord . GetRecoveryInfo ( ctx , getRecoveryInfoRequest )
2021-06-15 04:41:40 +00:00
if err != nil {
status . Reason = err . Error ( )
lct . result = status
return err
}
2021-04-15 07:15:46 +00:00
2021-06-15 04:41:40 +00:00
for _ , segmentBingLog := range recoveryInfo . Binlogs {
segmentID := segmentBingLog . SegmentID
segmentLoadInfo := & querypb . SegmentLoadInfo {
2021-06-26 08:08:11 +00:00
SegmentID : segmentID ,
2021-06-15 04:41:40 +00:00
PartitionID : partitionID ,
CollectionID : collectionID ,
2021-06-26 08:08:11 +00:00
BinlogPaths : segmentBingLog . FieldBinlogs ,
2021-04-15 07:15:46 +00:00
}
2021-06-26 08:08:11 +00:00
loadSegmentReq := & querypb . LoadSegmentsRequest {
Base : lct . Base ,
Infos : [ ] * querypb . SegmentLoadInfo { segmentLoadInfo } ,
Schema : lct . Schema ,
LoadCondition : querypb . TriggerCondition_grpcRequest ,
}
2021-06-15 04:41:40 +00:00
segmentsToLoad = append ( segmentsToLoad , segmentID )
2021-06-26 08:08:11 +00:00
loadSegmentReqs = append ( loadSegmentReqs , loadSegmentReq )
2021-04-15 07:15:46 +00:00
}
2021-06-15 04:41:40 +00:00
for _ , info := range recoveryInfo . Channels {
channel := info . ChannelName
2021-06-26 08:08:11 +00:00
if ! watchPartition {
merged := false
for index , channelName := range channelsToWatch {
if channel == channelName {
merged = true
oldInfo := watchDmChannelReqs [ index ] . Infos [ 0 ]
newInfo := mergeVChannelInfo ( oldInfo , info )
watchDmChannelReqs [ index ] . Infos = [ ] * datapb . VchannelInfo { newInfo }
break
}
}
if ! merged {
watchRequest := & querypb . WatchDmChannelsRequest {
Base : lct . Base ,
CollectionID : collectionID ,
Infos : [ ] * datapb . VchannelInfo { info } ,
Schema : lct . Schema ,
}
channelsToWatch = append ( channelsToWatch , channel )
watchDmChannelReqs = append ( watchDmChannelReqs , watchRequest )
}
} else {
2021-06-15 04:41:40 +00:00
watchRequest := & querypb . WatchDmChannelsRequest {
Base : lct . Base ,
CollectionID : collectionID ,
2021-06-26 08:08:11 +00:00
PartitionID : partitionID ,
2021-06-16 03:09:56 +00:00
Infos : [ ] * datapb . VchannelInfo { info } ,
2021-06-15 04:41:40 +00:00
Schema : lct . Schema ,
}
channelsToWatch = append ( channelsToWatch , channel )
2021-06-26 08:08:11 +00:00
watchDmChannelReqs = append ( watchDmChannelReqs , watchRequest )
2021-06-15 04:41:40 +00:00
}
2021-04-15 07:15:46 +00:00
}
}
2021-06-30 08:18:13 +00:00
assignInternalTask ( ctx , collectionID , lct , lct . meta , lct . cluster , loadSegmentReqs , watchDmChannelReqs )
2021-06-26 08:08:11 +00:00
log . Debug ( "loadCollectionTask: assign child task done" , zap . Int64 ( "collectionID" , collectionID ) )
2021-06-15 04:41:40 +00:00
2021-04-15 07:15:46 +00:00
log . Debug ( "LoadCollection execute done" ,
zap . Int64 ( "msgID" , lct . ID ( ) ) ,
2021-06-15 04:41:40 +00:00
zap . Int64 ( "collectionID" , collectionID ) )
2021-04-15 07:15:46 +00:00
return nil
}
2021-06-30 08:18:13 +00:00
func ( lct * LoadCollectionTask ) PostExecute ( ctx context . Context ) error {
2021-04-15 07:15:46 +00:00
collectionID := lct . CollectionID
2021-06-19 03:45:09 +00:00
lct . meta . addCollection ( collectionID , lct . Schema )
2021-06-23 09:44:12 +00:00
if lct . result . ErrorCode != commonpb . ErrorCode_Success {
lct . childTasks = make ( [ ] task , 0 )
2021-06-30 09:48:19 +00:00
nodes , err := lct . cluster . onServiceNodes ( )
if err != nil {
log . Debug ( err . Error ( ) )
}
for nodeID := range nodes {
2021-06-23 09:44:12 +00:00
req := & querypb . ReleaseCollectionRequest {
Base : & commonpb . MsgBase {
MsgType : commonpb . MsgType_ReleaseCollection ,
MsgID : lct . Base . MsgID ,
Timestamp : lct . Base . Timestamp ,
SourceID : lct . Base . SourceID ,
} ,
DbID : lct . DbID ,
CollectionID : lct . CollectionID ,
NodeID : nodeID ,
}
releaseCollectionTask := & ReleaseCollectionTask {
BaseTask : BaseTask {
2021-06-30 08:18:13 +00:00
ctx : ctx ,
Condition : NewTaskCondition ( ctx ) ,
2021-06-23 09:44:12 +00:00
triggerCondition : querypb . TriggerCondition_grpcRequest ,
} ,
ReleaseCollectionRequest : req ,
cluster : lct . cluster ,
}
lct . AddChildTask ( releaseCollectionTask )
log . Debug ( "loadCollectionTask: add a releaseCollectionTask to loadCollectionTask's childTask" , zap . Any ( "task" , releaseCollectionTask ) )
}
}
2021-04-15 07:15:46 +00:00
log . Debug ( "LoadCollectionTask postExecute done" ,
zap . Int64 ( "msgID" , lct . ID ( ) ) ,
zap . Int64 ( "collectionID" , collectionID ) )
2021-06-30 08:18:13 +00:00
return nil
2021-04-15 07:15:46 +00:00
}
type ReleaseCollectionTask struct {
BaseTask
* querypb . ReleaseCollectionRequest
2021-07-02 02:40:13 +00:00
cluster * queryNodeCluster
meta * meta
rootCoord types . RootCoord
2021-04-15 07:15:46 +00:00
}
2021-06-26 08:08:11 +00:00
func ( rct * ReleaseCollectionTask ) MsgBase ( ) * commonpb . MsgBase {
return rct . Base
}
2021-06-19 03:45:09 +00:00
func ( rct * ReleaseCollectionTask ) Marshal ( ) string {
return proto . MarshalTextString ( rct . ReleaseCollectionRequest )
}
2021-04-15 07:15:46 +00:00
func ( rct * ReleaseCollectionTask ) Type ( ) commonpb . MsgType {
return rct . Base . MsgType
}
func ( rct * ReleaseCollectionTask ) Timestamp ( ) Timestamp {
return rct . Base . Timestamp
}
2021-06-30 08:18:13 +00:00
func ( rct * ReleaseCollectionTask ) PreExecute ( context . Context ) error {
2021-04-15 07:15:46 +00:00
collectionID := rct . CollectionID
2021-06-23 09:44:12 +00:00
status := & commonpb . Status {
ErrorCode : commonpb . ErrorCode_Success ,
}
rct . result = status
2021-04-15 07:15:46 +00:00
log . Debug ( "start do ReleaseCollectionTask" ,
zap . Int64 ( "msgID" , rct . ID ( ) ) ,
zap . Int64 ( "collectionID" , collectionID ) )
2021-06-30 08:18:13 +00:00
return nil
2021-04-15 07:15:46 +00:00
}
func ( rct * ReleaseCollectionTask ) Execute ( ctx context . Context ) error {
collectionID := rct . CollectionID
status := & commonpb . Status {
2021-06-23 09:44:12 +00:00
ErrorCode : commonpb . ErrorCode_UnexpectedError ,
2021-04-15 07:15:46 +00:00
}
2021-06-19 03:45:09 +00:00
if rct . NodeID <= 0 {
2021-07-02 02:40:13 +00:00
rct . meta . releaseCollection ( collectionID )
releaseDQLMessageStreamReq := & proxypb . ReleaseDQLMessageStreamRequest {
Base : & commonpb . MsgBase {
MsgType : commonpb . MsgType_RemoveQueryChannels ,
MsgID : rct . Base . MsgID ,
Timestamp : rct . Base . Timestamp ,
SourceID : rct . Base . SourceID ,
} ,
DbID : rct . DbID ,
CollectionID : rct . CollectionID ,
}
res , err := rct . rootCoord . ReleaseDQLMessageStream ( rct . ctx , releaseDQLMessageStreamReq )
if err != nil {
log . Error ( "ReleaseCollectionTask: release collection end, releaseDQLMessageStream occur error" , zap . Int64 ( "collectionID" , rct . CollectionID ) )
status . Reason = err . Error ( )
rct . result = status
return err
}
if res . ErrorCode != commonpb . ErrorCode_Success {
log . Error ( "ReleaseCollectionTask: release collection end, releaseDQLMessageStream occur error" , zap . Int64 ( "collectionID" , rct . CollectionID ) )
err = errors . New ( "rootCoord releaseDQLMessageStream failed" )
status . Reason = err . Error ( )
rct . result = status
return err
}
2021-06-30 09:48:19 +00:00
nodes , err := rct . cluster . onServiceNodes ( )
if err != nil {
log . Debug ( err . Error ( ) )
}
for nodeID := range nodes {
2021-06-19 03:45:09 +00:00
req := proto . Clone ( rct . ReleaseCollectionRequest ) . ( * querypb . ReleaseCollectionRequest )
req . NodeID = nodeID
2021-06-15 04:41:40 +00:00
releaseCollectionTask := & ReleaseCollectionTask {
BaseTask : BaseTask {
2021-06-30 08:18:13 +00:00
ctx : ctx ,
Condition : NewTaskCondition ( ctx ) ,
2021-06-15 04:41:40 +00:00
triggerCondition : querypb . TriggerCondition_grpcRequest ,
} ,
2021-06-19 03:45:09 +00:00
ReleaseCollectionRequest : req ,
2021-06-15 04:41:40 +00:00
cluster : rct . cluster ,
}
rct . AddChildTask ( releaseCollectionTask )
2021-06-19 03:45:09 +00:00
log . Debug ( "ReleaseCollectionTask: add a releaseCollectionTask to releaseCollectionTask's childTask" , zap . Any ( "task" , releaseCollectionTask ) )
2021-06-15 04:41:40 +00:00
}
} else {
2021-06-23 09:44:12 +00:00
res , err := rct . cluster . releaseCollection ( ctx , rct . NodeID , rct . ReleaseCollectionRequest )
2021-04-15 07:15:46 +00:00
if err != nil {
2021-07-02 02:40:13 +00:00
log . Error ( "ReleaseCollectionTask: release collection end, node occur error" , zap . Int64 ( "nodeID" , rct . NodeID ) )
2021-06-23 09:44:12 +00:00
status . Reason = err . Error ( )
rct . result = status
return err
}
if res . ErrorCode != commonpb . ErrorCode_Success {
2021-07-02 02:40:13 +00:00
log . Error ( "ReleaseCollectionTask: release collection end, node occur error" , zap . Int64 ( "nodeID" , rct . NodeID ) )
2021-06-23 09:44:12 +00:00
err = errors . New ( "queryNode releaseCollection failed" )
2021-04-15 07:15:46 +00:00
status . Reason = err . Error ( )
rct . result = status
return err
}
}
log . Debug ( "ReleaseCollectionTask Execute done" ,
zap . Int64 ( "msgID" , rct . ID ( ) ) ,
2021-06-15 04:41:40 +00:00
zap . Int64 ( "collectionID" , collectionID ) ,
2021-06-19 03:45:09 +00:00
zap . Int64 ( "nodeID" , rct . NodeID ) )
2021-04-15 07:15:46 +00:00
return nil
}
2021-06-30 08:18:13 +00:00
func ( rct * ReleaseCollectionTask ) PostExecute ( context . Context ) error {
2021-04-15 07:15:46 +00:00
collectionID := rct . CollectionID
log . Debug ( "ReleaseCollectionTask postExecute done" ,
zap . Int64 ( "msgID" , rct . ID ( ) ) ,
2021-06-15 04:41:40 +00:00
zap . Int64 ( "collectionID" , collectionID ) ,
2021-06-19 03:45:09 +00:00
zap . Int64 ( "nodeID" , rct . NodeID ) )
2021-06-30 08:18:13 +00:00
return nil
2021-04-15 07:15:46 +00:00
}
type LoadPartitionTask struct {
BaseTask
* querypb . LoadPartitionsRequest
2021-06-21 10:22:13 +00:00
dataCoord types . DataCoord
cluster * queryNodeCluster
meta * meta
2021-06-23 09:44:12 +00:00
addCol bool
2021-06-19 03:45:09 +00:00
}
2021-06-26 08:08:11 +00:00
func ( lpt * LoadPartitionTask ) MsgBase ( ) * commonpb . MsgBase {
return lpt . Base
}
2021-06-19 03:45:09 +00:00
func ( lpt * LoadPartitionTask ) Marshal ( ) string {
return proto . MarshalTextString ( lpt . LoadPartitionsRequest )
2021-04-15 07:15:46 +00:00
}
func ( lpt * LoadPartitionTask ) Type ( ) commonpb . MsgType {
return lpt . Base . MsgType
}
func ( lpt * LoadPartitionTask ) Timestamp ( ) Timestamp {
return lpt . Base . Timestamp
}
2021-06-30 08:18:13 +00:00
func ( lpt * LoadPartitionTask ) PreExecute ( context . Context ) error {
2021-04-15 07:15:46 +00:00
collectionID := lpt . CollectionID
2021-06-23 09:44:12 +00:00
status := & commonpb . Status {
ErrorCode : commonpb . ErrorCode_Success ,
}
lpt . result = status
2021-04-15 07:15:46 +00:00
log . Debug ( "start do LoadPartitionTask" ,
zap . Int64 ( "msgID" , lpt . ID ( ) ) ,
zap . Int64 ( "collectionID" , collectionID ) )
2021-06-30 08:18:13 +00:00
return nil
2021-04-15 07:15:46 +00:00
}
func ( lpt * LoadPartitionTask ) Execute ( ctx context . Context ) error {
collectionID := lpt . CollectionID
partitionIDs := lpt . PartitionIDs
2021-06-23 09:44:12 +00:00
if ! lpt . meta . hasCollection ( collectionID ) {
lpt . meta . addCollection ( collectionID , lpt . Schema )
lpt . addCol = true
}
2021-06-19 03:45:09 +00:00
for _ , id := range partitionIDs {
lpt . meta . addPartition ( collectionID , id )
}
2021-04-15 07:15:46 +00:00
status := & commonpb . Status {
ErrorCode : commonpb . ErrorCode_UnexpectedError ,
}
2021-06-15 04:41:40 +00:00
segmentsToLoad := make ( [ ] UniqueID , 0 )
2021-06-26 08:08:11 +00:00
loadSegmentReqs := make ( [ ] * querypb . LoadSegmentsRequest , 0 )
2021-06-15 04:41:40 +00:00
channelsToWatch := make ( [ ] string , 0 )
2021-06-26 08:08:11 +00:00
watchDmReqs := make ( [ ] * querypb . WatchDmChannelsRequest , 0 )
2021-04-15 07:15:46 +00:00
for _ , partitionID := range partitionIDs {
2021-06-16 03:09:56 +00:00
getRecoveryInfoRequest := & datapb . GetRecoveryInfoRequest {
2021-06-15 04:41:40 +00:00
Base : lpt . Base ,
2021-04-15 07:15:46 +00:00
CollectionID : collectionID ,
PartitionID : partitionID ,
}
2021-06-30 08:18:13 +00:00
recoveryInfo , err := lpt . dataCoord . GetRecoveryInfo ( ctx , getRecoveryInfoRequest )
2021-04-15 07:15:46 +00:00
if err != nil {
status . Reason = err . Error ( )
lpt . result = status
return err
}
2021-06-15 04:41:40 +00:00
for _ , segmentBingLog := range recoveryInfo . Binlogs {
segmentID := segmentBingLog . SegmentID
segmentLoadInfo := & querypb . SegmentLoadInfo {
SegmentID : segmentID ,
2021-04-15 07:15:46 +00:00
PartitionID : partitionID ,
2021-06-15 04:41:40 +00:00
CollectionID : collectionID ,
2021-06-26 08:08:11 +00:00
BinlogPaths : segmentBingLog . FieldBinlogs ,
}
loadSegmentReq := & querypb . LoadSegmentsRequest {
Base : lpt . Base ,
Infos : [ ] * querypb . SegmentLoadInfo { segmentLoadInfo } ,
Schema : lpt . Schema ,
LoadCondition : querypb . TriggerCondition_grpcRequest ,
2021-04-15 07:15:46 +00:00
}
2021-06-15 04:41:40 +00:00
segmentsToLoad = append ( segmentsToLoad , segmentID )
2021-06-26 08:08:11 +00:00
loadSegmentReqs = append ( loadSegmentReqs , loadSegmentReq )
2021-06-15 04:41:40 +00:00
}
for _ , info := range recoveryInfo . Channels {
channel := info . ChannelName
2021-06-26 08:08:11 +00:00
watchDmRequest := & querypb . WatchDmChannelsRequest {
2021-06-15 04:41:40 +00:00
Base : lpt . Base ,
CollectionID : collectionID ,
PartitionID : partitionID ,
2021-06-16 03:09:56 +00:00
Infos : [ ] * datapb . VchannelInfo { info } ,
2021-06-15 04:41:40 +00:00
Schema : lpt . Schema ,
2021-04-15 07:15:46 +00:00
}
2021-06-15 04:41:40 +00:00
channelsToWatch = append ( channelsToWatch , channel )
2021-06-26 08:08:11 +00:00
watchDmReqs = append ( watchDmReqs , watchDmRequest )
log . Debug ( "LoadPartitionTask: set watchDmChannelsRequests" , zap . Any ( "request" , watchDmRequest ) , zap . Int64 ( "collectionID" , collectionID ) )
2021-04-15 07:15:46 +00:00
}
}
2021-06-30 08:18:13 +00:00
assignInternalTask ( ctx , collectionID , lpt , lpt . meta , lpt . cluster , loadSegmentReqs , watchDmReqs )
2021-06-26 08:08:11 +00:00
log . Debug ( "LoadPartitionTask: assign child task done" , zap . Int64 ( "collectionID" , collectionID ) , zap . Int64s ( "partitionIDs" , partitionIDs ) )
2021-04-15 07:15:46 +00:00
log . Debug ( "LoadPartitionTask Execute done" ,
zap . Int64 ( "msgID" , lpt . ID ( ) ) ,
zap . Int64 ( "collectionID" , collectionID ) ,
zap . Int64s ( "partitionIDs" , partitionIDs ) )
return nil
}
2021-06-30 08:18:13 +00:00
func ( lpt * LoadPartitionTask ) PostExecute ( ctx context . Context ) error {
2021-04-15 07:15:46 +00:00
collectionID := lpt . CollectionID
partitionIDs := lpt . PartitionIDs
2021-06-23 09:44:12 +00:00
if lpt . result . ErrorCode != commonpb . ErrorCode_Success {
lpt . childTasks = make ( [ ] task , 0 )
if lpt . addCol {
2021-06-30 09:48:19 +00:00
nodes , err := lpt . cluster . onServiceNodes ( )
if err != nil {
log . Debug ( err . Error ( ) )
}
for nodeID := range nodes {
2021-06-23 09:44:12 +00:00
req := & querypb . ReleaseCollectionRequest {
Base : & commonpb . MsgBase {
MsgType : commonpb . MsgType_ReleaseCollection ,
MsgID : lpt . Base . MsgID ,
Timestamp : lpt . Base . Timestamp ,
SourceID : lpt . Base . SourceID ,
} ,
DbID : lpt . DbID ,
CollectionID : lpt . CollectionID ,
NodeID : nodeID ,
}
releaseCollectionTask := & ReleaseCollectionTask {
BaseTask : BaseTask {
2021-06-30 08:18:13 +00:00
ctx : ctx ,
Condition : NewTaskCondition ( ctx ) ,
2021-06-23 09:44:12 +00:00
triggerCondition : querypb . TriggerCondition_grpcRequest ,
} ,
ReleaseCollectionRequest : req ,
cluster : lpt . cluster ,
}
lpt . AddChildTask ( releaseCollectionTask )
log . Debug ( "loadPartitionTask: add a releaseCollectionTask to loadPartitionTask's childTask" , zap . Any ( "task" , releaseCollectionTask ) )
}
} else {
2021-06-30 09:48:19 +00:00
nodes , err := lpt . cluster . onServiceNodes ( )
if err != nil {
log . Debug ( err . Error ( ) )
}
for nodeID := range nodes {
2021-06-23 09:44:12 +00:00
req := & querypb . ReleasePartitionsRequest {
Base : & commonpb . MsgBase {
MsgType : commonpb . MsgType_ReleasePartitions ,
MsgID : lpt . Base . MsgID ,
Timestamp : lpt . Base . Timestamp ,
SourceID : lpt . Base . SourceID ,
} ,
DbID : lpt . DbID ,
CollectionID : lpt . CollectionID ,
PartitionIDs : partitionIDs ,
NodeID : nodeID ,
}
releasePartitionTask := & ReleasePartitionTask {
BaseTask : BaseTask {
2021-06-30 08:18:13 +00:00
ctx : ctx ,
Condition : NewTaskCondition ( ctx ) ,
2021-06-23 09:44:12 +00:00
triggerCondition : querypb . TriggerCondition_grpcRequest ,
} ,
ReleasePartitionsRequest : req ,
cluster : lpt . cluster ,
}
lpt . AddChildTask ( releasePartitionTask )
log . Debug ( "loadPartitionTask: add a releasePartitionTask to loadPartitionTask's childTask" , zap . Any ( "task" , releasePartitionTask ) )
}
}
}
2021-04-15 07:15:46 +00:00
log . Debug ( "LoadPartitionTask postExecute done" ,
zap . Int64 ( "msgID" , lpt . ID ( ) ) ,
2021-06-15 04:41:40 +00:00
zap . Int64 ( "collectionID" , collectionID ) ,
zap . Int64s ( "partitionIDs" , partitionIDs ) )
2021-06-30 08:18:13 +00:00
return nil
2021-04-15 07:15:46 +00:00
}
type ReleasePartitionTask struct {
BaseTask
* querypb . ReleasePartitionsRequest
2021-06-15 04:41:40 +00:00
cluster * queryNodeCluster
2021-04-15 07:15:46 +00:00
}
2021-06-26 08:08:11 +00:00
func ( rpt * ReleasePartitionTask ) MsgBase ( ) * commonpb . MsgBase {
return rpt . Base
}
2021-06-19 03:45:09 +00:00
func ( rpt * ReleasePartitionTask ) Marshal ( ) string {
return proto . MarshalTextString ( rpt . ReleasePartitionsRequest )
}
2021-04-15 07:15:46 +00:00
func ( rpt * ReleasePartitionTask ) Type ( ) commonpb . MsgType {
return rpt . Base . MsgType
}
func ( rpt * ReleasePartitionTask ) Timestamp ( ) Timestamp {
return rpt . Base . Timestamp
}
2021-06-30 08:18:13 +00:00
func ( rpt * ReleasePartitionTask ) PreExecute ( context . Context ) error {
2021-04-15 07:15:46 +00:00
collectionID := rpt . CollectionID
2021-06-23 09:44:12 +00:00
status := & commonpb . Status {
ErrorCode : commonpb . ErrorCode_Success ,
}
rpt . result = status
2021-04-15 07:15:46 +00:00
log . Debug ( "start do releasePartitionTask" ,
zap . Int64 ( "msgID" , rpt . ID ( ) ) ,
zap . Int64 ( "collectionID" , collectionID ) )
2021-06-30 08:18:13 +00:00
return nil
2021-04-15 07:15:46 +00:00
}
func ( rpt * ReleasePartitionTask ) Execute ( ctx context . Context ) error {
collectionID := rpt . CollectionID
partitionIDs := rpt . PartitionIDs
status := & commonpb . Status {
2021-06-23 09:44:12 +00:00
ErrorCode : commonpb . ErrorCode_UnexpectedError ,
2021-04-15 07:15:46 +00:00
}
2021-06-19 03:45:09 +00:00
if rpt . NodeID <= 0 {
2021-06-30 09:48:19 +00:00
nodes , err := rpt . cluster . onServiceNodes ( )
if err != nil {
log . Debug ( err . Error ( ) )
}
for nodeID := range nodes {
2021-06-19 03:45:09 +00:00
req := proto . Clone ( rpt . ReleasePartitionsRequest ) . ( * querypb . ReleasePartitionsRequest )
req . NodeID = nodeID
2021-06-15 04:41:40 +00:00
releasePartitionTask := & ReleasePartitionTask {
BaseTask : BaseTask {
2021-07-01 07:24:17 +00:00
ctx : ctx ,
Condition : NewTaskCondition ( ctx ) ,
2021-06-15 04:41:40 +00:00
triggerCondition : querypb . TriggerCondition_grpcRequest ,
} ,
2021-06-19 03:45:09 +00:00
ReleasePartitionsRequest : req ,
2021-06-15 04:41:40 +00:00
cluster : rpt . cluster ,
}
rpt . AddChildTask ( releasePartitionTask )
2021-06-19 03:45:09 +00:00
log . Debug ( "ReleasePartitionTask: add a releasePartitionTask to releasePartitionTask's childTask" , zap . Any ( "task" , releasePartitionTask ) )
2021-06-15 04:41:40 +00:00
}
} else {
2021-06-23 09:44:12 +00:00
res , err := rpt . cluster . releasePartitions ( ctx , rpt . NodeID , rpt . ReleasePartitionsRequest )
2021-04-15 07:15:46 +00:00
if err != nil {
2021-06-23 09:44:12 +00:00
log . Error ( "ReleasePartitionsTask: release partition end, node occur error" , zap . String ( "nodeID" , fmt . Sprintln ( rpt . NodeID ) ) )
status . Reason = err . Error ( )
rpt . result = status
return err
}
if res . ErrorCode != commonpb . ErrorCode_Success {
log . Error ( "ReleasePartitionsTask: release partition end, node occur error" , zap . String ( "nodeID" , fmt . Sprintln ( rpt . NodeID ) ) )
err = errors . New ( "queryNode releasePartition failed" )
status . Reason = err . Error ( )
2021-04-15 07:15:46 +00:00
rpt . result = status
return err
}
}
log . Debug ( "ReleasePartitionTask Execute done" ,
zap . Int64 ( "msgID" , rpt . ID ( ) ) ,
zap . Int64 ( "collectionID" , collectionID ) ,
2021-06-15 04:41:40 +00:00
zap . Int64s ( "partitionIDs" , partitionIDs ) ,
2021-06-19 03:45:09 +00:00
zap . Int64 ( "nodeID" , rpt . NodeID ) )
2021-04-15 07:15:46 +00:00
return nil
}
2021-06-30 08:18:13 +00:00
func ( rpt * ReleasePartitionTask ) PostExecute ( context . Context ) error {
2021-04-15 07:15:46 +00:00
collectionID := rpt . CollectionID
partitionIDs := rpt . PartitionIDs
2021-06-15 04:41:40 +00:00
2021-04-15 07:15:46 +00:00
log . Debug ( "ReleasePartitionTask postExecute done" ,
zap . Int64 ( "msgID" , rpt . ID ( ) ) ,
2021-06-15 04:41:40 +00:00
zap . Int64 ( "collectionID" , collectionID ) ,
zap . Int64s ( "partitionIDs" , partitionIDs ) ,
2021-06-19 03:45:09 +00:00
zap . Int64 ( "nodeID" , rpt . NodeID ) )
2021-06-30 08:18:13 +00:00
return nil
2021-04-15 07:15:46 +00:00
}
2021-06-15 04:41:40 +00:00
//****************************internal task*******************************//
type LoadSegmentTask struct {
BaseTask
* querypb . LoadSegmentsRequest
2021-06-19 03:45:09 +00:00
meta * meta
2021-06-15 04:41:40 +00:00
cluster * queryNodeCluster
}
2021-06-26 08:08:11 +00:00
func ( lst * LoadSegmentTask ) MsgBase ( ) * commonpb . MsgBase {
return lst . Base
}
2021-06-19 03:45:09 +00:00
func ( lst * LoadSegmentTask ) Marshal ( ) string {
return proto . MarshalTextString ( lst . LoadSegmentsRequest )
}
func ( lst * LoadSegmentTask ) IsValid ( ) bool {
2021-06-30 09:48:19 +00:00
onService , err := lst . cluster . isOnService ( lst . NodeID )
if err != nil {
return false
}
return lst . ctx != nil && onService
2021-06-19 03:45:09 +00:00
}
2021-06-15 04:41:40 +00:00
func ( lst * LoadSegmentTask ) Type ( ) commonpb . MsgType {
return lst . Base . MsgType
}
2021-06-19 03:45:09 +00:00
2021-06-15 04:41:40 +00:00
func ( lst * LoadSegmentTask ) Timestamp ( ) Timestamp {
return lst . Base . Timestamp
}
2021-06-19 03:45:09 +00:00
2021-06-30 08:18:13 +00:00
func ( lst * LoadSegmentTask ) PreExecute ( context . Context ) error {
2021-06-15 04:41:40 +00:00
segmentIDs := make ( [ ] UniqueID , 0 )
for _ , info := range lst . Infos {
segmentIDs = append ( segmentIDs , info . SegmentID )
}
log . Debug ( "start do loadSegmentTask" ,
2021-06-19 03:45:09 +00:00
zap . Int64s ( "segmentIDs" , segmentIDs ) ,
zap . Int64 ( "loaded nodeID" , lst . NodeID ) ,
zap . Int64 ( "taskID" , lst . ID ( ) ) )
2021-06-30 08:18:13 +00:00
return nil
2021-06-15 04:41:40 +00:00
}
2021-06-19 03:45:09 +00:00
2021-06-15 04:41:40 +00:00
func ( lst * LoadSegmentTask ) Execute ( ctx context . Context ) error {
2021-06-30 08:18:13 +00:00
status , err := lst . cluster . LoadSegments ( ctx , lst . NodeID , lst . LoadSegmentsRequest )
2021-04-15 07:15:46 +00:00
if err != nil {
2021-06-15 04:41:40 +00:00
lst . result = status
2021-04-15 07:15:46 +00:00
return err
}
2021-06-15 04:41:40 +00:00
lst . result = status
2021-06-19 03:45:09 +00:00
log . Debug ( "loadSegmentTask Execute done" ,
zap . Int64 ( "taskID" , lst . ID ( ) ) )
2021-06-15 04:41:40 +00:00
return nil
}
2021-06-30 08:18:13 +00:00
func ( lst * LoadSegmentTask ) PostExecute ( context . Context ) error {
2021-06-19 03:45:09 +00:00
log . Debug ( "loadSegmentTask postExecute done" ,
zap . Int64 ( "taskID" , lst . ID ( ) ) )
2021-06-30 08:18:13 +00:00
return nil
2021-06-15 04:41:40 +00:00
}
2021-06-19 03:45:09 +00:00
func ( lst * LoadSegmentTask ) Reschedule ( ) ( [ ] task , error ) {
segmentIDs := make ( [ ] UniqueID , 0 )
collectionID := lst . Infos [ 0 ] . CollectionID
reScheduledTask := make ( [ ] task , 0 )
for _ , info := range lst . Infos {
segmentID := info . SegmentID
segmentIDs = append ( segmentIDs , segmentID )
}
segment2Nodes := shuffleSegmentsToQueryNode ( segmentIDs , lst . cluster )
node2segmentInfos := make ( map [ int64 ] [ ] * querypb . SegmentLoadInfo )
for _ , info := range lst . Infos {
segmentID := info . SegmentID
nodeID := segment2Nodes [ segmentID ]
if _ , ok := node2segmentInfos [ nodeID ] ; ! ok {
node2segmentInfos [ nodeID ] = make ( [ ] * querypb . SegmentLoadInfo , 0 )
}
node2segmentInfos [ nodeID ] = append ( node2segmentInfos [ nodeID ] , info )
}
for nodeID , infos := range node2segmentInfos {
loadSegmentTask := & LoadSegmentTask {
BaseTask : lst . BaseTask ,
LoadSegmentsRequest : & querypb . LoadSegmentsRequest {
Base : lst . Base ,
NodeID : nodeID ,
Infos : infos ,
Schema : lst . Schema ,
LoadCondition : lst . LoadCondition ,
} ,
meta : lst . meta ,
cluster : lst . cluster ,
}
reScheduledTask = append ( reScheduledTask , loadSegmentTask )
log . Debug ( "LoadSegmentTask: add a loadSegmentTask to RescheduleTasks" , zap . Any ( "task" , loadSegmentTask ) )
hasWatchQueryChannel := lst . cluster . hasWatchedQueryChannel ( lst . ctx , nodeID , collectionID )
if ! hasWatchQueryChannel {
queryChannel , queryResultChannel := lst . meta . GetQueryChannel ( collectionID )
addQueryChannelRequest := & querypb . AddQueryChannelRequest {
Base : lst . Base ,
NodeID : nodeID ,
CollectionID : collectionID ,
RequestChannelID : queryChannel ,
ResultChannelID : queryResultChannel ,
}
watchQueryChannelTask := & WatchQueryChannelTask {
BaseTask : BaseTask {
ctx : lst . ctx ,
Condition : NewTaskCondition ( lst . ctx ) ,
triggerCondition : querypb . TriggerCondition_grpcRequest ,
} ,
AddQueryChannelRequest : addQueryChannelRequest ,
cluster : lst . cluster ,
}
reScheduledTask = append ( reScheduledTask , watchQueryChannelTask )
log . Debug ( "LoadSegmentTask: add a watchQueryChannelTask to RescheduleTasks" , zap . Any ( "task" , watchQueryChannelTask ) )
}
}
return reScheduledTask , nil
}
2021-06-15 04:41:40 +00:00
type ReleaseSegmentTask struct {
BaseTask
* querypb . ReleaseSegmentsRequest
cluster * queryNodeCluster
}
2021-06-26 08:08:11 +00:00
func ( rst * ReleaseSegmentTask ) MsgBase ( ) * commonpb . MsgBase {
return rst . Base
}
2021-06-19 03:45:09 +00:00
func ( rst * ReleaseSegmentTask ) Marshal ( ) string {
return proto . MarshalTextString ( rst . ReleaseSegmentsRequest )
}
func ( rst * ReleaseSegmentTask ) IsValid ( ) bool {
2021-06-30 09:48:19 +00:00
onService , err := rst . cluster . isOnService ( rst . NodeID )
if err != nil {
return false
}
return rst . ctx != nil && onService
2021-06-19 03:45:09 +00:00
}
2021-06-15 04:41:40 +00:00
func ( rst * ReleaseSegmentTask ) Type ( ) commonpb . MsgType {
return rst . Base . MsgType
}
2021-06-19 03:45:09 +00:00
2021-06-15 04:41:40 +00:00
func ( rst * ReleaseSegmentTask ) Timestamp ( ) Timestamp {
return rst . Base . Timestamp
}
2021-06-19 03:45:09 +00:00
2021-06-30 08:18:13 +00:00
func ( rst * ReleaseSegmentTask ) PreExecute ( context . Context ) error {
2021-06-15 04:41:40 +00:00
segmentIDs := rst . SegmentIDs
log . Debug ( "start do releaseSegmentTask" ,
2021-06-19 03:45:09 +00:00
zap . Int64s ( "segmentIDs" , segmentIDs ) ,
zap . Int64 ( "loaded nodeID" , rst . NodeID ) ,
zap . Int64 ( "taskID" , rst . ID ( ) ) )
2021-06-30 08:18:13 +00:00
return nil
2021-06-15 04:41:40 +00:00
}
2021-06-19 03:45:09 +00:00
2021-06-15 04:41:40 +00:00
func ( rst * ReleaseSegmentTask ) Execute ( ctx context . Context ) error {
status , err := rst . cluster . ReleaseSegments ( rst . ctx , rst . NodeID , rst . ReleaseSegmentsRequest )
if err != nil {
rst . result = status
return err
}
rst . result = status
log . Debug ( "releaseSegmentTask Execute done" ,
2021-06-19 03:45:09 +00:00
zap . Int64s ( "segmentIDs" , rst . SegmentIDs ) ,
zap . Int64 ( "taskID" , rst . ID ( ) ) )
2021-06-15 04:41:40 +00:00
return nil
}
2021-06-19 03:45:09 +00:00
2021-06-30 08:18:13 +00:00
func ( rst * ReleaseSegmentTask ) PostExecute ( context . Context ) error {
2021-06-15 04:41:40 +00:00
segmentIDs := rst . SegmentIDs
log . Debug ( "releaseSegmentTask postExecute done" ,
2021-06-19 03:45:09 +00:00
zap . Int64s ( "segmentIDs" , segmentIDs ) ,
zap . Int64 ( "taskID" , rst . ID ( ) ) )
2021-06-30 08:18:13 +00:00
return nil
2021-06-15 04:41:40 +00:00
}
type WatchDmChannelTask struct {
BaseTask
* querypb . WatchDmChannelsRequest
2021-06-19 03:45:09 +00:00
meta * meta
2021-06-15 04:41:40 +00:00
cluster * queryNodeCluster
}
2021-06-26 08:08:11 +00:00
func ( wdt * WatchDmChannelTask ) MsgBase ( ) * commonpb . MsgBase {
return wdt . Base
}
2021-06-19 03:45:09 +00:00
func ( wdt * WatchDmChannelTask ) Marshal ( ) string {
return proto . MarshalTextString ( wdt . WatchDmChannelsRequest )
}
func ( wdt * WatchDmChannelTask ) IsValid ( ) bool {
2021-06-30 09:48:19 +00:00
onService , err := wdt . cluster . isOnService ( wdt . NodeID )
if err != nil {
return false
}
return wdt . ctx != nil && onService
2021-06-19 03:45:09 +00:00
}
2021-06-15 04:41:40 +00:00
func ( wdt * WatchDmChannelTask ) Type ( ) commonpb . MsgType {
return wdt . Base . MsgType
}
2021-06-19 03:45:09 +00:00
2021-06-15 04:41:40 +00:00
func ( wdt * WatchDmChannelTask ) Timestamp ( ) Timestamp {
return wdt . Base . Timestamp
}
2021-06-19 03:45:09 +00:00
2021-06-30 08:18:13 +00:00
func ( wdt * WatchDmChannelTask ) PreExecute ( context . Context ) error {
2021-06-15 04:41:40 +00:00
channelInfos := wdt . Infos
channels := make ( [ ] string , 0 )
for _ , info := range channelInfos {
channels = append ( channels , info . ChannelName )
2021-04-15 07:15:46 +00:00
}
2021-06-15 04:41:40 +00:00
log . Debug ( "start do watchDmChannelTask" ,
2021-06-19 03:45:09 +00:00
zap . Strings ( "dmChannels" , channels ) ,
zap . Int64 ( "loaded nodeID" , wdt . NodeID ) ,
zap . Int64 ( "taskID" , wdt . ID ( ) ) )
2021-06-30 08:18:13 +00:00
return nil
2021-06-15 04:41:40 +00:00
}
2021-06-19 03:45:09 +00:00
2021-06-15 04:41:40 +00:00
func ( wdt * WatchDmChannelTask ) Execute ( ctx context . Context ) error {
status , err := wdt . cluster . WatchDmChannels ( wdt . ctx , wdt . NodeID , wdt . WatchDmChannelsRequest )
2021-04-15 07:15:46 +00:00
if err != nil {
2021-06-15 04:41:40 +00:00
wdt . result = status
2021-04-15 07:15:46 +00:00
return err
}
2021-06-15 04:41:40 +00:00
wdt . result = status
2021-06-19 03:45:09 +00:00
log . Debug ( "watchDmChannelsTask Execute done" ,
zap . Int64 ( "taskID" , wdt . ID ( ) ) )
2021-06-15 04:41:40 +00:00
return nil
}
2021-06-19 03:45:09 +00:00
2021-06-30 08:18:13 +00:00
func ( wdt * WatchDmChannelTask ) PostExecute ( context . Context ) error {
2021-06-19 03:45:09 +00:00
log . Debug ( "watchDmChannelTask postExecute done" ,
zap . Int64 ( "taskID" , wdt . ID ( ) ) )
2021-06-30 08:18:13 +00:00
return nil
2021-06-15 04:41:40 +00:00
}
2021-06-19 03:45:09 +00:00
func ( wdt * WatchDmChannelTask ) Reschedule ( ) ( [ ] task , error ) {
collectionID := wdt . CollectionID
channelIDs := make ( [ ] string , 0 )
reScheduledTask := make ( [ ] task , 0 )
for _ , info := range wdt . Infos {
channelID := info . ChannelName
channelIDs = append ( channelIDs , channelID )
}
channel2Nodes := shuffleChannelsToQueryNode ( channelIDs , wdt . cluster )
node2channelInfos := make ( map [ int64 ] [ ] * datapb . VchannelInfo )
for index , info := range wdt . Infos {
nodeID := channel2Nodes [ index ]
if _ , ok := node2channelInfos [ nodeID ] ; ! ok {
node2channelInfos [ nodeID ] = make ( [ ] * datapb . VchannelInfo , 0 )
}
node2channelInfos [ nodeID ] = append ( node2channelInfos [ nodeID ] , info )
}
for nodeID , infos := range node2channelInfos {
loadSegmentTask := & WatchDmChannelTask {
BaseTask : wdt . BaseTask ,
WatchDmChannelsRequest : & querypb . WatchDmChannelsRequest {
Base : wdt . Base ,
NodeID : nodeID ,
CollectionID : wdt . CollectionID ,
PartitionID : wdt . PartitionID ,
Infos : infos ,
Schema : wdt . Schema ,
ExcludeInfos : wdt . ExcludeInfos ,
} ,
meta : wdt . meta ,
cluster : wdt . cluster ,
}
reScheduledTask = append ( reScheduledTask , loadSegmentTask )
log . Debug ( "WatchDmChannelTask: add a watchDmChannelTask to RescheduleTasks" , zap . Any ( "task" , loadSegmentTask ) )
hasWatchQueryChannel := wdt . cluster . hasWatchedQueryChannel ( wdt . ctx , nodeID , collectionID )
if ! hasWatchQueryChannel {
queryChannel , queryResultChannel := wdt . meta . GetQueryChannel ( collectionID )
addQueryChannelRequest := & querypb . AddQueryChannelRequest {
Base : wdt . Base ,
NodeID : nodeID ,
CollectionID : collectionID ,
RequestChannelID : queryChannel ,
ResultChannelID : queryResultChannel ,
}
watchQueryChannelTask := & WatchQueryChannelTask {
BaseTask : BaseTask {
ctx : wdt . ctx ,
Condition : NewTaskCondition ( wdt . ctx ) ,
triggerCondition : querypb . TriggerCondition_grpcRequest ,
} ,
AddQueryChannelRequest : addQueryChannelRequest ,
cluster : wdt . cluster ,
}
reScheduledTask = append ( reScheduledTask , watchQueryChannelTask )
log . Debug ( "WatchDmChannelTask: add a watchQueryChannelTask to RescheduleTasks" , zap . Any ( "task" , watchQueryChannelTask ) )
}
}
return reScheduledTask , nil
}
2021-06-15 04:41:40 +00:00
type WatchQueryChannelTask struct {
BaseTask
* querypb . AddQueryChannelRequest
cluster * queryNodeCluster
}
2021-06-26 08:08:11 +00:00
func ( wqt * WatchQueryChannelTask ) MsgBase ( ) * commonpb . MsgBase {
return wqt . Base
}
2021-06-19 03:45:09 +00:00
func ( wqt * WatchQueryChannelTask ) Marshal ( ) string {
return proto . MarshalTextString ( wqt . AddQueryChannelRequest )
2021-06-15 04:41:40 +00:00
}
2021-06-19 03:45:09 +00:00
func ( wqt * WatchQueryChannelTask ) IsValid ( ) bool {
2021-06-30 09:48:19 +00:00
onService , err := wqt . cluster . isOnService ( wqt . NodeID )
if err != nil {
return false
}
return wqt . ctx != nil && onService
2021-06-15 04:41:40 +00:00
}
2021-06-19 03:45:09 +00:00
func ( wqt * WatchQueryChannelTask ) Type ( ) commonpb . MsgType {
return wqt . Base . MsgType
}
func ( wqt * WatchQueryChannelTask ) Timestamp ( ) Timestamp {
return wqt . Base . Timestamp
}
2021-06-30 08:18:13 +00:00
func ( wqt * WatchQueryChannelTask ) PreExecute ( context . Context ) error {
2021-06-15 04:41:40 +00:00
log . Debug ( "start do WatchQueryChannelTask" ,
2021-06-19 03:45:09 +00:00
zap . Int64 ( "collectionID" , wqt . CollectionID ) ,
zap . String ( "queryChannel" , wqt . RequestChannelID ) ,
zap . String ( "queryResultChannel" , wqt . ResultChannelID ) ,
zap . Int64 ( "loaded nodeID" , wqt . NodeID ) ,
zap . Int64 ( "taskID" , wqt . ID ( ) ) )
2021-06-30 08:18:13 +00:00
return nil
2021-06-15 04:41:40 +00:00
}
2021-06-19 03:45:09 +00:00
func ( wqt * WatchQueryChannelTask ) Execute ( ctx context . Context ) error {
status , err := wqt . cluster . AddQueryChannel ( wqt . ctx , wqt . NodeID , wqt . AddQueryChannelRequest )
2021-06-15 04:41:40 +00:00
if err != nil {
2021-06-19 03:45:09 +00:00
wqt . result = status
2021-04-15 07:15:46 +00:00
return err
}
2021-06-19 03:45:09 +00:00
wqt . result = status
2021-06-15 04:41:40 +00:00
log . Debug ( "watchQueryChannelTask Execute done" ,
2021-06-19 03:45:09 +00:00
zap . Int64 ( "collectionID" , wqt . CollectionID ) ,
zap . String ( "queryChannel" , wqt . RequestChannelID ) ,
zap . String ( "queryResultChannel" , wqt . ResultChannelID ) ,
zap . Int64 ( "taskID" , wqt . ID ( ) ) )
2021-06-15 04:41:40 +00:00
return nil
}
2021-06-16 03:09:56 +00:00
2021-06-30 08:18:13 +00:00
func ( wqt * WatchQueryChannelTask ) PostExecute ( context . Context ) error {
2021-06-15 04:41:40 +00:00
log . Debug ( "WatchQueryChannelTask postExecute done" ,
2021-06-19 03:45:09 +00:00
zap . Int64 ( "collectionID" , wqt . CollectionID ) ,
zap . String ( "queryChannel" , wqt . RequestChannelID ) ,
zap . String ( "queryResultChannel" , wqt . ResultChannelID ) ,
zap . Int64 ( "taskID" , wqt . ID ( ) ) )
2021-06-30 08:18:13 +00:00
return nil
2021-06-15 04:41:40 +00:00
}
2021-06-19 03:45:09 +00:00
//****************************handoff task********************************//
type HandoffTask struct {
}
2021-06-15 04:41:40 +00:00
2021-06-19 03:45:09 +00:00
//*********************** ***load balance task*** ************************//
type LoadBalanceTask struct {
BaseTask
* querypb . LoadBalanceRequest
2021-06-21 10:22:13 +00:00
rootCoord types . RootCoord
dataCoord types . DataCoord
cluster * queryNodeCluster
meta * meta
2021-06-19 03:45:09 +00:00
}
2021-06-26 08:08:11 +00:00
func ( lbt * LoadBalanceTask ) MsgBase ( ) * commonpb . MsgBase {
return lbt . Base
}
2021-06-19 03:45:09 +00:00
func ( lbt * LoadBalanceTask ) Marshal ( ) string {
return proto . MarshalTextString ( lbt . LoadBalanceRequest )
}
func ( lbt * LoadBalanceTask ) Type ( ) commonpb . MsgType {
return lbt . Base . MsgType
}
func ( lbt * LoadBalanceTask ) Timestamp ( ) Timestamp {
return lbt . Base . Timestamp
}
2021-06-30 08:18:13 +00:00
func ( lbt * LoadBalanceTask ) PreExecute ( context . Context ) error {
2021-06-19 03:45:09 +00:00
log . Debug ( "start do LoadBalanceTask" ,
zap . Int64s ( "sourceNodeIDs" , lbt . SourceNodeIDs ) ,
zap . Any ( "balanceReason" , lbt . BalanceReason ) ,
zap . Int64 ( "taskID" , lbt . ID ( ) ) )
2021-06-30 08:18:13 +00:00
return nil
2021-06-19 03:45:09 +00:00
}
func ( lbt * LoadBalanceTask ) Execute ( ctx context . Context ) error {
status := & commonpb . Status {
ErrorCode : commonpb . ErrorCode_UnexpectedError ,
2021-04-15 07:15:46 +00:00
}
2021-06-19 03:45:09 +00:00
if lbt . triggerCondition == querypb . TriggerCondition_nodeDown {
for _ , nodeID := range lbt . SourceNodeIDs {
2021-06-30 09:48:19 +00:00
node , err := lbt . cluster . getNodeByID ( nodeID )
if err != nil {
log . Error ( err . Error ( ) )
continue
}
2021-06-19 03:45:09 +00:00
lbt . meta . deleteSegmentInfoByNodeID ( nodeID )
2021-06-30 09:48:19 +00:00
collectionInfos := node . collectionInfos
2021-06-19 03:45:09 +00:00
for collectionID , info := range collectionInfos {
2021-06-30 09:48:19 +00:00
metaInfo , err := lbt . meta . getCollectionInfoByID ( collectionID )
if err != nil {
log . Error ( err . Error ( ) )
continue
}
loadCollection := metaInfo . LoadCollection
schema := metaInfo . Schema
2021-06-19 03:45:09 +00:00
partitionIDs := info . PartitionIDs
segmentsToLoad := make ( [ ] UniqueID , 0 )
2021-06-30 09:48:19 +00:00
loadSegmentReqs := make ( [ ] * querypb . LoadSegmentsRequest , 0 )
2021-06-19 03:45:09 +00:00
channelsToWatch := make ( [ ] string , 0 )
2021-06-30 09:48:19 +00:00
watchDmChannelReqs := make ( [ ] * querypb . WatchDmChannelsRequest , 0 )
2021-06-19 03:45:09 +00:00
dmChannels , err := lbt . meta . getDmChannelsByNodeID ( collectionID , nodeID )
if err != nil {
status . Reason = err . Error ( )
lbt . result = status
return err
2021-06-15 04:41:40 +00:00
}
2021-06-19 03:45:09 +00:00
for _ , partitionID := range partitionIDs {
getRecoveryInfo := & datapb . GetRecoveryInfoRequest {
Base : & commonpb . MsgBase {
MsgType : commonpb . MsgType_LoadBalanceSegments ,
} ,
CollectionID : collectionID ,
PartitionID : partitionID ,
}
2021-07-01 07:24:17 +00:00
recoveryInfo , err := lbt . dataCoord . GetRecoveryInfo ( ctx , getRecoveryInfo )
2021-06-19 03:45:09 +00:00
if err != nil {
status . Reason = err . Error ( )
lbt . result = status
return err
}
2021-06-30 09:48:19 +00:00
for _ , segmentBingLog := range recoveryInfo . Binlogs {
segmentID := segmentBingLog . SegmentID
segmentLoadInfo := & querypb . SegmentLoadInfo {
SegmentID : segmentID ,
PartitionID : partitionID ,
CollectionID : collectionID ,
BinlogPaths : segmentBingLog . FieldBinlogs ,
}
loadSegmentReq := & querypb . LoadSegmentsRequest {
Base : lbt . Base ,
Infos : [ ] * querypb . SegmentLoadInfo { segmentLoadInfo } ,
Schema : schema ,
LoadCondition : querypb . TriggerCondition_nodeDown ,
}
segmentsToLoad = append ( segmentsToLoad , segmentID )
loadSegmentReqs = append ( loadSegmentReqs , loadSegmentReq )
}
2021-06-19 03:45:09 +00:00
for _ , channelInfo := range recoveryInfo . Channels {
for _ , channel := range dmChannels {
if channelInfo . ChannelName == channel {
if loadCollection {
2021-06-30 09:48:19 +00:00
merged := false
for index , channelName := range channelsToWatch {
if channel == channelName {
merged = true
oldInfo := watchDmChannelReqs [ index ] . Infos [ 0 ]
newInfo := mergeVChannelInfo ( oldInfo , channelInfo )
watchDmChannelReqs [ index ] . Infos = [ ] * datapb . VchannelInfo { newInfo }
break
}
}
if ! merged {
watchRequest := & querypb . WatchDmChannelsRequest {
Base : lbt . Base ,
CollectionID : collectionID ,
Infos : [ ] * datapb . VchannelInfo { channelInfo } ,
Schema : schema ,
}
2021-06-19 03:45:09 +00:00
channelsToWatch = append ( channelsToWatch , channel )
2021-06-30 09:48:19 +00:00
watchDmChannelReqs = append ( watchDmChannelReqs , watchRequest )
2021-06-19 03:45:09 +00:00
}
} else {
2021-06-30 09:48:19 +00:00
watchRequest := & querypb . WatchDmChannelsRequest {
Base : lbt . Base ,
CollectionID : collectionID ,
PartitionID : partitionID ,
Infos : [ ] * datapb . VchannelInfo { channelInfo } ,
Schema : schema ,
}
2021-06-19 03:45:09 +00:00
channelsToWatch = append ( channelsToWatch , channel )
2021-06-30 09:48:19 +00:00
watchDmChannelReqs = append ( watchDmChannelReqs , watchRequest )
2021-06-19 03:45:09 +00:00
}
break
}
}
}
2021-06-15 04:41:40 +00:00
}
2021-06-30 11:46:14 +00:00
assignInternalTask ( ctx , collectionID , lbt , lbt . meta , lbt . cluster , loadSegmentReqs , watchDmChannelReqs )
2021-06-30 09:48:19 +00:00
log . Debug ( "loadBalanceTask: assign child task done" , zap . Int64 ( "collectionID" , collectionID ) , zap . Int64s ( "partitionIDs" , partitionIDs ) )
2021-06-15 04:41:40 +00:00
}
2021-04-15 07:15:46 +00:00
}
}
2021-06-19 03:45:09 +00:00
//TODO::
//if lbt.triggerCondition == querypb.TriggerCondition_loadBalance {
// return nil
//}
log . Debug ( "LoadBalanceTask Execute done" ,
zap . Int64s ( "sourceNodeIDs" , lbt . SourceNodeIDs ) ,
zap . Any ( "balanceReason" , lbt . BalanceReason ) ,
zap . Int64 ( "taskID" , lbt . ID ( ) ) )
return nil
}
2021-06-30 08:18:13 +00:00
func ( lbt * LoadBalanceTask ) PostExecute ( context . Context ) error {
2021-06-22 06:10:09 +00:00
for _ , id := range lbt . SourceNodeIDs {
err := lbt . cluster . removeNodeInfo ( id )
if err != nil {
log . Error ( "LoadBalanceTask: remove mode info error" , zap . Int64 ( "nodeID" , id ) )
}
}
2021-06-19 03:45:09 +00:00
log . Debug ( "LoadBalanceTask postExecute done" ,
zap . Int64s ( "sourceNodeIDs" , lbt . SourceNodeIDs ) ,
zap . Any ( "balanceReason" , lbt . BalanceReason ) ,
zap . Int64 ( "taskID" , lbt . ID ( ) ) )
2021-06-30 08:18:13 +00:00
return nil
2021-04-15 07:15:46 +00:00
}
2021-06-19 03:45:09 +00:00
func shuffleChannelsToQueryNode ( dmChannels [ ] string , cluster * queryNodeCluster ) [ ] int64 {
2021-04-15 07:15:46 +00:00
maxNumChannels := 0
2021-06-30 09:48:19 +00:00
nodes := make ( map [ int64 ] * queryNode )
var err error
for {
nodes , err = cluster . onServiceNodes ( )
if err != nil {
log . Debug ( err . Error ( ) )
time . Sleep ( 1 * time . Second )
2021-06-19 03:45:09 +00:00
continue
}
2021-06-30 09:48:19 +00:00
break
}
for nodeID := range nodes {
2021-06-15 04:41:40 +00:00
numChannels , _ := cluster . getNumDmChannels ( nodeID )
2021-04-15 07:15:46 +00:00
if numChannels > maxNumChannels {
maxNumChannels = numChannels
}
}
2021-06-19 03:45:09 +00:00
res := make ( [ ] int64 , 0 )
2021-06-15 04:41:40 +00:00
if len ( dmChannels ) == 0 {
return res
}
2021-04-15 07:15:46 +00:00
offset := 0
loopAll := false
for {
lastOffset := offset
if ! loopAll {
2021-06-30 09:48:19 +00:00
for nodeID := range nodes {
numSegments , _ := cluster . getNumSegments ( nodeID )
2021-06-15 04:41:40 +00:00
if numSegments >= maxNumChannels {
2021-04-15 07:15:46 +00:00
continue
}
2021-06-30 09:48:19 +00:00
res = append ( res , nodeID )
2021-04-15 07:15:46 +00:00
offset ++
if offset == len ( dmChannels ) {
return res
}
}
} else {
2021-06-30 09:48:19 +00:00
for nodeID := range nodes {
res = append ( res , nodeID )
2021-04-15 07:15:46 +00:00
offset ++
if offset == len ( dmChannels ) {
return res
}
}
}
if lastOffset == offset {
loopAll = true
}
}
}
2021-06-26 08:08:11 +00:00
func shuffleSegmentsToQueryNode ( segmentIDs [ ] UniqueID , cluster * queryNodeCluster ) [ ] int64 {
2021-04-15 07:15:46 +00:00
maxNumSegments := 0
2021-06-30 09:48:19 +00:00
nodes := make ( map [ int64 ] * queryNode )
var err error
for {
nodes , err = cluster . onServiceNodes ( )
if err != nil {
log . Debug ( err . Error ( ) )
time . Sleep ( 1 * time . Second )
2021-06-19 03:45:09 +00:00
continue
}
2021-06-30 09:48:19 +00:00
break
}
for nodeID := range nodes {
2021-06-15 04:41:40 +00:00
numSegments , _ := cluster . getNumSegments ( nodeID )
2021-04-15 07:15:46 +00:00
if numSegments > maxNumSegments {
maxNumSegments = numSegments
}
}
2021-06-26 08:08:11 +00:00
res := make ( [ ] int64 , 0 )
2021-04-15 07:15:46 +00:00
if len ( segmentIDs ) == 0 {
return res
}
offset := 0
loopAll := false
for {
lastOffset := offset
if ! loopAll {
2021-06-30 09:48:19 +00:00
for nodeID := range nodes {
numSegments , _ := cluster . getNumSegments ( nodeID )
2021-06-15 04:41:40 +00:00
if numSegments >= maxNumSegments {
2021-04-15 07:15:46 +00:00
continue
}
2021-06-30 09:48:19 +00:00
res = append ( res , nodeID )
2021-04-15 07:15:46 +00:00
offset ++
if offset == len ( segmentIDs ) {
return res
}
}
} else {
2021-06-30 09:48:19 +00:00
for nodeID := range nodes {
res = append ( res , nodeID )
2021-04-15 07:15:46 +00:00
offset ++
if offset == len ( segmentIDs ) {
return res
}
}
}
if lastOffset == offset {
loopAll = true
}
}
}
2021-06-15 04:41:40 +00:00
2021-06-16 03:09:56 +00:00
func mergeVChannelInfo ( info1 * datapb . VchannelInfo , info2 * datapb . VchannelInfo ) * datapb . VchannelInfo {
2021-06-15 04:41:40 +00:00
collectionID := info1 . CollectionID
channelName := info1 . ChannelName
2021-06-16 03:09:56 +00:00
var seekPosition * internalpb . MsgPosition
if info1 . SeekPosition == nil || info2 . SeekPosition == nil {
seekPosition = & internalpb . MsgPosition {
ChannelName : channelName ,
}
} else {
seekPosition = info1 . SeekPosition
if info1 . SeekPosition . Timestamp > info2 . SeekPosition . Timestamp {
seekPosition = info2 . SeekPosition
}
2021-06-15 04:41:40 +00:00
}
2021-06-16 03:09:56 +00:00
checkPoints := make ( [ ] * datapb . SegmentInfo , 0 )
checkPoints = append ( checkPoints , info1 . UnflushedSegments ... )
checkPoints = append ( checkPoints , info2 . UnflushedSegments ... )
2021-06-15 04:41:40 +00:00
flushedSegments := make ( [ ] UniqueID , 0 )
flushedSegments = append ( flushedSegments , info1 . FlushedSegments ... )
flushedSegments = append ( flushedSegments , info2 . FlushedSegments ... )
2021-06-16 03:09:56 +00:00
return & datapb . VchannelInfo {
CollectionID : collectionID ,
ChannelName : channelName ,
SeekPosition : seekPosition ,
UnflushedSegments : checkPoints ,
FlushedSegments : flushedSegments ,
2021-06-15 04:41:40 +00:00
}
}
2021-06-30 08:18:13 +00:00
func assignInternalTask ( ctx context . Context ,
collectionID UniqueID ,
2021-06-26 08:08:11 +00:00
parentTask task ,
meta * meta ,
cluster * queryNodeCluster ,
loadSegmentRequests [ ] * querypb . LoadSegmentsRequest ,
watchDmChannelRequests [ ] * querypb . WatchDmChannelsRequest ) {
2021-06-30 08:18:13 +00:00
sp , _ := trace . StartSpanFromContext ( ctx )
defer sp . Finish ( )
2021-06-26 08:08:11 +00:00
segmentsToLoad := make ( [ ] UniqueID , 0 )
for _ , req := range loadSegmentRequests {
segmentsToLoad = append ( segmentsToLoad , req . Infos [ 0 ] . SegmentID )
}
channelsToWatch := make ( [ ] string , 0 )
for _ , req := range watchDmChannelRequests {
channelsToWatch = append ( channelsToWatch , req . Infos [ 0 ] . ChannelName )
}
segment2Nodes := shuffleSegmentsToQueryNode ( segmentsToLoad , cluster )
watchRequest2Nodes := shuffleChannelsToQueryNode ( channelsToWatch , cluster )
log . Debug ( "assignInternalTask: segment to node" , zap . Any ( "segments mao" , segment2Nodes ) , zap . Int64 ( "collectionID" , collectionID ) )
log . Debug ( "assignInternalTask: watch request to node" , zap . Any ( "request map" , watchRequest2Nodes ) , zap . Int64 ( "collectionID" , collectionID ) )
watchQueryChannelInfo := make ( map [ int64 ] bool )
node2Segments := make ( map [ int64 ] * querypb . LoadSegmentsRequest )
for index , nodeID := range segment2Nodes {
if _ , ok := node2Segments [ nodeID ] ; ! ok {
node2Segments [ nodeID ] = loadSegmentRequests [ index ]
} else {
node2Segments [ nodeID ] . Infos = append ( node2Segments [ nodeID ] . Infos , loadSegmentRequests [ index ] . Infos ... )
}
if cluster . hasWatchedQueryChannel ( parentTask . TraceCtx ( ) , nodeID , collectionID ) {
watchQueryChannelInfo [ nodeID ] = true
continue
}
watchQueryChannelInfo [ nodeID ] = false
}
for _ , nodeID := range watchRequest2Nodes {
if cluster . hasWatchedQueryChannel ( parentTask . TraceCtx ( ) , nodeID , collectionID ) {
watchQueryChannelInfo [ nodeID ] = true
continue
}
watchQueryChannelInfo [ nodeID ] = false
}
for nodeID , loadSegmentsReq := range node2Segments {
2021-06-30 08:18:13 +00:00
ctx = opentracing . ContextWithSpan ( context . Background ( ) , sp )
2021-06-26 08:08:11 +00:00
loadSegmentsReq . NodeID = nodeID
loadSegmentTask := & LoadSegmentTask {
BaseTask : BaseTask {
2021-06-30 08:18:13 +00:00
ctx : ctx ,
Condition : NewTaskCondition ( ctx ) ,
2021-06-26 08:08:11 +00:00
triggerCondition : querypb . TriggerCondition_grpcRequest ,
} ,
LoadSegmentsRequest : loadSegmentsReq ,
meta : meta ,
cluster : cluster ,
}
parentTask . AddChildTask ( loadSegmentTask )
log . Debug ( "assignInternalTask: add a loadSegmentTask childTask" )
}
for index , nodeID := range watchRequest2Nodes {
2021-06-30 08:18:13 +00:00
ctx = opentracing . ContextWithSpan ( context . Background ( ) , sp )
2021-06-26 08:08:11 +00:00
watchDmChannelReq := watchDmChannelRequests [ index ]
watchDmChannelReq . NodeID = nodeID
watchDmChannelTask := & WatchDmChannelTask {
BaseTask : BaseTask {
2021-06-30 08:18:13 +00:00
ctx : ctx ,
Condition : NewTaskCondition ( ctx ) ,
2021-06-26 08:08:11 +00:00
triggerCondition : querypb . TriggerCondition_grpcRequest ,
} ,
WatchDmChannelsRequest : watchDmChannelReq ,
meta : meta ,
cluster : cluster ,
}
parentTask . AddChildTask ( watchDmChannelTask )
log . Debug ( "assignInternalTask: add a watchDmChannelTask childTask" , zap . Any ( "task" , watchDmChannelTask ) )
}
for nodeID , watched := range watchQueryChannelInfo {
if ! watched {
2021-06-30 08:18:13 +00:00
ctx = opentracing . ContextWithSpan ( context . Background ( ) , sp )
2021-06-26 08:08:11 +00:00
queryChannel , queryResultChannel := meta . GetQueryChannel ( collectionID )
addQueryChannelRequest := & querypb . AddQueryChannelRequest {
Base : parentTask . MsgBase ( ) ,
NodeID : nodeID ,
CollectionID : collectionID ,
RequestChannelID : queryChannel ,
ResultChannelID : queryResultChannel ,
}
watchQueryChannelTask := & WatchQueryChannelTask {
BaseTask : BaseTask {
2021-06-30 08:18:13 +00:00
ctx : ctx ,
Condition : NewTaskCondition ( ctx ) ,
2021-06-26 08:08:11 +00:00
triggerCondition : querypb . TriggerCondition_grpcRequest ,
} ,
AddQueryChannelRequest : addQueryChannelRequest ,
cluster : cluster ,
}
parentTask . AddChildTask ( watchQueryChannelTask )
log . Debug ( "assignInternalTask: add a watchQueryChannelTask childTask" , zap . Any ( "task" , watchQueryChannelTask ) )
}
}
}