Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
milvus
milvus
提交
65f168ea
M
milvus
项目概览
milvus
/
milvus
11 个月 前同步成功
通知
260
Star
22476
Fork
2472
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
milvus
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
65f168ea
编写于
8月 30, 2021
作者:
C
congqixia
提交者:
GitHub
8月 30, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix datanode corner cases (#7336)
Signed-off-by:
N
Congqi Xia
<
congqi.xia@zilliz.com
>
上级
599fb0b7
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
151 addition
and
17 deletion
+151
-17
internal/datanode/data_sync_service.go
internal/datanode/data_sync_service.go
+5
-1
internal/datanode/flow_graph_insert_buffer_node.go
internal/datanode/flow_graph_insert_buffer_node.go
+15
-9
internal/datanode/flow_graph_insert_buffer_node_test.go
internal/datanode/flow_graph_insert_buffer_node_test.go
+79
-3
internal/datanode/meta_service.go
internal/datanode/meta_service.go
+4
-4
internal/datanode/meta_service_test.go
internal/datanode/meta_service_test.go
+48
-0
未找到文件。
internal/datanode/data_sync_service.go
浏览文件 @
65f168ea
...
...
@@ -156,7 +156,8 @@ func (dsService *dataSyncService) initNodes(vchanInfo *datapb.VchannelInfo) erro
vchanInfo
.
GetSeekPosition
(),
)
var
ddNode
Node
=
newDDNode
(
dsService
.
clearSignal
,
dsService
.
collectionID
,
vchanInfo
)
var
insertBufferNode
Node
=
newInsertBufferNode
(
var
insertBufferNode
Node
insertBufferNode
,
err
=
newInsertBufferNode
(
dsService
.
ctx
,
dsService
.
replica
,
dsService
.
msFactory
,
...
...
@@ -165,6 +166,9 @@ func (dsService *dataSyncService) initNodes(vchanInfo *datapb.VchannelInfo) erro
saveBinlog
,
vchanInfo
.
GetChannelName
(),
)
if
err
!=
nil
{
return
err
}
var
deleteNode
Node
=
newDeleteDNode
(
dsService
.
ctx
,
...
...
internal/datanode/flow_graph_insert_buffer_node.go
浏览文件 @
65f168ea
...
...
@@ -672,12 +672,12 @@ func flushSegment(
// write insert binlog
for
_
,
blob
:=
range
binLogs
{
fieldID
,
err
:=
strconv
.
ParseInt
(
blob
.
GetKey
(),
10
,
64
)
log
.
Debug
(
"save binlog"
,
zap
.
Int64
(
"fieldID"
,
fieldID
))
if
err
!=
nil
{
log
.
Error
(
"Flush failed ... cannot parse string to fieldID .."
,
zap
.
Error
(
err
))
clearFn
(
false
)
return
}
log
.
Debug
(
"save binlog"
,
zap
.
Int64
(
"fieldID"
,
fieldID
))
logidx
,
err
:=
idAllocator
.
allocID
()
if
err
!=
nil
{
...
...
@@ -800,7 +800,7 @@ func (ibNode *insertBufferNode) getCollMetabySegID(segmentID UniqueID, ts Timest
collID
:=
ibNode
.
replica
.
getCollectionID
()
sch
,
err
:=
ibNode
.
replica
.
getCollectionSchema
(
collID
,
ts
)
if
err
!=
nil
{
return
return
nil
,
err
}
meta
=
&
etcdpb
.
CollectionMeta
{
...
...
@@ -822,7 +822,7 @@ func newInsertBufferNode(
flushCh
<-
chan
*
flushMsg
,
saveBinlog
func
(
*
segmentFlushUnit
)
error
,
channelName
string
,
)
*
insertBufferNode
{
)
(
*
insertBufferNode
,
error
)
{
maxQueueLength
:=
Params
.
FlowGraphMaxQueueLength
maxParallelism
:=
Params
.
FlowGraphMaxParallelism
...
...
@@ -849,20 +849,26 @@ func newInsertBufferNode(
minIOKV
,
err
:=
miniokv
.
NewMinIOKV
(
ctx
,
option
)
if
err
!=
nil
{
panic
(
err
)
return
nil
,
err
}
//input stream, data node time tick
wTt
,
_
:=
factory
.
NewMsgStream
(
ctx
)
wTt
,
err
:=
factory
.
NewMsgStream
(
ctx
)
if
err
!=
nil
{
return
nil
,
err
}
wTt
.
AsProducer
([]
string
{
Params
.
TimeTickChannelName
})
log
.
Debug
(
"datanode AsProducer
: "
+
Params
.
TimeTickChannelName
)
log
.
Debug
(
"datanode AsProducer
"
,
zap
.
String
(
"TimeTickChannelName"
,
Params
.
TimeTickChannelName
)
)
var
wTtMsgStream
msgstream
.
MsgStream
=
wTt
wTtMsgStream
.
Start
()
// update statistics channel
segS
,
_
:=
factory
.
NewMsgStream
(
ctx
)
segS
,
err
:=
factory
.
NewMsgStream
(
ctx
)
if
err
!=
nil
{
return
nil
,
err
}
segS
.
AsProducer
([]
string
{
Params
.
SegmentStatisticsChannelName
})
log
.
Debug
(
"datanode AsProducer
: "
+
Params
.
SegmentStatisticsChannelName
)
log
.
Debug
(
"datanode AsProducer
"
,
zap
.
String
(
"SegmentStatisChannelName"
,
Params
.
SegmentStatisticsChannelName
)
)
var
segStatisticsMsgStream
msgstream
.
MsgStream
=
segS
segStatisticsMsgStream
.
Start
()
...
...
@@ -881,5 +887,5 @@ func newInsertBufferNode(
idAllocator
:
idAllocator
,
dsSaveBinlog
:
saveBinlog
,
segmentCheckPoints
:
make
(
map
[
UniqueID
]
segmentCheckPoint
),
}
}
,
nil
}
internal/datanode/flow_graph_insert_buffer_node_test.go
浏览文件 @
65f168ea
...
...
@@ -13,6 +13,7 @@ package datanode
import
(
"context"
"errors"
"fmt"
"math"
"path"
...
...
@@ -36,6 +37,78 @@ import (
"github.com/milvus-io/milvus/internal/util/flowgraph"
)
// CDFMsFactory count down fails msg factory
type
CDFMsFactory
struct
{
msgstream
.
Factory
cd
int
}
func
(
f
*
CDFMsFactory
)
NewMsgStream
(
ctx
context
.
Context
)
(
msgstream
.
MsgStream
,
error
)
{
f
.
cd
--
if
f
.
cd
<
0
{
return
nil
,
errors
.
New
(
"fail"
)
}
return
f
.
Factory
.
NewMsgStream
(
ctx
)
}
func
TestFLowGraphInsertBufferNodeCreate
(
t
*
testing
.
T
)
{
ctx
,
cancel
:=
context
.
WithTimeout
(
context
.
Background
(),
2
*
time
.
Second
)
defer
cancel
()
insertChannelName
:=
"datanode-01-test-flowgraphinsertbuffernode-create"
testPath
:=
"/test/datanode/root/meta"
err
:=
clearEtcd
(
testPath
)
require
.
NoError
(
t
,
err
)
Params
.
MetaRootPath
=
testPath
Factory
:=
&
MetaFactory
{}
collMeta
:=
Factory
.
CollectionMetaFactory
(
UniqueID
(
0
),
"coll1"
)
mockRootCoord
:=
&
RootCoordFactory
{}
replica
:=
newReplica
(
mockRootCoord
,
collMeta
.
ID
)
err
=
replica
.
addNewSegment
(
1
,
collMeta
.
ID
,
0
,
insertChannelName
,
&
internalpb
.
MsgPosition
{},
&
internalpb
.
MsgPosition
{})
require
.
NoError
(
t
,
err
)
msFactory
:=
msgstream
.
NewPmsFactory
()
m
:=
map
[
string
]
interface
{}{
"receiveBufSize"
:
1024
,
"pulsarAddress"
:
Params
.
PulsarAddress
,
"pulsarBufSize"
:
1024
}
err
=
msFactory
.
SetParams
(
m
)
assert
.
Nil
(
t
,
err
)
saveBinlog
:=
func
(
fu
*
segmentFlushUnit
)
error
{
t
.
Log
(
fu
)
return
nil
}
flushChan
:=
make
(
chan
*
flushMsg
,
100
)
iBNode
,
err
:=
newInsertBufferNode
(
ctx
,
replica
,
msFactory
,
NewAllocatorFactory
(),
flushChan
,
saveBinlog
,
"string"
)
assert
.
NotNil
(
t
,
iBNode
)
require
.
NoError
(
t
,
err
)
ctxDone
,
cancel
:=
context
.
WithCancel
(
ctx
)
cancel
()
// cancel now to make context done
_
,
err
=
newInsertBufferNode
(
ctxDone
,
replica
,
msFactory
,
NewAllocatorFactory
(),
flushChan
,
saveBinlog
,
"string"
)
assert
.
Error
(
t
,
err
)
cdf
:=
&
CDFMsFactory
{
Factory
:
msFactory
,
cd
:
0
,
}
_
,
err
=
newInsertBufferNode
(
ctx
,
replica
,
cdf
,
NewAllocatorFactory
(),
flushChan
,
saveBinlog
,
"string"
)
assert
.
Error
(
t
,
err
)
cdf
=
&
CDFMsFactory
{
Factory
:
msFactory
,
cd
:
1
,
}
_
,
err
=
newInsertBufferNode
(
ctx
,
replica
,
cdf
,
NewAllocatorFactory
(),
flushChan
,
saveBinlog
,
"string"
)
assert
.
Error
(
t
,
err
)
}
func
TestFlowGraphInsertBufferNode_Operate
(
t
*
testing
.
T
)
{
ctx
,
cancel
:=
context
.
WithTimeout
(
context
.
Background
(),
2
*
time
.
Second
)
defer
cancel
()
...
...
@@ -70,7 +143,8 @@ func TestFlowGraphInsertBufferNode_Operate(t *testing.T) {
}
flushChan
:=
make
(
chan
*
flushMsg
,
100
)
iBNode
:=
newInsertBufferNode
(
ctx
,
replica
,
msFactory
,
NewAllocatorFactory
(),
flushChan
,
saveBinlog
,
"string"
)
iBNode
,
err
:=
newInsertBufferNode
(
ctx
,
replica
,
msFactory
,
NewAllocatorFactory
(),
flushChan
,
saveBinlog
,
"string"
)
require
.
NoError
(
t
,
err
)
dmlFlushedCh
:=
make
(
chan
[]
*
datapb
.
FieldBinlog
,
1
)
...
...
@@ -175,7 +249,8 @@ func TestFlushSegment(t *testing.T) {
saveBinlog
:=
func
(
*
segmentFlushUnit
)
error
{
return
nil
}
ibNode
:=
newInsertBufferNode
(
ctx
,
replica
,
msFactory
,
NewAllocatorFactory
(),
flushChan
,
saveBinlog
,
"string"
)
ibNode
,
err
:=
newInsertBufferNode
(
ctx
,
replica
,
msFactory
,
NewAllocatorFactory
(),
flushChan
,
saveBinlog
,
"string"
)
require
.
NoError
(
t
,
err
)
flushSegment
(
collMeta
,
segmentID
,
...
...
@@ -289,7 +364,8 @@ func TestFlowGraphInsertBufferNode_AutoFlush(t *testing.T) {
}
flushChan
:=
make
(
chan
*
flushMsg
,
100
)
iBNode
:=
newInsertBufferNode
(
ctx
,
colRep
,
msFactory
,
NewAllocatorFactory
(),
flushChan
,
saveBinlog
,
"string"
)
iBNode
,
err
:=
newInsertBufferNode
(
ctx
,
colRep
,
msFactory
,
NewAllocatorFactory
(),
flushChan
,
saveBinlog
,
"string"
)
require
.
NoError
(
t
,
err
)
// Auto flush number of rows set to 2
...
...
internal/datanode/meta_service.go
浏览文件 @
65f168ea
...
...
@@ -55,14 +55,14 @@ func (mService *metaService) getCollectionSchema(ctx context.Context, collID Uni
}
response
,
err
:=
mService
.
rootCoord
.
DescribeCollection
(
ctx
,
req
)
if
response
.
GetStatus
()
.
GetErrorCode
()
!=
commonpb
.
ErrorCode_Success
{
return
nil
,
fmt
.
Errorf
(
"Describe collection %v from rootcoord wrong: %s"
,
collID
,
response
.
GetStatus
()
.
GetReason
())
}
if
err
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"Grpc error when describe collection %v from rootcoord: %s"
,
collID
,
err
.
Error
())
}
if
response
.
GetStatus
()
.
GetErrorCode
()
!=
commonpb
.
ErrorCode_Success
{
return
nil
,
fmt
.
Errorf
(
"Describe collection %v from rootcoord wrong: %s"
,
collID
,
response
.
GetStatus
()
.
GetReason
())
}
return
response
.
GetSchema
(),
nil
}
...
...
internal/datanode/meta_service_test.go
浏览文件 @
65f168ea
...
...
@@ -13,8 +13,11 @@ package datanode
import
(
"context"
"errors"
"testing"
"github.com/milvus-io/milvus/internal/proto/commonpb"
"github.com/milvus-io/milvus/internal/proto/milvuspb"
"github.com/stretchr/testify/assert"
)
...
...
@@ -48,3 +51,48 @@ func TestMetaService_All(t *testing.T) {
printCollectionStruct
(
collectionMeta
)
})
}
//RootCoordFails1 root coord mock for failure
type
RootCoordFails1
struct
{
RootCoordFactory
}
// DescribeCollection override method that will fails
func
(
rc
*
RootCoordFails1
)
DescribeCollection
(
ctx
context
.
Context
,
req
*
milvuspb
.
DescribeCollectionRequest
)
(
*
milvuspb
.
DescribeCollectionResponse
,
error
)
{
return
nil
,
errors
.
New
(
"always fail"
)
}
//RootCoordFails2 root coord mock for failure
type
RootCoordFails2
struct
{
RootCoordFactory
}
// DescribeCollection override method that will fails
func
(
rc
*
RootCoordFails2
)
DescribeCollection
(
ctx
context
.
Context
,
req
*
milvuspb
.
DescribeCollectionRequest
)
(
*
milvuspb
.
DescribeCollectionResponse
,
error
)
{
return
&
milvuspb
.
DescribeCollectionResponse
{
Status
:
&
commonpb
.
Status
{
ErrorCode
:
commonpb
.
ErrorCode_UnexpectedError
},
},
nil
}
func
TestMetaServiceRootCoodFails
(
t
*
testing
.
T
)
{
t
.
Run
(
"Test Describe with error"
,
func
(
t
*
testing
.
T
)
{
rc
:=
&
RootCoordFails1
{}
rc
.
setCollectionID
(
collectionID0
)
rc
.
setCollectionName
(
collectionName0
)
ms
:=
newMetaService
(
rc
,
collectionID0
)
_
,
err
:=
ms
.
getCollectionSchema
(
context
.
Background
(),
collectionID1
,
0
)
assert
.
NotNil
(
t
,
err
)
})
t
.
Run
(
"Test Describe wit nil response"
,
func
(
t
*
testing
.
T
)
{
rc
:=
&
RootCoordFails2
{}
rc
.
setCollectionID
(
collectionID0
)
rc
.
setCollectionName
(
collectionName0
)
ms
:=
newMetaService
(
rc
,
collectionID0
)
_
,
err
:=
ms
.
getCollectionSchema
(
context
.
Background
(),
collectionID1
,
0
)
assert
.
NotNil
(
t
,
err
)
})
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录