Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
milvus
milvus
提交
d4c297b1
M
milvus
项目概览
milvus
/
milvus
大约 1 年 前同步成功
通知
261
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,发现更多精彩内容 >>
未验证
提交
d4c297b1
编写于
11月 21, 2021
作者:
C
Cai Yudong
提交者:
GitHub
11月 21, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Enhance dml channel operations (#12143)
Signed-off-by:
N
yudong.cai
<
yudong.cai@zilliz.com
>
上级
ac175b6f
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
92 addition
and
67 deletion
+92
-67
internal/rootcoord/dml_channels.go
internal/rootcoord/dml_channels.go
+79
-52
internal/rootcoord/dml_channels_test.go
internal/rootcoord/dml_channels_test.go
+10
-12
internal/rootcoord/root_coord.go
internal/rootcoord/root_coord.go
+1
-1
internal/rootcoord/root_coord_test.go
internal/rootcoord/root_coord_test.go
+1
-1
internal/rootcoord/timeticksync.go
internal/rootcoord/timeticksync.go
+1
-1
未找到文件。
internal/rootcoord/dml_channels.go
浏览文件 @
d4c297b1
...
...
@@ -22,11 +22,16 @@ import (
"github.com/milvus-io/milvus/internal/msgstream"
)
type
dmlMsgStream
struct
{
ms
msgstream
.
MsgStream
mutex
sync
.
RWMutex
refcnt
int64
}
type
dmlChannels
struct
{
core
*
Core
namePrefix
string
capacity
int64
refcnt
sync
.
Map
idx
*
atomic
.
Int64
pool
sync
.
Map
}
...
...
@@ -36,60 +41,71 @@ func newDmlChannels(c *Core, chanNamePrefix string, chanNum int64) *dmlChannels
core
:
c
,
namePrefix
:
chanNamePrefix
,
capacity
:
chanNum
,
refcnt
:
sync
.
Map
{},
idx
:
atomic
.
NewInt64
(
0
),
pool
:
sync
.
Map
{},
}
var
i
int64
for
i
=
0
;
i
<
chanNum
;
i
++
{
name
:=
fmt
.
Sprintf
(
"%s_%d"
,
d
.
namePrefix
,
i
)
for
i
:=
int64
(
0
);
i
<
chanNum
;
i
++
{
name
:=
getDmlChannelName
(
d
.
namePrefix
,
i
)
ms
,
err
:=
c
.
msFactory
.
NewMsgStream
(
c
.
ctx
)
if
err
!=
nil
{
log
.
Error
(
"Failed to add msgstream"
,
zap
.
String
(
"name"
,
name
),
zap
.
Error
(
err
))
panic
(
"Failed to add msgstream"
)
}
d
.
pool
.
Store
(
name
,
&
ms
)
d
.
pool
.
Store
(
name
,
&
dmlMsgStream
{
ms
:
ms
,
mutex
:
sync
.
RWMutex
{},
refcnt
:
0
,
})
}
log
.
Debug
(
"init dml channels"
,
zap
.
Int64
(
"num"
,
chanNum
))
return
d
}
func
(
d
*
dmlChannels
)
GetDmlMsgStreamName
()
string
{
cnt
:=
d
.
idx
.
Load
()
name
:=
fmt
.
Sprintf
(
"%s_%d"
,
d
.
namePrefix
,
cnt
)
d
.
idx
.
Store
((
cnt
+
1
)
%
d
.
capacity
)
return
name
cnt
:=
d
.
idx
.
Inc
()
return
getDmlChannelName
(
d
.
namePrefix
,
(
cnt
-
1
)
%
d
.
capacity
)
}
// ListChannels lists all dml channel names
func
(
d
*
dmlChannels
)
ListChannels
()
[]
string
{
// List
Physical
Channels lists all dml channel names
func
(
d
*
dmlChannels
)
List
Physical
Channels
()
[]
string
{
var
chanNames
[]
string
d
.
refcnt
.
Range
(
d
.
pool
.
Range
(
func
(
k
,
v
interface
{})
bool
{
chanNames
=
append
(
chanNames
,
k
.
(
string
))
dms
:=
v
.
(
*
dmlMsgStream
)
dms
.
mutex
.
RLock
()
if
dms
.
refcnt
>
0
{
chanNames
=
append
(
chanNames
,
k
.
(
string
))
}
dms
.
mutex
.
RUnlock
()
return
true
})
return
chanNames
}
// GetNumChannels get current dml channel count
func
(
d
*
dmlChannels
)
Get
NumChannels
()
int
{
return
len
(
d
.
ListChannels
())
func
(
d
*
dmlChannels
)
Get
PhysicalChannelNum
()
int
{
return
len
(
d
.
List
Physical
Channels
())
}
// Broadcast broadcasts msg pack into specified channel
func
(
d
*
dmlChannels
)
Broadcast
(
chanNames
[]
string
,
pack
*
msgstream
.
MsgPack
)
error
{
for
_
,
chanName
:=
range
chanNames
{
// only in-use chanName exist in refcnt
if
_
,
ok
:=
d
.
refcnt
.
Load
(
chanName
);
ok
{
v
,
_
:=
d
.
pool
.
Load
(
chanName
)
if
err
:=
(
*
(
v
.
(
*
msgstream
.
MsgStream
)))
.
Broadcast
(
pack
);
err
!=
nil
{
v
,
ok
:=
d
.
pool
.
Load
(
chanName
)
if
!
ok
{
log
.
Error
(
"invalid channel name"
,
zap
.
String
(
"chanName"
,
chanName
))
panic
(
"invalid channel name: "
+
chanName
)
}
dms
:=
v
.
(
*
dmlMsgStream
)
dms
.
mutex
.
RLock
()
if
dms
.
refcnt
>
0
{
if
err
:=
dms
.
ms
.
Broadcast
(
pack
);
err
!=
nil
{
log
.
Error
(
"Broadcast failed"
,
zap
.
String
(
"chanName"
,
chanName
))
return
err
}
}
else
{
return
fmt
.
Errorf
(
"channel %s not exist"
,
chanName
)
}
dms
.
mutex
.
RUnlock
()
}
return
nil
}
...
...
@@ -98,22 +114,28 @@ func (d *dmlChannels) Broadcast(chanNames []string, pack *msgstream.MsgPack) err
func
(
d
*
dmlChannels
)
BroadcastMark
(
chanNames
[]
string
,
pack
*
msgstream
.
MsgPack
)
(
map
[
string
][]
byte
,
error
)
{
result
:=
make
(
map
[
string
][]
byte
)
for
_
,
chanName
:=
range
chanNames
{
// only in-use chanName exist in refcnt
if
_
,
ok
:=
d
.
refcnt
.
Load
(
chanName
);
ok
{
v
,
_
:=
d
.
pool
.
Load
(
chanName
)
ids
,
err
:=
(
*
(
v
.
(
*
msgstream
.
MsgStream
)))
.
BroadcastMark
(
pack
)
v
,
ok
:=
d
.
pool
.
Load
(
chanName
)
if
!
ok
{
log
.
Error
(
"invalid channel name"
,
zap
.
String
(
"chanName"
,
chanName
))
panic
(
"invalid channel name: "
+
chanName
)
}
dms
:=
v
.
(
*
dmlMsgStream
)
dms
.
mutex
.
RLock
()
if
dms
.
refcnt
>
0
{
ids
,
err
:=
dms
.
ms
.
BroadcastMark
(
pack
)
if
err
!=
nil
{
log
.
Error
(
"BroadcastMark failed"
,
zap
.
String
(
"chanName"
,
chanName
))
return
result
,
err
}
for
c
hanName
,
idList
:=
range
ids
{
for
c
n
,
idList
:=
range
ids
{
// idList should have length 1, just flat by iteration
for
_
,
id
:=
range
idList
{
result
[
c
hanName
]
=
id
.
Serialize
()
result
[
c
n
]
=
id
.
Serialize
()
}
}
}
else
{
return
result
,
fmt
.
Errorf
(
"channel %s not exist"
,
chanName
)
}
dms
.
mutex
.
RUnlock
()
}
return
result
,
nil
}
...
...
@@ -121,38 +143,43 @@ func (d *dmlChannels) BroadcastMark(chanNames []string, pack *msgstream.MsgPack)
// AddProducerChannels add named channels as producer
func
(
d
*
dmlChannels
)
AddProducerChannels
(
names
...
string
)
{
for
_
,
name
:=
range
names
{
if
v
,
ok
:=
d
.
pool
.
Load
(
name
);
ok
{
var
cnt
int64
if
_
,
ok
:=
d
.
refcnt
.
Load
(
name
);
!
ok
{
ms
:=
*
(
v
.
(
*
msgstream
.
MsgStream
))
ms
.
AsProducer
([]
string
{
name
})
cnt
=
1
}
else
{
v
,
_
:=
d
.
refcnt
.
Load
(
name
)
cnt
=
v
.
(
int64
)
+
1
}
d
.
refcnt
.
Store
(
name
,
cnt
)
log
.
Debug
(
"assign dml channel"
,
zap
.
String
(
"chanName"
,
name
),
zap
.
Int64
(
"refcnt"
,
cnt
))
}
else
{
v
,
ok
:=
d
.
pool
.
Load
(
name
)
if
!
ok
{
log
.
Error
(
"invalid channel name"
,
zap
.
String
(
"chanName"
,
name
))
panic
(
"invalid channel name: "
+
name
)
}
dms
:=
v
.
(
*
dmlMsgStream
)
dms
.
mutex
.
Lock
()
if
dms
.
refcnt
==
0
{
dms
.
ms
.
AsProducer
([]
string
{
name
})
}
dms
.
refcnt
++
dms
.
mutex
.
Unlock
()
}
}
// RemoveProducerChannels removes specified channels
func
(
d
*
dmlChannels
)
RemoveProducerChannels
(
names
...
string
)
{
for
_
,
name
:=
range
names
{
if
v
,
ok
:=
d
.
refcnt
.
Load
(
name
);
ok
{
cnt
:=
v
.
(
int64
)
if
cnt
>
1
{
d
.
refcnt
.
Store
(
name
,
cnt
-
1
)
}
else
{
v1
,
_
:=
d
.
pool
.
Load
(
name
)
ms
:=
*
(
v1
.
(
*
msgstream
.
MsgStream
))
ms
.
Close
()
d
.
refcnt
.
Delete
(
name
)
v
,
ok
:=
d
.
pool
.
Load
(
name
)
if
!
ok
{
log
.
Error
(
"invalid channel name"
,
zap
.
String
(
"chanName"
,
name
))
panic
(
"invalid channel name: "
+
name
)
}
dms
:=
v
.
(
*
dmlMsgStream
)
dms
.
mutex
.
Lock
()
if
dms
.
refcnt
>
0
{
dms
.
refcnt
--
if
dms
.
refcnt
==
0
{
dms
.
ms
.
Close
()
}
}
dms
.
mutex
.
Unlock
()
}
}
func
getDmlChannelName
(
prefix
string
,
idx
int64
)
string
{
return
fmt
.
Sprintf
(
"%s_%d"
,
prefix
,
idx
)
}
internal/rootcoord/dml_channels_test.go
浏览文件 @
d4c297b1
...
...
@@ -13,7 +13,6 @@ package rootcoord
import
(
"context"
"fmt"
"testing"
"github.com/milvus-io/milvus/internal/msgstream"
...
...
@@ -43,36 +42,35 @@ func TestDmlChannels(t *testing.T) {
assert
.
Nil
(
t
,
err
)
dml
:=
newDmlChannels
(
core
,
dmlChanPrefix
,
totalDmlChannelNum
)
chanNames
:=
dml
.
ListChannels
()
chanNames
:=
dml
.
List
Physical
Channels
()
assert
.
Equal
(
t
,
0
,
len
(
chanNames
))
randStr
:=
funcutil
.
RandomString
(
8
)
assert
.
Panics
(
t
,
func
()
{
dml
.
AddProducerChannels
(
randStr
)
})
err
=
dml
.
Broadcast
([]
string
{
randStr
},
nil
)
assert
.
NotNil
(
t
,
err
)
assert
.
EqualError
(
t
,
err
,
fmt
.
Sprintf
(
"channel %s not exist"
,
randStr
))
assert
.
Panics
(
t
,
func
()
{
dml
.
Broadcast
([]
string
{
randStr
},
nil
)
})
assert
.
Panics
(
t
,
func
()
{
dml
.
BroadcastMark
([]
string
{
randStr
},
nil
)
})
assert
.
Panics
(
t
,
func
()
{
dml
.
RemoveProducerChannels
(
randStr
)
})
// dml_xxx_0 => {chanName0, chanName2}
// dml_xxx_1 => {chanName1}
chanName0
:=
dml
.
GetDmlMsgStreamName
()
dml
.
AddProducerChannels
(
chanName0
)
assert
.
Equal
(
t
,
1
,
dml
.
Get
NumChannels
())
assert
.
Equal
(
t
,
1
,
dml
.
Get
PhysicalChannelNum
())
chanName1
:=
dml
.
GetDmlMsgStreamName
()
dml
.
AddProducerChannels
(
chanName1
)
assert
.
Equal
(
t
,
2
,
dml
.
Get
NumChannels
())
assert
.
Equal
(
t
,
2
,
dml
.
Get
PhysicalChannelNum
())
chanName2
:=
dml
.
GetDmlMsgStreamName
()
dml
.
AddProducerChannels
(
chanName2
)
assert
.
Equal
(
t
,
2
,
dml
.
Get
NumChannels
())
assert
.
Equal
(
t
,
2
,
dml
.
Get
PhysicalChannelNum
())
dml
.
RemoveProducerChannels
(
chanName0
)
assert
.
Equal
(
t
,
2
,
dml
.
Get
NumChannels
())
assert
.
Equal
(
t
,
2
,
dml
.
Get
PhysicalChannelNum
())
dml
.
RemoveProducerChannels
(
chanName1
)
assert
.
Equal
(
t
,
1
,
dml
.
Get
NumChannels
())
assert
.
Equal
(
t
,
1
,
dml
.
Get
PhysicalChannelNum
())
dml
.
RemoveProducerChannels
(
chanName0
)
assert
.
Equal
(
t
,
0
,
dml
.
Get
NumChannels
())
assert
.
Equal
(
t
,
0
,
dml
.
Get
PhysicalChannelNum
())
}
internal/rootcoord/root_coord.go
浏览文件 @
d4c297b1
...
...
@@ -482,7 +482,7 @@ func (c *Core) setMsgStreams() error {
metrics
.
RootCoordDDChannelTimeTick
.
Set
(
float64
(
tsoutil
.
Mod24H
(
t
)))
//c.dmlChannels.BroadcastAll(&msgPack)
pc
:=
c
.
dmlChannels
.
ListChannels
()
pc
:=
c
.
dmlChannels
.
List
Physical
Channels
()
pt
:=
make
([]
uint64
,
len
(
pc
))
for
i
:=
0
;
i
<
len
(
pt
);
i
++
{
pt
[
i
]
=
t
...
...
internal/rootcoord/root_coord_test.go
浏览文件 @
d4c297b1
...
...
@@ -680,7 +680,7 @@ func TestRootCoord(t *testing.T) {
assert
.
Nil
(
t
,
err
)
assert
.
Equal
(
t
,
commonpb
.
ErrorCode_Success
,
status
.
ErrorCode
)
assert
.
Equal
(
t
,
shardsNum
,
int32
(
core
.
dmlChannels
.
Get
NumChannels
()))
assert
.
Equal
(
t
,
shardsNum
,
int32
(
core
.
dmlChannels
.
Get
PhysicalChannelNum
()))
createMeta
,
err
:=
core
.
MetaTable
.
GetCollectionByName
(
collName
,
0
)
assert
.
Nil
(
t
,
err
)
...
...
internal/rootcoord/timeticksync.go
浏览文件 @
d4c297b1
...
...
@@ -310,7 +310,7 @@ func (t *timetickSync) GetProxyNum() int {
// GetChanNum return the num of channel
func
(
t
*
timetickSync
)
GetChanNum
()
int
{
return
t
.
core
.
dmlChannels
.
Get
NumChannels
()
return
t
.
core
.
dmlChannels
.
Get
PhysicalChannelNum
()
}
func
minTimeTick
(
tt
...
typeutil
.
Timestamp
)
typeutil
.
Timestamp
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录