Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
milvus
milvus
提交
390fad4e
M
milvus
项目概览
milvus
/
milvus
11 个月 前同步成功
通知
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,发现更多精彩内容 >>
未验证
提交
390fad4e
编写于
10月 29, 2021
作者:
C
congqixia
提交者:
GitHub
10月 29, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix LatestPosition option conflict with earliest patch (#10907)
Signed-off-by:
N
Congqi Xia
<
congqi.xia@zilliz.com
>
上级
b4182587
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
135 addition
and
123 deletion
+135
-123
internal/datacoord/server.go
internal/datacoord/server.go
+128
-119
internal/datacoord/server_test.go
internal/datacoord/server_test.go
+2
-2
internal/util/mqclient/pulsar_client.go
internal/util/mqclient/pulsar_client.go
+5
-2
未找到文件。
internal/datacoord/server.go
浏览文件 @
390fad4e
...
...
@@ -312,54 +312,54 @@ func (s *Server) initMeta() error {
func
(
s
*
Server
)
startServerLoop
()
{
s
.
serverLoopCtx
,
s
.
serverLoopCancel
=
context
.
WithCancel
(
s
.
ctx
)
s
.
serverLoopWg
.
Add
(
4
)
go
s
.
startStatsChannel
(
s
.
serverLoopCtx
)
go
s
.
startDataNodeTtLoop
(
s
.
serverLoopCtx
)
go
s
.
startWatchService
(
s
.
serverLoopCtx
)
go
s
.
startFlushLoop
(
s
.
serverLoopCtx
)
s
.
startStatsChannel
(
s
.
serverLoopCtx
)
s
.
startDataNodeTtLoop
(
s
.
serverLoopCtx
)
s
.
startWatchService
(
s
.
serverLoopCtx
)
s
.
startFlushLoop
(
s
.
serverLoopCtx
)
go
s
.
session
.
LivenessCheck
(
s
.
serverLoopCtx
,
func
()
{
log
.
Fatal
(
"Data Coord disconnected from etcd, process will exit"
,
zap
.
Int64
(
"Server Id"
,
s
.
session
.
ServerID
))
})
}
func
(
s
*
Server
)
startStatsChannel
(
ctx
context
.
Context
)
{
defer
logutil
.
LogPanic
()
defer
s
.
serverLoopWg
.
Done
()
statsStream
,
_
:=
s
.
msFactory
.
NewMsgStream
(
ctx
)
statsStream
.
AsConsumer
([]
string
{
Params
.
StatisticsChannelName
},
Params
.
DataCoordSubscriptionName
)
log
.
Debug
(
"dataCoord create stats channel consumer"
,
zap
.
String
(
"channelName"
,
Params
.
StatisticsChannelName
),
zap
.
String
(
"descriptionName"
,
Params
.
DataCoordSubscriptionName
))
statsStream
.
Start
()
defer
statsStream
.
Close
()
for
{
select
{
case
<-
ctx
.
Done
()
:
log
.
Debug
(
"stats channel shutdown"
)
return
default
:
}
msgPack
:=
statsStream
.
Consume
()
if
msgPack
==
nil
{
log
.
Debug
(
"receive nil stats msg, shutdown stats channel"
)
return
}
for
_
,
msg
:=
range
msgPack
.
Msgs
{
if
msg
.
Type
()
!=
commonpb
.
MsgType_SegmentStatistics
{
log
.
Warn
(
"receive unknown msg from segment statistics channel"
,
zap
.
Stringer
(
"msgType"
,
msg
.
Type
()))
continue
go
func
()
{
defer
logutil
.
LogPanic
()
defer
s
.
serverLoopWg
.
Done
()
defer
statsStream
.
Close
()
for
{
select
{
case
<-
ctx
.
Done
()
:
log
.
Debug
(
"stats channel shutdown"
)
return
default
:
}
msgPack
:=
statsStream
.
Consume
()
if
msgPack
==
nil
{
log
.
Debug
(
"receive nil stats msg, shutdown stats channel"
)
return
}
ssMsg
:=
msg
.
(
*
msgstream
.
SegmentStatisticsMsg
)
for
_
,
stat
:=
range
ssMsg
.
SegStats
{
s
.
meta
.
SetCurrentRows
(
stat
.
GetSegmentID
(),
stat
.
GetNumRows
())
for
_
,
msg
:=
range
msgPack
.
Msgs
{
if
msg
.
Type
()
!=
commonpb
.
MsgType_SegmentStatistics
{
log
.
Warn
(
"receive unknown msg from segment statistics channel"
,
zap
.
Stringer
(
"msgType"
,
msg
.
Type
()))
continue
}
ssMsg
:=
msg
.
(
*
msgstream
.
SegmentStatisticsMsg
)
for
_
,
stat
:=
range
ssMsg
.
SegStats
{
s
.
meta
.
SetCurrentRows
(
stat
.
GetSegmentID
(),
stat
.
GetNumRows
())
}
}
}
}
}
()
}
func
(
s
*
Server
)
startDataNodeTtLoop
(
ctx
context
.
Context
)
{
defer
logutil
.
LogPanic
()
defer
s
.
serverLoopWg
.
Done
()
ttMsgStream
,
err
:=
s
.
msFactory
.
NewMsgStream
(
ctx
)
if
err
!=
nil
{
log
.
Error
(
"new msg stream failed"
,
zap
.
Error
(
err
))
...
...
@@ -371,97 +371,103 @@ func (s *Server) startDataNodeTtLoop(ctx context.Context) {
zap
.
String
(
"timeTickChannelName"
,
Params
.
TimeTickChannelName
),
zap
.
String
(
"subscriptionName"
,
Params
.
DataCoordSubscriptionName
))
ttMsgStream
.
Start
()
defer
ttMsgStream
.
Close
()
var
checker
*
LongTermChecker
if
enableTtChecker
{
checker
=
NewLongTermChecker
(
ctx
,
ttCheckerName
,
ttMaxInterval
,
ttCheckerWarnMsg
)
checker
.
Start
()
defer
checker
.
Stop
()
}
for
{
select
{
case
<-
ctx
.
Done
()
:
log
.
Debug
(
"data node tt loop shutdown"
)
return
default
:
}
msgPack
:=
ttMsgStream
.
Consume
()
if
msgPack
==
nil
{
log
.
Debug
(
"receive nil tt msg, shutdown tt channel"
)
return
go
func
()
{
var
checker
*
LongTermChecker
if
enableTtChecker
{
checker
=
NewLongTermChecker
(
ctx
,
ttCheckerName
,
ttMaxInterval
,
ttCheckerWarnMsg
)
checker
.
Start
()
defer
checker
.
Stop
()
}
for
_
,
msg
:=
range
msgPack
.
Msgs
{
if
msg
.
Type
()
!=
commonpb
.
MsgType_DataNodeTt
{
log
.
Warn
(
"receive unexpected msg type from tt channel"
,
zap
.
Stringer
(
"msgType"
,
msg
.
Type
()))
continue
defer
logutil
.
LogPanic
()
defer
s
.
serverLoopWg
.
Done
()
defer
ttMsgStream
.
Close
()
for
{
select
{
case
<-
ctx
.
Done
()
:
log
.
Debug
(
"data node tt loop shutdown"
)
return
default
:
}
ttMsg
:=
msg
.
(
*
msgstream
.
DataNodeTtMsg
)
if
enableTtChecker
{
checker
.
Check
()
msgPack
:=
ttMsgStream
.
Consume
()
if
msgPack
==
nil
{
log
.
Debug
(
"receive nil tt msg, shutdown tt channel"
)
return
}
for
_
,
msg
:=
range
msgPack
.
Msgs
{
if
msg
.
Type
()
!=
commonpb
.
MsgType_DataNodeTt
{
log
.
Warn
(
"receive unexpected msg type from tt channel"
,
zap
.
Stringer
(
"msgType"
,
msg
.
Type
()))
continue
}
ttMsg
:=
msg
.
(
*
msgstream
.
DataNodeTtMsg
)
if
enableTtChecker
{
checker
.
Check
()
}
ch
:=
ttMsg
.
ChannelName
ts
:=
ttMsg
.
Timestamp
if
err
:=
s
.
segmentManager
.
ExpireAllocations
(
ch
,
ts
);
err
!=
nil
{
log
.
Warn
(
"failed to expire allocations"
,
zap
.
Error
(
err
))
continue
}
physical
,
_
:=
tsoutil
.
ParseTS
(
ts
)
if
time
.
Since
(
physical
)
.
Minutes
()
>
1
{
// if lag behind, log every 1 mins about
log
.
RatedWarn
(
60.0
,
"Time tick lag behind for more than 1 minutes"
,
zap
.
String
(
"channel"
,
ch
),
zap
.
Time
(
"tt"
,
physical
))
}
segments
,
err
:=
s
.
segmentManager
.
GetFlushableSegments
(
ctx
,
ch
,
ts
)
if
err
!=
nil
{
log
.
Warn
(
"get flushable segments failed"
,
zap
.
Error
(
err
))
continue
}
ch
:=
ttMsg
.
ChannelName
ts
:=
ttMsg
.
Timestamp
if
err
:=
s
.
segmentManager
.
ExpireAllocations
(
ch
,
ts
);
err
!=
nil
{
log
.
Warn
(
"failed to expire allocations"
,
zap
.
Error
(
err
))
continue
}
physical
,
_
:=
tsoutil
.
ParseTS
(
ts
)
if
time
.
Since
(
physical
)
.
Minutes
()
>
1
{
// if lag behind, log every 1 mins about
log
.
RatedWarn
(
60.0
,
"Time tick lag behind for more than 1 minutes"
,
zap
.
String
(
"channel"
,
ch
),
zap
.
Time
(
"tt"
,
physical
))
}
segments
,
err
:=
s
.
segmentManager
.
GetFlushableSegments
(
ctx
,
ch
,
ts
)
if
err
!=
nil
{
log
.
Warn
(
"get flushable segments failed"
,
zap
.
Error
(
err
))
continue
}
staleSegments
:=
s
.
meta
.
SelectSegments
(
func
(
info
*
SegmentInfo
)
bool
{
return
!
info
.
lastFlushTime
.
IsZero
()
&&
time
.
Since
(
info
.
lastFlushTime
)
.
Minutes
()
>=
segmentTimedFlushDuration
})
staleSegments
:=
s
.
meta
.
SelectSegments
(
func
(
info
*
SegmentInfo
)
bool
{
return
!
info
.
lastFlushTime
.
IsZero
()
&&
time
.
Since
(
info
.
lastFlushTime
)
.
Minutes
()
>=
segmentTimedFlushDuration
})
if
len
(
segments
)
+
len
(
staleSegments
)
==
0
{
continue
}
log
.
Debug
(
"flush segments"
,
zap
.
Int64s
(
"segmentIDs"
,
segments
),
zap
.
Int
(
"markSegments count"
,
len
(
staleSegments
)))
segmentInfos
:=
make
([]
*
datapb
.
SegmentInfo
,
0
,
len
(
segments
))
for
_
,
id
:=
range
segments
{
sInfo
:=
s
.
meta
.
GetSegment
(
id
)
if
sInfo
==
nil
{
log
.
Error
(
"get segment from meta error"
,
zap
.
Int64
(
"id"
,
id
),
zap
.
Error
(
err
))
if
len
(
segments
)
+
len
(
staleSegments
)
==
0
{
continue
}
segmentInfos
=
append
(
segmentInfos
,
sInfo
.
SegmentInfo
)
s
.
meta
.
SetLastFlushTime
(
id
,
time
.
Now
())
}
markSegments
:=
make
([]
*
datapb
.
SegmentInfo
,
0
,
len
(
staleSegments
))
for
_
,
segment
:=
range
staleSegments
{
for
_
,
fSeg
:=
range
segmentInfos
{
// check segment needs flush first
if
segment
.
GetID
()
==
fSeg
.
GetID
()
{
log
.
Debug
(
"flush segments"
,
zap
.
Int64s
(
"segmentIDs"
,
segments
),
zap
.
Int
(
"markSegments count"
,
len
(
staleSegments
)))
segmentInfos
:=
make
([]
*
datapb
.
SegmentInfo
,
0
,
len
(
segments
))
for
_
,
id
:=
range
segments
{
sInfo
:=
s
.
meta
.
GetSegment
(
id
)
if
sInfo
==
nil
{
log
.
Error
(
"get segment from meta error"
,
zap
.
Int64
(
"id"
,
id
),
zap
.
Error
(
err
))
continue
}
segmentInfos
=
append
(
segmentInfos
,
sInfo
.
SegmentInfo
)
s
.
meta
.
SetLastFlushTime
(
id
,
time
.
Now
())
}
markSegments
:=
make
([]
*
datapb
.
SegmentInfo
,
0
,
len
(
staleSegments
))
for
_
,
segment
:=
range
staleSegments
{
for
_
,
fSeg
:=
range
segmentInfos
{
// check segment needs flush first
if
segment
.
GetID
()
==
fSeg
.
GetID
()
{
continue
}
}
markSegments
=
append
(
markSegments
,
segment
.
SegmentInfo
)
s
.
meta
.
SetLastFlushTime
(
segment
.
GetID
(),
time
.
Now
())
}
if
len
(
segmentInfos
)
+
len
(
markSegments
)
>
0
{
s
.
cluster
.
Flush
(
s
.
ctx
,
segmentInfos
,
markSegments
)
}
markSegments
=
append
(
markSegments
,
segment
.
SegmentInfo
)
s
.
meta
.
SetLastFlushTime
(
segment
.
GetID
(),
time
.
Now
())
}
if
len
(
segmentInfos
)
+
len
(
markSegments
)
>
0
{
s
.
cluster
.
Flush
(
s
.
ctx
,
segmentInfos
,
markSegments
)
}
s
.
helper
.
eventAfterHandleDataNodeTt
()
}
s
.
helper
.
eventAfterHandleDataNodeTt
()
}
}()
}
//go:norace
// fix datarace in unittest
// startWatchService will only be invoked at start procedure
// otherwise, remove the annotation and add atomic protection
// start a goroutine wto watch services
func
(
s
*
Server
)
startWatchService
(
ctx
context
.
Context
)
{
go
s
.
watchService
(
ctx
)
}
// watchService watchs services
func
(
s
*
Server
)
watchService
(
ctx
context
.
Context
)
{
defer
logutil
.
LogPanic
()
defer
s
.
serverLoopWg
.
Done
()
for
{
...
...
@@ -484,6 +490,7 @@ func (s *Server) startWatchService(ctx context.Context) {
}
}
}
}
// handles session events - DataNodes Add/Del
...
...
@@ -527,22 +534,24 @@ func (s *Server) handleSessionEvent(ctx context.Context, event *sessionutil.Sess
}
func
(
s
*
Server
)
startFlushLoop
(
ctx
context
.
Context
)
{
defer
logutil
.
LogPanic
()
defer
s
.
serverLoopWg
.
Done
()
ctx2
,
cancel
:=
context
.
WithCancel
(
ctx
)
defer
cancel
()
// send `Flushing` segments
go
s
.
handleFlushingSegments
(
ctx2
)
for
{
select
{
case
<-
ctx
.
Done
()
:
log
.
Debug
(
"flush loop shutdown"
)
return
case
segmentID
:=
<-
s
.
flushCh
:
//Ignore return error
_
=
s
.
postFlush
(
ctx
,
segmentID
)
go
func
()
{
defer
logutil
.
LogPanic
()
defer
s
.
serverLoopWg
.
Done
()
ctx2
,
cancel
:=
context
.
WithCancel
(
ctx
)
defer
cancel
()
// send `Flushing` segments
go
s
.
handleFlushingSegments
(
ctx2
)
for
{
select
{
case
<-
ctx
.
Done
()
:
log
.
Debug
(
"flush loop shutdown"
)
return
case
segmentID
:=
<-
s
.
flushCh
:
//Ignore return error
_
=
s
.
postFlush
(
ctx
,
segmentID
)
}
}
}
}
()
}
// post function after flush is done
...
...
internal/datacoord/server_test.go
浏览文件 @
390fad4e
...
...
@@ -592,7 +592,7 @@ func TestService_WatchServices(t *testing.T) {
signal
:=
make
(
chan
struct
{},
1
)
go
func
()
{
svr
.
startW
atchService
(
context
.
Background
())
svr
.
w
atchService
(
context
.
Background
())
flag
=
true
signal
<-
struct
{}{}
}()
...
...
@@ -609,7 +609,7 @@ func TestService_WatchServices(t *testing.T) {
svr
.
serverLoopWg
.
Add
(
1
)
go
func
()
{
svr
.
startW
atchService
(
ctx
)
svr
.
w
atchService
(
ctx
)
flag
=
true
signal
<-
struct
{}{}
}()
...
...
internal/util/mqclient/pulsar_client.go
浏览文件 @
390fad4e
...
...
@@ -67,9 +67,12 @@ func (pc *pulsarClient) Subscribe(options ConsumerOptions) (Consumer, error) {
if
err
!=
nil
{
return
nil
,
err
}
//consumer.Seek(pulsar.EarliestMessageID())
//consumer.SeekByTime(time.Unix(0, 0))
pConsumer
:=
&
pulsarConsumer
{
c
:
consumer
,
closeCh
:
make
(
chan
struct
{})}
// prevent seek to earliest patch applied when using latest position options
if
options
.
SubscriptionInitialPosition
==
SubscriptionPositionLatest
{
pConsumer
.
hasSeek
=
true
}
return
pConsumer
,
nil
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录