2021-11-17 11:47:36 +00:00
// Licensed to the LF AI & Data foundation under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
2021-10-07 11:48:54 +00:00
// with the License. You may obtain a copy of the License at
//
2021-11-17 11:47:36 +00:00
// http://www.apache.org/licenses/LICENSE-2.0
2021-10-07 11:48:54 +00:00
//
2021-11-17 11:47:36 +00:00
// 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-10-07 11:48:54 +00:00
2021-06-22 08:44:09 +00:00
package querycoord
2021-01-26 07:13:20 +00:00
import (
2021-06-23 01:24:10 +00:00
"context"
2021-06-15 04:41:40 +00:00
"errors"
"fmt"
2021-03-24 20:40:59 +00:00
"sync"
2021-02-26 09:44:24 +00:00
2021-06-19 03:45:09 +00:00
"github.com/golang/protobuf/proto"
"go.uber.org/zap"
2021-06-15 04:41:40 +00:00
nodeclient "github.com/milvus-io/milvus/internal/distributed/querynode/client"
2021-06-19 03:45:09 +00:00
etcdkv "github.com/milvus-io/milvus/internal/kv/etcd"
"github.com/milvus-io/milvus/internal/log"
2021-08-02 14:39:25 +00:00
"github.com/milvus-io/milvus/internal/proto/commonpb"
2021-11-13 00:49:08 +00:00
"github.com/milvus-io/milvus/internal/proto/datapb"
2021-08-02 14:39:25 +00:00
"github.com/milvus-io/milvus/internal/proto/internalpb"
2021-09-15 12:40:07 +00:00
"github.com/milvus-io/milvus/internal/proto/milvuspb"
2021-04-22 06:45:57 +00:00
"github.com/milvus-io/milvus/internal/proto/querypb"
2021-06-15 04:41:40 +00:00
"github.com/milvus-io/milvus/internal/proto/schemapb"
2021-04-22 06:45:57 +00:00
"github.com/milvus-io/milvus/internal/types"
2021-11-05 08:00:55 +00:00
"github.com/milvus-io/milvus/internal/util/metricsinfo"
2021-01-26 07:13:20 +00:00
)
2021-10-07 11:50:46 +00:00
// Node provides many interfaces to access querynode via grpc
2021-08-02 14:39:25 +00:00
type Node interface {
start ( ) error
stop ( )
2021-11-05 08:00:55 +00:00
getNodeInfo ( ) ( Node , error )
2021-08-02 14:39:25 +00:00
clearNodeInfo ( ) error
addCollection ( collectionID UniqueID , schema * schemapb . CollectionSchema ) error
setCollectionInfo ( info * querypb . CollectionInfo ) error
showCollections ( ) [ ] * querypb . CollectionInfo
releaseCollection ( ctx context . Context , in * querypb . ReleaseCollectionRequest ) error
addPartition ( collectionID UniqueID , partitionID UniqueID ) error
releasePartitions ( ctx context . Context , in * querypb . ReleasePartitionsRequest ) error
watchDmChannels ( ctx context . Context , in * querypb . WatchDmChannelsRequest ) error
2021-11-05 06:47:19 +00:00
watchDeltaChannels ( ctx context . Context , in * querypb . WatchDeltaChannelsRequest ) error
2021-09-15 12:40:07 +00:00
//removeDmChannel(collectionID UniqueID, channels []string) error
2021-08-02 14:39:25 +00:00
2021-11-13 00:49:08 +00:00
hasWatchedDeltaChannel ( collectionID UniqueID ) bool
2021-08-02 14:39:25 +00:00
hasWatchedQueryChannel ( collectionID UniqueID ) bool
2021-09-15 12:40:07 +00:00
//showWatchedQueryChannels() []*querypb.QueryChannelInfo
2021-08-02 14:39:25 +00:00
addQueryChannel ( ctx context . Context , in * querypb . AddQueryChannelRequest ) error
removeQueryChannel ( ctx context . Context , in * querypb . RemoveQueryChannelRequest ) error
2021-09-15 12:40:07 +00:00
setState ( state nodeState )
getState ( ) nodeState
isOnline ( ) bool
isOffline ( ) bool
2021-08-02 14:39:25 +00:00
getSegmentInfo ( ctx context . Context , in * querypb . GetSegmentInfoRequest ) ( * querypb . GetSegmentInfoResponse , error )
loadSegments ( ctx context . Context , in * querypb . LoadSegmentsRequest ) error
releaseSegments ( ctx context . Context , in * querypb . ReleaseSegmentsRequest ) error
getComponentInfo ( ctx context . Context ) * internalpb . ComponentInfo
2021-08-17 02:06:11 +00:00
getMetrics ( ctx context . Context , in * milvuspb . GetMetricsRequest ) ( * milvuspb . GetMetricsResponse , error )
2021-08-02 14:39:25 +00:00
}
2021-06-15 04:41:40 +00:00
type queryNode struct {
2021-07-13 06:16:00 +00:00
ctx context . Context
cancel context . CancelFunc
2021-06-19 03:45:09 +00:00
id int64
address string
client types . QueryNode
kvClient * etcdkv . EtcdKV
2021-03-24 20:40:59 +00:00
2021-06-15 04:41:40 +00:00
sync . RWMutex
collectionInfos map [ UniqueID ] * querypb . CollectionInfo
watchedQueryChannels map [ UniqueID ] * querypb . QueryChannelInfo
2021-11-13 00:49:08 +00:00
watchedDeltaChannels map [ UniqueID ] [ ] * datapb . VchannelInfo
2021-09-15 12:40:07 +00:00
state nodeState
stateLock sync . RWMutex
2021-11-05 08:00:55 +00:00
totalMem uint64
memUsage uint64
memUsageRate float64
cpuUsage float64
2021-01-26 07:13:20 +00:00
}
2021-08-26 06:17:54 +00:00
func newQueryNode ( ctx context . Context , address string , id UniqueID , kv * etcdkv . EtcdKV ) ( Node , error ) {
2021-06-15 04:41:40 +00:00
collectionInfo := make ( map [ UniqueID ] * querypb . CollectionInfo )
watchedChannels := make ( map [ UniqueID ] * querypb . QueryChannelInfo )
2021-11-13 00:49:08 +00:00
watchedDeltaChannels := make ( map [ UniqueID ] [ ] * datapb . VchannelInfo )
2021-07-13 06:16:00 +00:00
childCtx , cancel := context . WithCancel ( ctx )
2021-08-26 06:17:54 +00:00
client , err := nodeclient . NewClient ( childCtx , address )
if err != nil {
cancel ( )
return nil , err
}
2021-07-13 06:16:00 +00:00
node := & queryNode {
ctx : childCtx ,
cancel : cancel ,
2021-06-19 03:45:09 +00:00
id : id ,
address : address ,
2021-08-26 06:17:54 +00:00
client : client ,
2021-06-19 03:45:09 +00:00
kvClient : kv ,
2021-06-15 04:41:40 +00:00
collectionInfos : collectionInfo ,
watchedQueryChannels : watchedChannels ,
2021-11-13 00:49:08 +00:00
watchedDeltaChannels : watchedDeltaChannels ,
2021-09-15 12:40:07 +00:00
state : disConnect ,
2021-07-13 06:16:00 +00:00
}
2021-08-26 06:17:54 +00:00
return node , nil
2021-07-13 06:16:00 +00:00
}
func ( qn * queryNode ) start ( ) error {
2021-08-26 06:17:54 +00:00
if err := qn . client . Init ( ) ; err != nil {
2021-12-06 13:49:53 +00:00
log . Error ( "start: init queryNode client failed" , zap . Int64 ( "nodeID" , qn . id ) , zap . String ( "error" , err . Error ( ) ) )
2021-07-13 06:16:00 +00:00
return err
}
2021-08-26 06:17:54 +00:00
if err := qn . client . Start ( ) ; err != nil {
2021-12-06 13:49:53 +00:00
log . Error ( "start: start queryNode client failed" , zap . Int64 ( "nodeID" , qn . id ) , zap . String ( "error" , err . Error ( ) ) )
2021-07-13 06:16:00 +00:00
return err
}
2021-09-15 12:40:07 +00:00
qn . stateLock . Lock ( )
if qn . state < online {
qn . state = online
}
qn . stateLock . Unlock ( )
2021-12-06 13:49:53 +00:00
log . Debug ( "start: queryNode client start success" , zap . Int64 ( "nodeID" , qn . id ) , zap . String ( "address" , qn . address ) )
2021-07-13 06:16:00 +00:00
return nil
}
func ( qn * queryNode ) stop ( ) {
2021-09-15 12:40:07 +00:00
qn . stateLock . Lock ( )
defer qn . stateLock . Unlock ( )
qn . state = offline
2021-07-13 06:16:00 +00:00
if qn . client != nil {
qn . client . Stop ( )
}
qn . cancel ( )
2021-01-26 07:13:20 +00:00
}
2021-02-04 03:40:14 +00:00
2021-06-15 04:41:40 +00:00
func ( qn * queryNode ) addCollection ( collectionID UniqueID , schema * schemapb . CollectionSchema ) error {
qn . Lock ( )
defer qn . Unlock ( )
if _ , ok := qn . collectionInfos [ collectionID ] ; ! ok {
partitions := make ( [ ] UniqueID , 0 )
2021-12-15 08:53:12 +00:00
channels := make ( [ ] * querypb . DmChannelWatchInfo , 0 )
2021-06-15 04:41:40 +00:00
newCollection := & querypb . CollectionInfo {
CollectionID : collectionID ,
PartitionIDs : partitions ,
ChannelInfos : channels ,
Schema : schema ,
}
qn . collectionInfos [ collectionID ] = newCollection
2021-08-02 14:39:25 +00:00
err := saveNodeCollectionInfo ( collectionID , newCollection , qn . id , qn . kvClient )
2021-06-19 03:45:09 +00:00
if err != nil {
2021-12-06 13:47:58 +00:00
log . Error ( "addCollection: save collectionInfo error" , zap . Int64 ( "nodeID" , qn . id ) , zap . Int64 ( "collectionID" , collectionID ) , zap . Any ( "error" , err . Error ( ) ) )
2021-08-02 14:39:25 +00:00
return err
2021-06-19 03:45:09 +00:00
}
2021-11-18 11:35:15 +00:00
log . Debug ( "queryNode addCollection" , zap . Int64 ( "nodeID" , qn . id ) , zap . Any ( "collectionInfo" , newCollection ) )
2021-03-25 21:09:16 +00:00
}
2021-06-15 04:41:40 +00:00
2021-08-02 14:39:25 +00:00
return nil
}
func ( qn * queryNode ) setCollectionInfo ( info * querypb . CollectionInfo ) error {
qn . Lock ( )
defer qn . Unlock ( )
qn . collectionInfos [ info . CollectionID ] = info
err := saveNodeCollectionInfo ( info . CollectionID , info , qn . id , qn . kvClient )
if err != nil {
2021-12-06 13:51:45 +00:00
log . Error ( "setCollectionInfo: save collectionInfo error" , zap . Int64 ( "nodeID" , qn . id ) , zap . Int64 ( "collectionID" , info . CollectionID ) , zap . Any ( "error" , err . Error ( ) ) )
2021-08-02 14:39:25 +00:00
return err
}
return nil
2021-03-24 20:40:59 +00:00
}
2021-08-02 14:39:25 +00:00
func ( qn * queryNode ) showCollections ( ) [ ] * querypb . CollectionInfo {
qn . RLock ( )
defer qn . RUnlock ( )
results := make ( [ ] * querypb . CollectionInfo , 0 )
for _ , info := range qn . collectionInfos {
results = append ( results , proto . Clone ( info ) . ( * querypb . CollectionInfo ) )
}
return results
2021-06-19 03:45:09 +00:00
}
2021-06-15 04:41:40 +00:00
func ( qn * queryNode ) addPartition ( collectionID UniqueID , partitionID UniqueID ) error {
qn . Lock ( )
defer qn . Unlock ( )
if col , ok := qn . collectionInfos [ collectionID ] ; ok {
for _ , id := range col . PartitionIDs {
if id == partitionID {
2021-08-02 14:39:25 +00:00
return nil
2021-06-15 04:41:40 +00:00
}
}
col . PartitionIDs = append ( col . PartitionIDs , partitionID )
2021-08-02 14:39:25 +00:00
err := saveNodeCollectionInfo ( collectionID , col , qn . id , qn . kvClient )
2021-06-19 03:45:09 +00:00
if err != nil {
2021-08-02 14:39:25 +00:00
log . Error ( "AddPartition: save collectionInfo error" , zap . Any ( "error" , err . Error ( ) ) , zap . Int64 ( "collectionID" , collectionID ) )
2021-06-19 03:45:09 +00:00
}
2021-11-18 11:35:15 +00:00
log . Debug ( "queryNode add partition" , zap . Int64 ( "nodeID" , qn . id ) , zap . Any ( "collectionInfo" , col ) )
2021-06-15 04:41:40 +00:00
return nil
2021-03-22 08:36:10 +00:00
}
2021-08-02 14:39:25 +00:00
return errors . New ( "AddPartition: can't find collection when add partition" )
2021-02-04 09:47:19 +00:00
}
2021-08-02 14:39:25 +00:00
func ( qn * queryNode ) releaseCollectionInfo ( collectionID UniqueID ) error {
2021-06-15 04:41:40 +00:00
qn . Lock ( )
defer qn . Unlock ( )
2021-06-19 03:45:09 +00:00
if _ , ok := qn . collectionInfos [ collectionID ] ; ok {
2021-08-02 14:39:25 +00:00
err := removeNodeCollectionInfo ( collectionID , qn . id , qn . kvClient )
2021-06-19 03:45:09 +00:00
if err != nil {
2021-08-02 14:39:25 +00:00
log . Error ( "ReleaseCollectionInfo: remove collectionInfo error" , zap . Any ( "error" , err . Error ( ) ) , zap . Int64 ( "collectionID" , collectionID ) )
return err
2021-06-19 03:45:09 +00:00
}
delete ( qn . collectionInfos , collectionID )
}
2021-06-15 04:41:40 +00:00
delete ( qn . watchedQueryChannels , collectionID )
2021-08-02 14:39:25 +00:00
return nil
2021-03-25 21:09:16 +00:00
}
2021-08-02 14:39:25 +00:00
func ( qn * queryNode ) releasePartitionsInfo ( collectionID UniqueID , partitionIDs [ ] UniqueID ) error {
2021-06-15 04:41:40 +00:00
qn . Lock ( )
defer qn . Unlock ( )
if info , ok := qn . collectionInfos [ collectionID ] ; ok {
newPartitionIDs := make ( [ ] UniqueID , 0 )
for _ , id := range info . PartitionIDs {
2021-08-02 14:39:25 +00:00
match := false
for _ , partitionID := range partitionIDs {
if id == partitionID {
match = true
break
}
}
if ! match {
2021-06-15 04:41:40 +00:00
newPartitionIDs = append ( newPartitionIDs , id )
}
}
info . PartitionIDs = newPartitionIDs
2021-11-18 11:35:15 +00:00
err := saveNodeCollectionInfo ( collectionID , info , qn . id , qn . kvClient )
2021-06-19 03:45:09 +00:00
if err != nil {
2021-08-02 14:39:25 +00:00
log . Error ( "ReleasePartitionsInfo: remove collectionInfo error" , zap . Any ( "error" , err . Error ( ) ) , zap . Int64 ( "collectionID" , collectionID ) )
return err
2021-06-19 03:45:09 +00:00
}
2021-11-18 11:35:15 +00:00
log . Debug ( "queryNode release partition info" , zap . Int64 ( "nodeID" , qn . id ) , zap . Any ( "info" , info ) )
2021-03-25 21:09:16 +00:00
}
2021-08-02 14:39:25 +00:00
return nil
2021-03-25 21:09:16 +00:00
}
2021-06-15 04:41:40 +00:00
func ( qn * queryNode ) addDmChannel ( collectionID UniqueID , channels [ ] string ) error {
qn . Lock ( )
defer qn . Unlock ( )
2021-08-02 14:39:25 +00:00
//before add channel, should ensure toAddedChannels not in MetaReplica
2021-06-15 04:41:40 +00:00
if info , ok := qn . collectionInfos [ collectionID ] ; ok {
findNodeID := false
for _ , channelInfo := range info . ChannelInfos {
if channelInfo . NodeIDLoaded == qn . id {
findNodeID = true
channelInfo . ChannelIDs = append ( channelInfo . ChannelIDs , channels ... )
}
}
if ! findNodeID {
2021-12-15 08:53:12 +00:00
newChannelInfo := & querypb . DmChannelWatchInfo {
2021-06-15 04:41:40 +00:00
NodeIDLoaded : qn . id ,
ChannelIDs : channels ,
}
info . ChannelInfos = append ( info . ChannelInfos , newChannelInfo )
}
2021-08-02 14:39:25 +00:00
err := saveNodeCollectionInfo ( collectionID , info , qn . id , qn . kvClient )
2021-06-19 03:45:09 +00:00
if err != nil {
2021-08-02 14:39:25 +00:00
log . Error ( "AddDmChannel: save collectionInfo error" , zap . Any ( "error" , err . Error ( ) ) , zap . Int64 ( "collectionID" , collectionID ) )
return err
2021-06-19 03:45:09 +00:00
}
2021-08-02 14:39:25 +00:00
return nil
2021-06-15 04:41:40 +00:00
}
2021-08-02 14:39:25 +00:00
return errors . New ( "AddDmChannels: can't find collection in watchedQueryChannel" )
2021-02-24 09:24:51 +00:00
}
2021-09-15 12:40:07 +00:00
//func (qn *queryNode) removeDmChannel(collectionID UniqueID, channels []string) error {
// qn.Lock()
// defer qn.Unlock()
//
// if info, ok := qn.collectionInfos[collectionID]; ok {
// for _, channelInfo := range info.ChannelInfos {
// if channelInfo.NodeIDLoaded == qn.id {
// newChannelIDs := make([]string, 0)
// for _, channelID := range channelInfo.ChannelIDs {
// findChannel := false
// for _, channel := range channels {
// if channelID == channel {
// findChannel = true
// }
// }
// if !findChannel {
// newChannelIDs = append(newChannelIDs, channelID)
// }
// }
// channelInfo.ChannelIDs = newChannelIDs
// }
// }
//
// err := saveNodeCollectionInfo(collectionID, info, qn.id, qn.kvClient)
// if err != nil {
// log.Error("RemoveDmChannel: save collectionInfo error", zap.Any("error", err.Error()), zap.Int64("collectionID", collectionID))
// }
// }
//
// return errors.New("RemoveDmChannel: can't find collection in watchedQueryChannel")
//}
2021-06-15 04:41:40 +00:00
func ( qn * queryNode ) hasWatchedQueryChannel ( collectionID UniqueID ) bool {
qn . RLock ( )
defer qn . RUnlock ( )
if _ , ok := qn . watchedQueryChannels [ collectionID ] ; ok {
return true
2021-02-04 09:47:19 +00:00
}
2021-06-15 04:41:40 +00:00
return false
}
2021-11-13 00:49:08 +00:00
func ( qn * queryNode ) hasWatchedDeltaChannel ( collectionID UniqueID ) bool {
qn . RLock ( )
defer qn . RUnlock ( )
_ , ok := qn . watchedDeltaChannels [ collectionID ]
return ok
}
2021-09-15 12:40:07 +00:00
//func (qn *queryNode) showWatchedQueryChannels() []*querypb.QueryChannelInfo {
// qn.RLock()
// defer qn.RUnlock()
//
// results := make([]*querypb.QueryChannelInfo, 0)
// for _, info := range qn.watchedQueryChannels {
// results = append(results, proto.Clone(info).(*querypb.QueryChannelInfo))
// }
//
// return results
//}
2021-06-15 04:41:40 +00:00
2021-11-13 00:49:08 +00:00
func ( qn * queryNode ) setDeltaChannelInfo ( collectionID int64 , infos [ ] * datapb . VchannelInfo ) {
qn . Lock ( )
defer qn . Unlock ( )
qn . watchedDeltaChannels [ collectionID ] = infos
}
2021-08-02 14:39:25 +00:00
func ( qn * queryNode ) setQueryChannelInfo ( info * querypb . QueryChannelInfo ) {
2021-06-15 04:41:40 +00:00
qn . Lock ( )
defer qn . Unlock ( )
2021-08-02 14:39:25 +00:00
qn . watchedQueryChannels [ info . CollectionID ] = info
2021-06-19 03:45:09 +00:00
}
2021-08-02 14:39:25 +00:00
func ( qn * queryNode ) removeQueryChannelInfo ( collectionID UniqueID ) {
qn . Lock ( )
defer qn . Unlock ( )
2021-06-19 03:45:09 +00:00
2021-08-02 14:39:25 +00:00
delete ( qn . watchedQueryChannels , collectionID )
2021-06-19 03:45:09 +00:00
}
2021-06-22 06:10:09 +00:00
func ( qn * queryNode ) clearNodeInfo ( ) error {
2021-08-02 14:39:25 +00:00
qn . RLock ( )
defer qn . RUnlock ( )
2021-06-22 06:10:09 +00:00
for collectionID := range qn . collectionInfos {
2021-08-02 14:39:25 +00:00
err := removeNodeCollectionInfo ( collectionID , qn . id , qn . kvClient )
2021-06-22 06:10:09 +00:00
if err != nil {
return err
}
}
return nil
}
2021-09-15 12:40:07 +00:00
func ( qn * queryNode ) setState ( state nodeState ) {
qn . stateLock . Lock ( )
defer qn . stateLock . Unlock ( )
qn . state = state
}
func ( qn * queryNode ) getState ( ) nodeState {
qn . stateLock . RLock ( )
defer qn . stateLock . RUnlock ( )
return qn . state
}
func ( qn * queryNode ) isOnline ( ) bool {
qn . stateLock . RLock ( )
defer qn . stateLock . RUnlock ( )
2021-06-19 03:45:09 +00:00
2021-09-15 12:40:07 +00:00
return qn . state == online
2021-06-19 03:45:09 +00:00
}
2021-09-15 12:40:07 +00:00
func ( qn * queryNode ) isOffline ( ) bool {
qn . stateLock . RLock ( )
defer qn . stateLock . RUnlock ( )
2021-06-19 03:45:09 +00:00
2021-09-15 12:40:07 +00:00
return qn . state == offline
2021-02-04 09:47:19 +00:00
}
2021-08-02 14:39:25 +00:00
//***********************grpc req*************************//
func ( qn * queryNode ) watchDmChannels ( ctx context . Context , in * querypb . WatchDmChannelsRequest ) error {
2021-09-15 12:40:07 +00:00
if ! qn . isOnline ( ) {
2021-08-02 14:39:25 +00:00
return errors . New ( "WatchDmChannels: queryNode is offline" )
}
2021-12-03 07:15:32 +00:00
status , err := qn . client . WatchDmChannels ( qn . ctx , in )
2021-08-02 14:39:25 +00:00
if err != nil {
return err
}
if status . ErrorCode != commonpb . ErrorCode_Success {
return errors . New ( status . Reason )
}
channels := make ( [ ] string , 0 )
for _ , info := range in . Infos {
channels = append ( channels , info . ChannelName )
}
err = qn . addCollection ( in . CollectionID , in . Schema )
if err != nil {
return err
}
err = qn . addDmChannel ( in . CollectionID , channels )
return err
}
2021-11-05 06:47:19 +00:00
func ( qn * queryNode ) watchDeltaChannels ( ctx context . Context , in * querypb . WatchDeltaChannelsRequest ) error {
if ! qn . isOnline ( ) {
return errors . New ( "WatchDmChannels: queryNode is offline" )
}
2021-12-03 07:15:32 +00:00
status , err := qn . client . WatchDeltaChannels ( qn . ctx , in )
2021-11-05 06:47:19 +00:00
if err != nil {
return err
}
if status . ErrorCode != commonpb . ErrorCode_Success {
return errors . New ( status . Reason )
}
2021-11-13 00:49:08 +00:00
qn . setDeltaChannelInfo ( in . CollectionID , in . Infos )
2021-11-05 06:47:19 +00:00
return err
}
2021-08-02 14:39:25 +00:00
func ( qn * queryNode ) addQueryChannel ( ctx context . Context , in * querypb . AddQueryChannelRequest ) error {
2021-09-15 12:40:07 +00:00
if ! qn . isOnline ( ) {
2021-08-02 14:39:25 +00:00
return errors . New ( "AddQueryChannel: queryNode is offline" )
}
2021-12-03 07:15:32 +00:00
status , err := qn . client . AddQueryChannel ( qn . ctx , in )
2021-08-02 14:39:25 +00:00
if err != nil {
return err
}
if status . ErrorCode != commonpb . ErrorCode_Success {
return errors . New ( status . Reason )
}
queryChannelInfo := & querypb . QueryChannelInfo {
2021-12-15 08:53:12 +00:00
CollectionID : in . CollectionID ,
QueryChannel : in . QueryChannel ,
QueryResultChannel : in . QueryResultChannel ,
2021-08-02 14:39:25 +00:00
}
qn . setQueryChannelInfo ( queryChannelInfo )
return nil
}
func ( qn * queryNode ) removeQueryChannel ( ctx context . Context , in * querypb . RemoveQueryChannelRequest ) error {
2021-09-15 12:40:07 +00:00
if ! qn . isOnline ( ) {
2021-08-02 14:39:25 +00:00
return nil
}
2021-12-03 07:15:32 +00:00
status , err := qn . client . RemoveQueryChannel ( qn . ctx , in )
2021-08-02 14:39:25 +00:00
if err != nil {
return err
}
if status . ErrorCode != commonpb . ErrorCode_Success {
return errors . New ( status . Reason )
}
qn . removeQueryChannelInfo ( in . CollectionID )
return nil
}
func ( qn * queryNode ) releaseCollection ( ctx context . Context , in * querypb . ReleaseCollectionRequest ) error {
2021-09-18 07:51:51 +00:00
if ! qn . isOnline ( ) {
log . Debug ( "ReleaseCollection: the query node has been offline, the release request is no longer needed" , zap . Int64 ( "nodeID" , qn . id ) )
2021-08-02 14:39:25 +00:00
return nil
}
2021-12-03 07:15:32 +00:00
status , err := qn . client . ReleaseCollection ( qn . ctx , in )
2021-08-02 14:39:25 +00:00
if err != nil {
return err
}
if status . ErrorCode != commonpb . ErrorCode_Success {
return errors . New ( status . Reason )
}
err = qn . releaseCollectionInfo ( in . CollectionID )
if err != nil {
return err
}
return nil
}
func ( qn * queryNode ) releasePartitions ( ctx context . Context , in * querypb . ReleasePartitionsRequest ) error {
2021-09-15 12:40:07 +00:00
if ! qn . isOnline ( ) {
2021-08-02 14:39:25 +00:00
return nil
}
2021-12-03 07:15:32 +00:00
status , err := qn . client . ReleasePartitions ( qn . ctx , in )
2021-08-02 14:39:25 +00:00
if err != nil {
return err
}
if status . ErrorCode != commonpb . ErrorCode_Success {
return errors . New ( status . Reason )
}
err = qn . releasePartitionsInfo ( in . CollectionID , in . PartitionIDs )
if err != nil {
return err
}
return nil
}
func ( qn * queryNode ) getSegmentInfo ( ctx context . Context , in * querypb . GetSegmentInfoRequest ) ( * querypb . GetSegmentInfoResponse , error ) {
2021-09-15 12:40:07 +00:00
if ! qn . isOnline ( ) {
2021-11-05 08:00:55 +00:00
return nil , fmt . Errorf ( "getSegmentInfo: queryNode %d is offline" , qn . id )
2021-08-02 14:39:25 +00:00
}
2021-12-03 07:15:32 +00:00
res , err := qn . client . GetSegmentInfo ( qn . ctx , in )
2021-11-05 08:00:55 +00:00
if err != nil {
return nil , err
}
if res . Status . ErrorCode != commonpb . ErrorCode_Success {
return nil , errors . New ( res . Status . Reason )
2021-08-02 14:39:25 +00:00
}
2021-11-05 08:00:55 +00:00
return res , nil
2021-08-02 14:39:25 +00:00
}
func ( qn * queryNode ) getComponentInfo ( ctx context . Context ) * internalpb . ComponentInfo {
2021-09-15 12:40:07 +00:00
if ! qn . isOnline ( ) {
2021-08-02 14:39:25 +00:00
return & internalpb . ComponentInfo {
NodeID : qn . id ,
StateCode : internalpb . StateCode_Abnormal ,
}
}
2021-12-03 07:15:32 +00:00
res , err := qn . client . GetComponentStates ( qn . ctx )
2021-08-02 14:39:25 +00:00
if err != nil || res . Status . ErrorCode != commonpb . ErrorCode_Success {
return & internalpb . ComponentInfo {
NodeID : qn . id ,
StateCode : internalpb . StateCode_Abnormal ,
}
}
return res . State
}
2021-08-17 02:06:11 +00:00
func ( qn * queryNode ) getMetrics ( ctx context . Context , in * milvuspb . GetMetricsRequest ) ( * milvuspb . GetMetricsResponse , error ) {
2021-09-15 12:40:07 +00:00
if ! qn . isOnline ( ) {
2021-12-15 14:11:09 +00:00
return nil , fmt . Errorf ( "getMetrics: queryNode %d is offline" , qn . id )
2021-08-17 02:06:11 +00:00
}
2021-12-03 07:15:32 +00:00
return qn . client . GetMetrics ( qn . ctx , in )
2021-08-17 02:06:11 +00:00
}
2021-08-02 14:39:25 +00:00
func ( qn * queryNode ) loadSegments ( ctx context . Context , in * querypb . LoadSegmentsRequest ) error {
2021-09-15 12:40:07 +00:00
if ! qn . isOnline ( ) {
2021-08-02 14:39:25 +00:00
return errors . New ( "LoadSegments: queryNode is offline" )
}
2021-12-03 07:15:32 +00:00
status , err := qn . client . LoadSegments ( qn . ctx , in )
2021-08-02 14:39:25 +00:00
if err != nil {
return err
}
if status . ErrorCode != commonpb . ErrorCode_Success {
return errors . New ( status . Reason )
}
for _ , info := range in . Infos {
err = qn . addCollection ( info . CollectionID , in . Schema )
if err != nil {
return err
}
err = qn . addPartition ( info . CollectionID , info . PartitionID )
if err != nil {
return err
}
}
return nil
}
func ( qn * queryNode ) releaseSegments ( ctx context . Context , in * querypb . ReleaseSegmentsRequest ) error {
2021-09-15 12:40:07 +00:00
if ! qn . isOnline ( ) {
2021-08-02 14:39:25 +00:00
return errors . New ( "ReleaseSegments: queryNode is offline" )
}
2021-12-03 07:15:32 +00:00
status , err := qn . client . ReleaseSegments ( qn . ctx , in )
2021-08-02 14:39:25 +00:00
if err != nil {
return err
}
if status . ErrorCode != commonpb . ErrorCode_Success {
return errors . New ( status . Reason )
}
return nil
}
2021-11-05 08:00:55 +00:00
func ( qn * queryNode ) getNodeInfo ( ) ( Node , error ) {
qn . RLock ( )
defer qn . RUnlock ( )
if ! qn . isOnline ( ) {
return nil , errors . New ( "getNodeInfo: queryNode is offline" )
}
req , err := metricsinfo . ConstructRequestByMetricType ( metricsinfo . SystemInfoMetrics )
if err != nil {
return nil , err
}
resp , err := qn . client . GetMetrics ( qn . ctx , req )
if err != nil {
return nil , err
}
if resp . Status . ErrorCode != commonpb . ErrorCode_Success {
return nil , errors . New ( resp . Status . Reason )
}
infos := metricsinfo . QueryNodeInfos { }
err = metricsinfo . UnmarshalComponentInfos ( resp . Response , & infos )
if err != nil {
return nil , err
}
qn . cpuUsage = infos . HardwareInfos . CPUCoreUsage
qn . totalMem = infos . HardwareInfos . Memory
qn . memUsage = infos . HardwareInfos . MemoryUsage
qn . memUsageRate = float64 ( qn . memUsage ) / float64 ( qn . totalMem )
return & queryNode {
id : qn . id ,
address : qn . address ,
state : qn . state ,
totalMem : qn . totalMem ,
memUsage : qn . memUsage ,
memUsageRate : qn . memUsageRate ,
cpuUsage : qn . cpuUsage ,
} , nil
}
2021-08-02 14:39:25 +00:00
//****************************************************//
func saveNodeCollectionInfo ( collectionID UniqueID , info * querypb . CollectionInfo , nodeID int64 , kv * etcdkv . EtcdKV ) error {
2021-09-29 12:26:00 +00:00
infoBytes , err := proto . Marshal ( info )
if err != nil {
log . Error ( "QueryNode::saveNodeCollectionInfo " , zap . Error ( err ) )
return err
}
2021-08-02 14:39:25 +00:00
key := fmt . Sprintf ( "%s/%d/%d" , queryNodeMetaPrefix , nodeID , collectionID )
2021-09-29 12:26:00 +00:00
return kv . Save ( key , string ( infoBytes ) )
2021-08-02 14:39:25 +00:00
}
func removeNodeCollectionInfo ( collectionID UniqueID , nodeID int64 , kv * etcdkv . EtcdKV ) error {
key := fmt . Sprintf ( "%s/%d/%d" , queryNodeMetaPrefix , nodeID , collectionID )
return kv . Remove ( key )
}