2021-10-15 18:07:09 +08: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-04-19 15:16:33 +08:00
// with the License. You may obtain a copy of the License at
//
2021-10-15 18:07:09 +08:00
// http://www.apache.org/licenses/LICENSE-2.0
2021-04-19 15:16:33 +08:00
//
2021-10-15 18:07:09 +08: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-04-19 15:16:33 +08:00
2021-01-19 11:37:16 +08:00
package datanode
import (
"context"
2021-10-11 21:54:33 +08:00
"fmt"
2021-10-15 20:31:16 +08:00
"time"
2021-01-19 11:37:16 +08:00
2021-04-22 14:45:57 +08:00
"github.com/milvus-io/milvus/internal/log"
2022-02-28 19:11:55 +08:00
"github.com/milvus-io/milvus/internal/metrics"
2021-06-07 13:58:37 +08:00
"github.com/milvus-io/milvus/internal/proto/internalpb"
2021-04-22 14:45:57 +08:00
"github.com/milvus-io/milvus/internal/util/flowgraph"
2022-03-15 21:51:21 +08:00
"github.com/milvus-io/milvus/internal/util/funcutil"
2021-10-11 21:54:33 +08:00
"go.uber.org/zap"
2021-01-19 11:37:16 +08:00
)
2021-10-06 23:02:08 +08:00
// DmInputNode receives messages from message streams, packs messages between two timeticks, and passes all
// messages between two timeticks to the following flowgraph node. In DataNode, the following flow graph node is
// flowgraph ddNode.
2021-10-13 11:16:32 +08:00
func newDmInputNode ( ctx context . Context , seekPos * internalpb . MsgPosition , dmNodeConfig * nodeConfig ) ( * flowgraph . InputNode , error ) {
2021-09-18 09:13:50 +08:00
// subName should be unique, since pchannelName is shared among several collections
2022-08-03 17:10:36 +08:00
// use vchannel in case of reuse pchannel for same collection
consumeSubName := fmt . Sprintf ( "%s-%d-%s" , Params . CommonCfg . DataNodeSubName , Params . DataNodeCfg . GetNodeID ( ) , dmNodeConfig . vChannelName )
2021-10-13 11:16:32 +08:00
insertStream , err := dmNodeConfig . msFactory . NewTtMsgStream ( ctx )
2021-09-23 18:31:55 +08:00
if err != nil {
return nil , err
}
2021-06-07 13:58:37 +08:00
2021-10-06 23:02:08 +08:00
// MsgStream needs a physical channel name, but the channel name in seek position from DataCoord
// is virtual channel name, so we need to convert vchannel name into pchannel neme here.
2022-03-15 21:51:21 +08:00
pchannelName := funcutil . ToPhysicalChannel ( dmNodeConfig . vChannelName )
2021-06-23 12:26:10 +08:00
insertStream . AsConsumer ( [ ] string { pchannelName } , consumeSubName )
2022-04-24 22:03:44 +08:00
metrics . DataNodeNumConsumers . WithLabelValues ( fmt . Sprint ( Params . DataNodeCfg . GetNodeID ( ) ) ) . Inc ( )
2022-03-02 15:35:55 +08:00
log . Info ( "datanode AsConsumer" , zap . String ( "physical channel" , pchannelName ) , zap . String ( "subName" , consumeSubName ) , zap . Int64 ( "collection ID" , dmNodeConfig . collectionID ) )
2021-06-08 19:25:37 +08:00
if seekPos != nil {
2021-06-23 12:26:10 +08:00
seekPos . ChannelName = pchannelName
2021-10-15 20:31:16 +08:00
start := time . Now ( )
2022-07-08 10:18:28 +08:00
log . Info ( "datanode begin to seek" , zap . ByteString ( "seek msgID" , seekPos . GetMsgID ( ) ) , zap . String ( "physical channel" , seekPos . GetChannelName ( ) ) , zap . Int64 ( "collection ID" , dmNodeConfig . collectionID ) )
2021-10-08 19:25:00 +08:00
err = insertStream . Seek ( [ ] * internalpb . MsgPosition { seekPos } )
if err != nil {
return nil , err
}
2022-07-08 10:18:28 +08:00
log . Info ( "datanode seek successfully" , zap . ByteString ( "seek msgID" , seekPos . GetMsgID ( ) ) , zap . String ( "physical channel" , seekPos . GetChannelName ( ) ) , zap . Int64 ( "collection ID" , dmNodeConfig . collectionID ) , zap . Duration ( "elapse" , time . Since ( start ) ) )
2021-06-08 19:25:37 +08:00
}
2021-01-19 11:37:16 +08:00
2022-04-27 10:01:47 +08:00
name := fmt . Sprintf ( "dmInputNode-data-%d-%s" , dmNodeConfig . collectionID , dmNodeConfig . vChannelName )
2021-12-30 10:33:46 +08:00
node := flowgraph . NewInputNode ( insertStream , name , dmNodeConfig . maxQueueLength , dmNodeConfig . maxParallelism )
2021-09-23 18:31:55 +08:00
return node , nil
2021-01-19 11:37:16 +08:00
}