Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
e92bfa55
TDengine
项目概览
taosdata
/
TDengine
大约 1 年 前同步成功
通知
1184
Star
22015
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e92bfa55
编写于
3月 06, 2023
作者:
H
Haojun Liao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(query): allow only one trans to be execute for each balance, and do some other refactor.
上级
35de3792
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
189 addition
and
132 deletion
+189
-132
source/dnode/mnode/impl/src/mndConsumer.c
source/dnode/mnode/impl/src/mndConsumer.c
+69
-64
source/dnode/mnode/impl/src/mndSubscribe.c
source/dnode/mnode/impl/src/mndSubscribe.c
+120
-68
未找到文件。
source/dnode/mnode/impl/src/mndConsumer.c
浏览文件 @
e92bfa55
...
@@ -845,6 +845,53 @@ static int32_t mndConsumerActionDelete(SSdb *pSdb, SMqConsumerObj *pConsumer) {
...
@@ -845,6 +845,53 @@ static int32_t mndConsumerActionDelete(SSdb *pSdb, SMqConsumerObj *pConsumer) {
return
0
;
return
0
;
}
}
static
void
updateConsumerStatus
(
SMqConsumerObj
*
pConsumer
)
{
int32_t
status
=
pConsumer
->
status
;
if
(
taosArrayGetSize
(
pConsumer
->
rebNewTopics
)
==
0
&&
taosArrayGetSize
(
pConsumer
->
rebRemovedTopics
)
==
0
)
{
if
(
status
==
MQ_CONSUMER_STATUS__MODIFY
||
status
==
MQ_CONSUMER_STATUS__MODIFY_IN_REB
)
{
pConsumer
->
status
=
MQ_CONSUMER_STATUS__READY
;
}
else
if
(
status
==
MQ_CONSUMER_STATUS__LOST_IN_REB
||
status
==
MQ_CONSUMER_STATUS__LOST
)
{
pConsumer
->
status
=
MQ_CONSUMER_STATUS__LOST_REBD
;
}
}
else
{
if
(
status
==
MQ_CONSUMER_STATUS__MODIFY
||
status
==
MQ_CONSUMER_STATUS__MODIFY_IN_REB
)
{
pConsumer
->
status
=
MQ_CONSUMER_STATUS__MODIFY
;
}
else
if
(
status
==
MQ_CONSUMER_STATUS__LOST
||
status
==
MQ_CONSUMER_STATUS__LOST_IN_REB
)
{
pConsumer
->
status
=
MQ_CONSUMER_STATUS__LOST
;
}
}
}
// remove from new topic
static
void
removeFromNewTopicList
(
SMqConsumerObj
*
pConsumer
,
const
char
*
pTopic
)
{
int32_t
size
=
taosArrayGetSize
(
pConsumer
->
rebNewTopics
);
for
(
int32_t
i
=
0
;
i
<
taosArrayGetSize
(
pConsumer
->
rebNewTopics
);
i
++
)
{
char
*
p
=
taosArrayGetP
(
pConsumer
->
rebNewTopics
,
i
);
if
(
strcmp
(
pTopic
,
p
)
==
0
)
{
taosArrayRemove
(
pConsumer
->
rebNewTopics
,
i
);
taosMemoryFree
(
p
);
mDebug
(
"consumer:0x%"
PRIx64
" remove new topic:%s in the topic list, remain newTopics:%d"
,
pConsumer
->
consumerId
,
pTopic
,
(
int
)
taosArrayGetSize
(
pConsumer
->
rebNewTopics
));
break
;
}
}
}
// remove from removed topic
static
void
removeFromRemoveTopicList
(
SMqConsumerObj
*
pConsumer
,
const
char
*
pTopic
)
{
int32_t
size
=
taosArrayGetSize
(
pConsumer
->
rebRemovedTopics
);
for
(
int32_t
i
=
0
;
i
<
size
;
i
++
)
{
char
*
p
=
taosArrayGetP
(
pConsumer
->
rebRemovedTopics
,
i
);
if
(
strcmp
(
pTopic
,
p
)
==
0
)
{
taosArrayRemove
(
pConsumer
->
rebRemovedTopics
,
i
);
taosMemoryFree
(
p
);
break
;
}
}
}
static
int32_t
mndConsumerActionUpdate
(
SSdb
*
pSdb
,
SMqConsumerObj
*
pOldConsumer
,
SMqConsumerObj
*
pNewConsumer
)
{
static
int32_t
mndConsumerActionUpdate
(
SSdb
*
pSdb
,
SMqConsumerObj
*
pOldConsumer
,
SMqConsumerObj
*
pNewConsumer
)
{
mDebug
(
"consumer:0x%"
PRIx64
" perform update action, update type:%d, subscribe-time:%"
PRId64
", uptime:%"
PRId64
,
mDebug
(
"consumer:0x%"
PRIx64
" perform update action, update type:%d, subscribe-time:%"
PRId64
", uptime:%"
PRId64
,
pOldConsumer
->
consumerId
,
pNewConsumer
->
updateType
,
pOldConsumer
->
subscribeTime
,
pOldConsumer
->
upTime
);
pOldConsumer
->
consumerId
,
pNewConsumer
->
updateType
,
pOldConsumer
->
subscribeTime
,
pOldConsumer
->
upTime
);
...
@@ -855,6 +902,7 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
...
@@ -855,6 +902,7 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
/*A(taosArrayGetSize(pOldConsumer->rebNewTopics) == 0);*/
/*A(taosArrayGetSize(pOldConsumer->rebNewTopics) == 0);*/
/*A(taosArrayGetSize(pOldConsumer->rebRemovedTopics) == 0);*/
/*A(taosArrayGetSize(pOldConsumer->rebRemovedTopics) == 0);*/
// this new consumer has identical topics with one existed consumers.
if
(
taosArrayGetSize
(
pNewConsumer
->
rebNewTopics
)
==
0
&&
taosArrayGetSize
(
pNewConsumer
->
rebRemovedTopics
)
==
0
)
{
if
(
taosArrayGetSize
(
pNewConsumer
->
rebNewTopics
)
==
0
&&
taosArrayGetSize
(
pNewConsumer
->
rebRemovedTopics
)
==
0
)
{
pOldConsumer
->
status
=
MQ_CONSUMER_STATUS__READY
;
pOldConsumer
->
status
=
MQ_CONSUMER_STATUS__READY
;
}
else
{
}
else
{
...
@@ -871,7 +919,6 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
...
@@ -871,7 +919,6 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
pNewConsumer
->
assignedTopics
=
tmp
;
pNewConsumer
->
assignedTopics
=
tmp
;
pOldConsumer
->
subscribeTime
=
pNewConsumer
->
upTime
;
pOldConsumer
->
subscribeTime
=
pNewConsumer
->
upTime
;
pOldConsumer
->
status
=
MQ_CONSUMER_STATUS__MODIFY
;
pOldConsumer
->
status
=
MQ_CONSUMER_STATUS__MODIFY
;
}
}
}
else
if
(
pNewConsumer
->
updateType
==
CONSUMER_UPDATE__LOST
)
{
}
else
if
(
pNewConsumer
->
updateType
==
CONSUMER_UPDATE__LOST
)
{
...
@@ -911,71 +958,48 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
...
@@ -911,71 +958,48 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
pOldConsumer
->
rebalanceTime
=
pNewConsumer
->
upTime
;
pOldConsumer
->
rebalanceTime
=
pNewConsumer
->
upTime
;
}
else
if
(
pNewConsumer
->
updateType
==
CONSUMER_UPDATE__ADD
)
{
}
else
if
(
pNewConsumer
->
updateType
==
CONSUMER_UPDATE__ADD
)
{
/*A(taosArrayGetSize(pNewConsumer->rebNewTopics) == 1);*/
ASSERT
(
taosArrayGetSize
(
pNewConsumer
->
rebNewTopics
)
==
1
&&
taosArrayGetSize
(
pNewConsumer
->
rebRemovedTopics
)
==
0
);
/*A(taosArrayGetSize(pNewConsumer->rebRemovedTopics) == 0);*/
char
*
pNewTopic
=
taosStrdup
(
taosArrayGetP
(
pNewConsumer
->
rebNewTopics
,
0
));
char
*
addedTopic
=
taosStrdup
(
taosArrayGetP
(
pNewConsumer
->
rebNewTopics
,
0
));
// not exist in current topic
// not exist in current topic
bool
existing
=
false
;
bool
existing
=
false
;
#if 1
int32_t
numOfExistedTopics
=
taosArrayGetSize
(
pOldConsumer
->
currentTopics
);
int32_t
numOfExistedTopics
=
taosArrayGetSize
(
pOldConsumer
->
currentTopics
);
for
(
int32_t
i
=
0
;
i
<
numOfExistedTopics
;
i
++
)
{
for
(
int32_t
i
=
0
;
i
<
numOfExistedTopics
;
i
++
)
{
char
*
topic
=
taosArrayGetP
(
pOldConsumer
->
currentTopics
,
i
);
char
*
topic
=
taosArrayGetP
(
pOldConsumer
->
currentTopics
,
i
);
if
(
strcmp
(
topic
,
added
Topic
)
==
0
)
{
if
(
strcmp
(
topic
,
pNew
Topic
)
==
0
)
{
existing
=
true
;
existing
=
true
;
}
}
}
}
#endif
// remove from new topic
removeFromNewTopicList
(
pOldConsumer
,
pNewTopic
);
for
(
int32_t
i
=
0
;
i
<
taosArrayGetSize
(
pOldConsumer
->
rebNewTopics
);
i
++
)
{
char
*
topic
=
taosArrayGetP
(
pOldConsumer
->
rebNewTopics
,
i
);
if
(
strcmp
(
addedTopic
,
topic
)
==
0
)
{
taosArrayRemove
(
pOldConsumer
->
rebNewTopics
,
i
);
taosMemoryFree
(
topic
);
break
;
}
}
// add to current topic
// add to current topic
if
(
!
existing
)
{
if
(
!
existing
)
{
taosArrayPush
(
pOldConsumer
->
currentTopics
,
&
added
Topic
);
taosArrayPush
(
pOldConsumer
->
currentTopics
,
&
pNew
Topic
);
taosArraySort
(
pOldConsumer
->
currentTopics
,
taosArrayCompareString
);
taosArraySort
(
pOldConsumer
->
currentTopics
,
taosArrayCompareString
);
}
else
{
}
else
{
taosMemoryFree
(
added
Topic
);
taosMemoryFree
(
pNew
Topic
);
}
}
// set status
// set status
int32_t
status
=
pOldConsumer
->
status
;
int32_t
status
=
pOldConsumer
->
status
;
if
(
taosArrayGetSize
(
pOldConsumer
->
rebNewTopics
)
==
0
&&
taosArrayGetSize
(
pOldConsumer
->
rebRemovedTopics
)
==
0
)
{
updateConsumerStatus
(
pOldConsumer
);
if
(
status
==
MQ_CONSUMER_STATUS__MODIFY
||
status
==
MQ_CONSUMER_STATUS__MODIFY_IN_REB
)
{
pOldConsumer
->
status
=
MQ_CONSUMER_STATUS__READY
;
}
else
if
(
status
==
MQ_CONSUMER_STATUS__LOST_IN_REB
||
status
==
MQ_CONSUMER_STATUS__LOST
)
{
pOldConsumer
->
status
=
MQ_CONSUMER_STATUS__LOST_REBD
;
}
}
else
{
if
(
status
==
MQ_CONSUMER_STATUS__MODIFY
||
status
==
MQ_CONSUMER_STATUS__MODIFY_IN_REB
)
{
pOldConsumer
->
status
=
MQ_CONSUMER_STATUS__MODIFY_IN_REB
;
}
else
if
(
status
==
MQ_CONSUMER_STATUS__LOST
||
status
==
MQ_CONSUMER_STATUS__LOST_IN_REB
)
{
pOldConsumer
->
status
=
MQ_CONSUMER_STATUS__LOST_IN_REB
;
}
}
// the re-balance is triggered when the new consumer is launched.
// the re-balance is triggered when the new consumer is launched.
pOldConsumer
->
rebalanceTime
=
pNewConsumer
->
upTime
;
pOldConsumer
->
rebalanceTime
=
pNewConsumer
->
upTime
;
atomic_add_fetch_32
(
&
pOldConsumer
->
epoch
,
1
);
atomic_add_fetch_32
(
&
pOldConsumer
->
epoch
,
1
);
mDebug
(
"consumer:0x%"
PRIx64
" state (%d)%s -> (%d)%s, new epoch:%d, reb-time:%"
PRId64
", current topics:%d"
,
mDebug
(
"consumer:0x%"
PRIx64
" state (%d)%s -> (%d)%s, new epoch:%d, reb-time:%"
PRId64
", current topics:%d, newTopics:%d, removeTopics:%d"
,
pOldConsumer
->
consumerId
,
status
,
mndConsumerStatusName
(
status
),
pOldConsumer
->
status
,
pOldConsumer
->
consumerId
,
status
,
mndConsumerStatusName
(
status
),
pOldConsumer
->
status
,
mndConsumerStatusName
(
pOldConsumer
->
status
),
mndConsumerStatusName
(
pOldConsumer
->
status
),
pOldConsumer
->
epoch
,
pOldConsumer
->
rebalanceTime
,
pOldConsumer
->
epoch
,
pOldConsumer
->
rebalanceTime
,
(
int
)
taosArrayGetSize
(
pOldConsumer
->
currentTopics
));
(
int
)
taosArrayGetSize
(
pOldConsumer
->
currentTopics
),
(
int
)
taosArrayGetSize
(
pOldConsumer
->
rebNewTopics
),
(
int
)
taosArrayGetSize
(
pOldConsumer
->
rebRemovedTopics
));
}
else
if
(
pNewConsumer
->
updateType
==
CONSUMER_UPDATE__REMOVE
)
{
}
else
if
(
pNewConsumer
->
updateType
==
CONSUMER_UPDATE__REMOVE
)
{
/*A(taosArrayGetSize(pNewConsumer->rebNewTopics) == 0);*/
/*A(taosArrayGetSize(pNewConsumer->rebNewTopics) == 0);*/
/*A(taosArrayGetSize(pNewConsumer->rebRemovedTopics) == 1);*/
/*A(taosArrayGetSize(pNewConsumer->rebRemovedTopics) == 1);*/
char
*
removedTopic
=
taosArrayGetP
(
pNewConsumer
->
rebRemovedTopics
,
0
);
char
*
removedTopic
=
taosArrayGetP
(
pNewConsumer
->
rebRemovedTopics
,
0
);
// not exist in new topic
#if 0
#if 0
for (int32_t i = 0; i < taosArrayGetSize(pOldConsumer->rebNewTopics); i++) {
for (int32_t i = 0; i < taosArrayGetSize(pOldConsumer->rebNewTopics); i++) {
char *topic = taosArrayGetP(pOldConsumer->rebNewTopics, i);
char *topic = taosArrayGetP(pOldConsumer->rebNewTopics, i);
...
@@ -984,14 +1008,7 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
...
@@ -984,14 +1008,7 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
#endif
#endif
// remove from removed topic
// remove from removed topic
for
(
int32_t
i
=
0
;
i
<
taosArrayGetSize
(
pOldConsumer
->
rebRemovedTopics
);
i
++
)
{
removeFromRemoveTopicList
(
pOldConsumer
,
removedTopic
);
char
*
topic
=
taosArrayGetP
(
pOldConsumer
->
rebRemovedTopics
,
i
);
if
(
strcmp
(
removedTopic
,
topic
)
==
0
)
{
taosArrayRemove
(
pOldConsumer
->
rebRemovedTopics
,
i
);
taosMemoryFree
(
topic
);
break
;
}
}
// remove from current topic
// remove from current topic
int32_t
i
=
0
;
int32_t
i
=
0
;
...
@@ -1004,32 +1021,20 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
...
@@ -1004,32 +1021,20 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
break
;
break
;
}
}
}
}
// must find the topic
/*A(i < sz);*/
// set status
// set status
int32_t
status
=
pOldConsumer
->
status
;
int32_t
status
=
pOldConsumer
->
status
;
if
(
taosArrayGetSize
(
pOldConsumer
->
rebNewTopics
)
==
0
&&
taosArrayGetSize
(
pOldConsumer
->
rebRemovedTopics
)
==
0
)
{
updateConsumerStatus
(
pOldConsumer
);
if
(
status
==
MQ_CONSUMER_STATUS__MODIFY
||
status
==
MQ_CONSUMER_STATUS__MODIFY_IN_REB
)
{
pOldConsumer
->
status
=
MQ_CONSUMER_STATUS__READY
;
}
else
if
(
status
==
MQ_CONSUMER_STATUS__LOST_IN_REB
||
status
==
MQ_CONSUMER_STATUS__LOST
)
{
pOldConsumer
->
status
=
MQ_CONSUMER_STATUS__LOST_REBD
;
}
}
else
{
if
(
status
==
MQ_CONSUMER_STATUS__MODIFY
||
status
==
MQ_CONSUMER_STATUS__MODIFY_IN_REB
)
{
pOldConsumer
->
status
=
MQ_CONSUMER_STATUS__MODIFY_IN_REB
;
}
else
if
(
status
==
MQ_CONSUMER_STATUS__LOST
||
status
==
MQ_CONSUMER_STATUS__LOST_IN_REB
)
{
pOldConsumer
->
status
=
MQ_CONSUMER_STATUS__LOST_IN_REB
;
}
}
pOldConsumer
->
rebalanceTime
=
pNewConsumer
->
upTime
;
pOldConsumer
->
rebalanceTime
=
pNewConsumer
->
upTime
;
atomic_add_fetch_32
(
&
pOldConsumer
->
epoch
,
1
);
atomic_add_fetch_32
(
&
pOldConsumer
->
epoch
,
1
);
mDebug
(
"consumer:0x%"
PRIx64
" state %d(%s) -> %d(%s), new epoch:%d, reb-time:%"
PRId64
", current topics:%d"
,
mDebug
(
"consumer:0x%"
PRIx64
" state (%d)%s -> (%d)%s, new epoch:%d, reb-time:%"
PRId64
", current topics:%d, newTopics:%d, removeTopics:%d"
,
pOldConsumer
->
consumerId
,
status
,
mndConsumerStatusName
(
status
),
pOldConsumer
->
status
,
pOldConsumer
->
consumerId
,
status
,
mndConsumerStatusName
(
status
),
pOldConsumer
->
status
,
mndConsumerStatusName
(
pOldConsumer
->
status
),
mndConsumerStatusName
(
pOldConsumer
->
status
),
pOldConsumer
->
epoch
,
pOldConsumer
->
rebalanceTime
,
pOldConsumer
->
epoch
,
pOldConsumer
->
rebalanceTime
,
(
int
)
taosArrayGetSize
(
pOldConsumer
->
currentTopics
));
(
int
)
taosArrayGetSize
(
pOldConsumer
->
currentTopics
),
(
int
)
taosArrayGetSize
(
pOldConsumer
->
rebNewTopics
),
(
int
)
taosArrayGetSize
(
pOldConsumer
->
rebRemovedTopics
));
}
}
taosWUnLockLatch
(
&
pOldConsumer
->
lock
);
taosWUnLockLatch
(
&
pOldConsumer
->
lock
);
...
...
source/dnode/mnode/impl/src/mndSubscribe.c
浏览文件 @
e92bfa55
...
@@ -197,24 +197,20 @@ static SMqRebInfo *mndGetOrCreateRebSub(SHashObj *pHash, const char *key) {
...
@@ -197,24 +197,20 @@ static SMqRebInfo *mndGetOrCreateRebSub(SHashObj *pHash, const char *key) {
return
pRebSub
;
return
pRebSub
;
}
}
static
int32_t
mndDoRebalance
(
SMnode
*
pMnode
,
const
SMqRebInputObj
*
pInput
,
SMqRebOutputObj
*
pOutput
)
{
static
void
doRemoveExistedConsumers
(
SMqRebOutputObj
*
pOutput
,
SHashObj
*
pHash
,
const
SMqRebInputObj
*
pInput
)
{
int32_t
totalVgNum
=
pOutput
->
pSub
->
vgNum
;
int32_t
numOfRemoved
=
taosArrayGetSize
(
pInput
->
pRebInfo
->
removedConsumers
);
const
char
*
sub
=
pOutput
->
pSub
->
key
;
const
char
*
pSubKey
=
pOutput
->
pSub
->
key
;
mInfo
(
"sub:%s mq re-balance %d vgroups"
,
sub
,
pOutput
->
pSub
->
vgNum
);
// 1. build temporary hash(vgId -> SMqRebOutputVg) to store modified vg
SHashObj
*
pHash
=
taosHashInit
(
64
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_INT
),
false
,
HASH_NO_LOCK
);
// 2. check and get actual removed consumers, put their vg into hash
int32_t
removedNum
=
taosArrayGetSize
(
pInput
->
pRebInfo
->
removedConsumers
);
int32_t
actualRemoved
=
0
;
int32_t
actualRemoved
=
0
;
for
(
int32_t
i
=
0
;
i
<
removedNum
;
i
++
)
{
for
(
int32_t
i
=
0
;
i
<
numOfRemoved
;
i
++
)
{
uint64_t
consumerId
=
*
(
uint64_t
*
)
taosArrayGet
(
pInput
->
pRebInfo
->
removedConsumers
,
i
);
uint64_t
consumerId
=
*
(
uint64_t
*
)
taosArrayGet
(
pInput
->
pRebInfo
->
removedConsumers
,
i
);
SMqConsumerEp
*
pConsumerEp
=
taosHashGet
(
pOutput
->
pSub
->
consumerHash
,
&
consumerId
,
sizeof
(
int64_t
));
SMqConsumerEp
*
pConsumerEp
=
taosHashGet
(
pOutput
->
pSub
->
consumerHash
,
&
consumerId
,
sizeof
(
int64_t
));
// consumer exists till now
if
(
pConsumerEp
)
{
if
(
pConsumerEp
)
{
actualRemoved
++
;
actualRemoved
++
;
int32_t
consumerVgNum
=
taosArrayGetSize
(
pConsumerEp
->
vgs
);
int32_t
consumerVgNum
=
taosArrayGetSize
(
pConsumerEp
->
vgs
);
for
(
int32_t
j
=
0
;
j
<
consumerVgNum
;
j
++
)
{
for
(
int32_t
j
=
0
;
j
<
consumerVgNum
;
j
++
)
{
SMqVgEp
*
pVgEp
=
taosArrayGetP
(
pConsumerEp
->
vgs
,
j
);
SMqVgEp
*
pVgEp
=
taosArrayGetP
(
pConsumerEp
->
vgs
,
j
);
...
@@ -223,52 +219,66 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
...
@@ -223,52 +219,66 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
.
newConsumerId
=
-
1
,
.
newConsumerId
=
-
1
,
.
pVgEp
=
pVgEp
,
.
pVgEp
=
pVgEp
,
};
};
taosHashPut
(
pHash
,
&
pVgEp
->
vgId
,
sizeof
(
int32_t
),
&
outputVg
,
sizeof
(
SMqRebOutputVg
));
taosHashPut
(
pHash
,
&
pVgEp
->
vgId
,
sizeof
(
int32_t
),
&
outputVg
,
sizeof
(
SMqRebOutputVg
));
mInfo
(
"sub:%s mq re-balance remove vgId:%d from consumer:%"
PRIx64
,
sub
,
pVgEp
->
vgId
,
consumerId
);
mInfo
(
"sub:%s mq re-balance remove vgId:%d from consumer:%"
PRIx64
,
pSubKey
,
pVgEp
->
vgId
,
consumerId
);
}
}
taosArrayDestroy
(
pConsumerEp
->
vgs
);
taosArrayDestroy
(
pConsumerEp
->
vgs
);
taosHashRemove
(
pOutput
->
pSub
->
consumerHash
,
&
consumerId
,
sizeof
(
int64_t
));
taosHashRemove
(
pOutput
->
pSub
->
consumerHash
,
&
consumerId
,
sizeof
(
int64_t
));
// put into removed
// put into removed
taosArrayPush
(
pOutput
->
removedConsumers
,
&
consumerId
);
taosArrayPush
(
pOutput
->
removedConsumers
,
&
consumerId
);
}
}
}
}
if
(
removedNum
!=
actualRemoved
)
{
if
(
numOfRemoved
!=
actualRemoved
)
{
mError
(
"sub:%s mq re-balance removedNum:%d not matched with actual:%d"
,
sub
,
removedNum
,
actualRemoved
);
mError
(
"sub:%s mq re-balance removedNum:%d not matched with actual:%d"
,
pSubKey
,
numOfRemoved
,
actualRemoved
);
}
else
{
mInfo
(
"sub:%s removed %d consumers"
,
pSubKey
,
numOfRemoved
);
}
}
}
// if previously no consumer, there are vgs not assigned
static
void
doAddNewConsumers
(
SMqRebOutputObj
*
pOutput
,
const
SMqRebInputObj
*
pInput
)
{
{
int32_t
numOfNewConsumers
=
taosArrayGetSize
(
pInput
->
pRebInfo
->
newConsumers
);
int32_t
consumerVgNum
=
taosArrayGetSize
(
pOutput
->
pSub
->
unassignedVgs
);
const
char
*
pSubKey
=
pOutput
->
pSub
->
key
;
for
(
int32_t
i
=
0
;
i
<
consumerVgNum
;
i
++
)
{
for
(
int32_t
i
=
0
;
i
<
numOfNewConsumers
;
i
++
)
{
int64_t
consumerId
=
*
(
int64_t
*
)
taosArrayGet
(
pInput
->
pRebInfo
->
newConsumers
,
i
);
SMqConsumerEp
newConsumerEp
;
newConsumerEp
.
consumerId
=
consumerId
;
newConsumerEp
.
vgs
=
taosArrayInit
(
0
,
sizeof
(
void
*
));
taosHashPut
(
pOutput
->
pSub
->
consumerHash
,
&
consumerId
,
sizeof
(
int64_t
),
&
newConsumerEp
,
sizeof
(
SMqConsumerEp
));
taosArrayPush
(
pOutput
->
newConsumers
,
&
consumerId
);
mInfo
(
"sub:%s mq rebalance add new consumer:%"
PRIx64
,
pSubKey
,
consumerId
);
}
}
static
void
addUnassignedVgroups
(
SMqRebOutputObj
*
pOutput
,
SHashObj
*
pHash
)
{
const
char
*
pSubKey
=
pOutput
->
pSub
->
key
;
int32_t
numOfVgroups
=
taosArrayGetSize
(
pOutput
->
pSub
->
unassignedVgs
);
for
(
int32_t
i
=
0
;
i
<
numOfVgroups
;
i
++
)
{
SMqVgEp
*
pVgEp
=
*
(
SMqVgEp
**
)
taosArrayPop
(
pOutput
->
pSub
->
unassignedVgs
);
SMqVgEp
*
pVgEp
=
*
(
SMqVgEp
**
)
taosArrayPop
(
pOutput
->
pSub
->
unassignedVgs
);
SMqRebOutputVg
rebOutput
=
{
SMqRebOutputVg
rebOutput
=
{
.
oldConsumerId
=
-
1
,
.
oldConsumerId
=
-
1
,
.
newConsumerId
=
-
1
,
.
newConsumerId
=
-
1
,
.
pVgEp
=
pVgEp
,
.
pVgEp
=
pVgEp
,
};
};
taosHashPut
(
pHash
,
&
pVgEp
->
vgId
,
sizeof
(
int32_t
),
&
rebOutput
,
sizeof
(
SMqRebOutputVg
));
mInfo
(
"sub:%s mq re-balance remove vgId:%d from unassigned"
,
sub
,
pVgEp
->
vgId
);
}
}
// 3. calc vg number of each consumer
taosHashPut
(
pHash
,
&
pVgEp
->
vgId
,
sizeof
(
int32_t
),
&
rebOutput
,
sizeof
(
SMqRebOutputVg
));
int32_t
afterRebConsumerNum
=
pInput
->
oldConsumerNum
+
taosArrayGetSize
(
pInput
->
pRebInfo
->
newConsumers
)
-
mInfo
(
"sub:%s mq re-balance remove vgId:%d from unassigned"
,
pSubKey
,
pVgEp
->
vgId
);
taosArrayGetSize
(
pInput
->
pRebInfo
->
removedConsumers
);
int32_t
minVgCnt
=
0
;
int32_t
imbConsumerNum
=
0
;
// calc num
if
(
afterRebConsumerNum
)
{
minVgCnt
=
totalVgNum
/
afterRebConsumerNum
;
imbConsumerNum
=
totalVgNum
%
afterRebConsumerNum
;
}
}
}
mInfo
(
"sub:%s mq re-balance %d consumers: at least %d vgs each, %d consumers has more vgs"
,
sub
,
static
void
transferVgroupsForConsumers
(
SMqRebOutputObj
*
pOutput
,
SHashObj
*
pHash
,
int32_t
minVgCnt
,
int32_t
imbConsumerNum
)
{
afterRebConsumerNum
,
minVgCnt
,
imbConsumerNum
)
;
const
char
*
pSubKey
=
pOutput
->
pSub
->
key
;
// 4. first scan: remove consumer more than wanted, put to remove hash
int32_t
imbCnt
=
0
;
int32_t
imbCnt
=
0
;
void
*
pIter
=
NULL
;
void
*
pIter
=
NULL
;
while
(
1
)
{
while
(
1
)
{
pIter
=
taosHashIterate
(
pOutput
->
pSub
->
consumerHash
,
pIter
);
pIter
=
taosHashIterate
(
pOutput
->
pSub
->
consumerHash
,
pIter
);
if
(
pIter
==
NULL
)
{
if
(
pIter
==
NULL
)
{
...
@@ -276,8 +286,8 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
...
@@ -276,8 +286,8 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
}
}
SMqConsumerEp
*
pConsumerEp
=
(
SMqConsumerEp
*
)
pIter
;
SMqConsumerEp
*
pConsumerEp
=
(
SMqConsumerEp
*
)
pIter
;
int32_t
consumerVgNum
=
taosArrayGetSize
(
pConsumerEp
->
vgs
);
int32_t
consumerVgNum
=
taosArrayGetSize
(
pConsumerEp
->
vgs
);
// all old consumers still existing are touched
// all old consumers still existing are touched
// TODO optimize: touch only consumer whose vgs changed
// TODO optimize: touch only consumer whose vgs changed
taosArrayPush
(
pOutput
->
touchedConsumers
,
&
pConsumerEp
->
consumerId
);
taosArrayPush
(
pOutput
->
touchedConsumers
,
&
pConsumerEp
->
consumerId
);
...
@@ -296,13 +306,13 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
...
@@ -296,13 +306,13 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
.
pVgEp
=
pVgEp
,
.
pVgEp
=
pVgEp
,
};
};
taosHashPut
(
pHash
,
&
pVgEp
->
vgId
,
sizeof
(
int32_t
),
&
outputVg
,
sizeof
(
SMqRebOutputVg
));
taosHashPut
(
pHash
,
&
pVgEp
->
vgId
,
sizeof
(
int32_t
),
&
outputVg
,
sizeof
(
SMqRebOutputVg
));
mInfo
(
"sub:%s mq rebalance remove vgId:%d from consumer:0x%"
PRIx64
",(first scan)"
,
sub
,
pVgEp
->
vgId
,
mInfo
(
"sub:%s mq rebalance remove vgId:%d from consumer:0x%"
PRIx64
",(first scan)"
,
pSubKey
,
pVgEp
->
vgId
,
pConsumerEp
->
consumerId
);
pConsumerEp
->
consumerId
);
}
}
imbCnt
++
;
imbCnt
++
;
}
}
}
else
{
}
else
{
//
pop until equal
minVg
//
all the remain consumers should only have the number of vgroups, which is equalled to the value of
minVg
while
(
taosArrayGetSize
(
pConsumerEp
->
vgs
)
>
minVgCnt
)
{
while
(
taosArrayGetSize
(
pConsumerEp
->
vgs
)
>
minVgCnt
)
{
SMqVgEp
*
pVgEp
=
*
(
SMqVgEp
**
)
taosArrayPop
(
pConsumerEp
->
vgs
);
SMqVgEp
*
pVgEp
=
*
(
SMqVgEp
**
)
taosArrayPop
(
pConsumerEp
->
vgs
);
SMqRebOutputVg
outputVg
=
{
SMqRebOutputVg
outputVg
=
{
...
@@ -311,36 +321,66 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
...
@@ -311,36 +321,66 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
.
pVgEp
=
pVgEp
,
.
pVgEp
=
pVgEp
,
};
};
taosHashPut
(
pHash
,
&
pVgEp
->
vgId
,
sizeof
(
int32_t
),
&
outputVg
,
sizeof
(
SMqRebOutputVg
));
taosHashPut
(
pHash
,
&
pVgEp
->
vgId
,
sizeof
(
int32_t
),
&
outputVg
,
sizeof
(
SMqRebOutputVg
));
mInfo
(
"sub:%s mq rebalance remove vgId:%d from consumer:0x%"
PRIx64
",(first scan)"
,
sub
,
pVgEp
->
vgId
,
mInfo
(
"sub:%s mq rebalance remove vgId:%d from consumer:0x%"
PRIx64
",(first scan)"
,
pSubKey
,
pVgEp
->
vgId
,
pConsumerEp
->
consumerId
);
pConsumerEp
->
consumerId
);
}
}
}
}
}
}
}
}
}
// 5. add new consumer into sub
static
int32_t
mndDoRebalance
(
SMnode
*
pMnode
,
const
SMqRebInputObj
*
pInput
,
SMqRebOutputObj
*
pOutput
)
{
{
int32_t
totalVgNum
=
pOutput
->
pSub
->
vgNum
;
int32_t
consumerNum
=
taosArrayGetSize
(
pInput
->
pRebInfo
->
newConsumers
);
const
char
*
pSubKey
=
pOutput
->
pSub
->
key
;
for
(
int32_t
i
=
0
;
i
<
consumerNum
;
i
++
)
{
int64_t
consumerId
=
*
(
int64_t
*
)
taosArrayGet
(
pInput
->
pRebInfo
->
newConsumers
,
i
);
SMqConsumerEp
newConsumerEp
;
int32_t
numOfRemoved
=
taosArrayGetSize
(
pInput
->
pRebInfo
->
removedConsumers
);
newConsumerEp
.
consumerId
=
consumerId
;
int32_t
numOfAdded
=
taosArrayGetSize
(
pInput
->
pRebInfo
->
newConsumers
);
newConsumerEp
.
vgs
=
taosArrayInit
(
0
,
sizeof
(
void
*
));
mInfo
(
"sub:%s mq re-balance %d vgroups, existed consumers:%d, added:%d, removed:%d"
,
pSubKey
,
totalVgNum
,
taosHashPut
(
pOutput
->
pSub
->
consumerHash
,
&
consumerId
,
sizeof
(
int64_t
),
&
newConsumerEp
,
sizeof
(
SMqConsumerEp
));
pInput
->
oldConsumerNum
,
numOfAdded
,
numOfRemoved
);
taosArrayPush
(
pOutput
->
newConsumers
,
&
consumerId
);
mInfo
(
"sub:%s mq rebalance add new consumer:%"
PRIx64
,
sub
,
consumerId
);
// 1. build temporary hash(vgId -> SMqRebOutputVg) to store modified vg
}
SHashObj
*
pHash
=
taosHashInit
(
64
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_INT
),
false
,
HASH_NO_LOCK
);
// 2. check and get actual removed consumers, put their vg into hash
doRemoveExistedConsumers
(
pOutput
,
pHash
,
pInput
);
// 3. if previously no consumer, there are vgs not assigned
addUnassignedVgroups
(
pOutput
,
pHash
);
// 4. calc vg number of each consumer
int32_t
numOfFinal
=
pInput
->
oldConsumerNum
+
numOfAdded
-
numOfRemoved
;
int32_t
minVgCnt
=
0
;
int32_t
imbConsumerNum
=
0
;
// calc num
if
(
numOfFinal
)
{
minVgCnt
=
totalVgNum
/
numOfFinal
;
imbConsumerNum
=
totalVgNum
%
numOfFinal
;
}
}
// 6. second scan: find consumer do not have enough vg, extract from temporary hash and assign to new consumer.
mInfo
(
"sub:%s mq re-balance %d consumers: at least %d vgs each, %d consumers has 1 more vgroups than avg value"
,
pSubKey
,
numOfFinal
,
minVgCnt
,
imbConsumerNum
);
// 5. first scan: remove vgroups from te consumers, who have more vgroups than the threashold value that is
// minVgCnt, and then put them into the recycled hash list
transferVgroupsForConsumers
(
pOutput
,
pHash
,
minVgCnt
,
imbConsumerNum
);
// 6. add new consumer into sub
doAddNewConsumers
(
pOutput
,
pInput
);
// 7. second scan: find consumer do not have enough vgroups, extract from temporary hash and assign to them
// All related vg should be put into rebVgs
// All related vg should be put into rebVgs
SMqRebOutputVg
*
pRebVg
=
NULL
;
SMqRebOutputVg
*
pRebVg
=
NULL
;
void
*
pRemovedIter
=
NULL
;
void
*
pRemovedIter
=
NULL
;
pIter
=
NULL
;
void
*
pIter
=
NULL
;
while
(
1
)
{
while
(
1
)
{
pIter
=
taosHashIterate
(
pOutput
->
pSub
->
consumerHash
,
pIter
);
pIter
=
taosHashIterate
(
pOutput
->
pSub
->
consumerHash
,
pIter
);
if
(
pIter
==
NULL
)
break
;
if
(
pIter
==
NULL
)
{
break
;
}
SMqConsumerEp
*
pConsumerEp
=
(
SMqConsumerEp
*
)
pIter
;
SMqConsumerEp
*
pConsumerEp
=
(
SMqConsumerEp
*
)
pIter
;
// push until equal minVg
// push until equal minVg
...
@@ -348,8 +388,8 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
...
@@ -348,8 +388,8 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
// iter hash and find one vg
// iter hash and find one vg
pRemovedIter
=
taosHashIterate
(
pHash
,
pRemovedIter
);
pRemovedIter
=
taosHashIterate
(
pHash
,
pRemovedIter
);
if
(
pRemovedIter
==
NULL
)
{
if
(
pRemovedIter
==
NULL
)
{
mError
(
"sub:%s removed iter is null"
,
sub
);
mError
(
"sub:%s removed iter is null"
,
pSubKey
);
continue
;
break
;
}
}
pRebVg
=
(
SMqRebOutputVg
*
)
pRemovedIter
;
pRebVg
=
(
SMqRebOutputVg
*
)
pRemovedIter
;
...
@@ -409,15 +449,15 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
...
@@ -409,15 +449,15 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
taosArrayPush
(
pOutput
->
pSub
->
unassignedVgs
,
&
pRebOutput
->
pVgEp
);
taosArrayPush
(
pOutput
->
pSub
->
unassignedVgs
,
&
pRebOutput
->
pVgEp
);
taosArrayPush
(
pOutput
->
rebVgs
,
pRebOutput
);
taosArrayPush
(
pOutput
->
rebVgs
,
pRebOutput
);
mInfo
(
"sub:%s mq re-balance unassign vgId:%d (second scan)"
,
sub
,
pRebOutput
->
pVgEp
->
vgId
);
mInfo
(
"sub:%s mq re-balance unassign vgId:%d (second scan)"
,
pSubKey
,
pRebOutput
->
pVgEp
->
vgId
);
}
}
}
}
// 8. generate logs
// 8. generate logs
mInfo
(
"sub:%s mq re-balance calculation completed, re-balanced vg"
,
sub
);
mInfo
(
"sub:%s mq re-balance calculation completed, re-balanced vg"
,
pSubKey
);
for
(
int32_t
i
=
0
;
i
<
taosArrayGetSize
(
pOutput
->
rebVgs
);
i
++
)
{
for
(
int32_t
i
=
0
;
i
<
taosArrayGetSize
(
pOutput
->
rebVgs
);
i
++
)
{
SMqRebOutputVg
*
pOutputRebVg
=
taosArrayGet
(
pOutput
->
rebVgs
,
i
);
SMqRebOutputVg
*
pOutputRebVg
=
taosArrayGet
(
pOutput
->
rebVgs
,
i
);
mInfo
(
"sub:%s mq re-balance vgId:%d, moved from consumer:0x%"
PRIx64
", to consumer:0x%"
PRIx64
,
sub
,
mInfo
(
"sub:%s mq re-balance vgId:%d, moved from consumer:0x%"
PRIx64
", to consumer:0x%"
PRIx64
,
pSubKey
,
pOutputRebVg
->
pVgEp
->
vgId
,
pOutputRebVg
->
oldConsumerId
,
pOutputRebVg
->
newConsumerId
);
pOutputRebVg
->
pVgEp
->
vgId
,
pOutputRebVg
->
oldConsumerId
,
pOutputRebVg
->
newConsumerId
);
}
}
{
{
...
@@ -427,10 +467,10 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
...
@@ -427,10 +467,10 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
if
(
pIter
==
NULL
)
break
;
if
(
pIter
==
NULL
)
break
;
SMqConsumerEp
*
pConsumerEp
=
(
SMqConsumerEp
*
)
pIter
;
SMqConsumerEp
*
pConsumerEp
=
(
SMqConsumerEp
*
)
pIter
;
int32_t
sz
=
taosArrayGetSize
(
pConsumerEp
->
vgs
);
int32_t
sz
=
taosArrayGetSize
(
pConsumerEp
->
vgs
);
mInfo
(
"sub:%s mq re-balance final cfg: consumer:0x%"
PRIx64
" has %d vg"
,
sub
,
pConsumerEp
->
consumerId
,
sz
);
mInfo
(
"sub:%s mq re-balance final cfg: consumer:0x%"
PRIx64
" has %d vg"
,
pSubKey
,
pConsumerEp
->
consumerId
,
sz
);
for
(
int32_t
i
=
0
;
i
<
sz
;
i
++
)
{
for
(
int32_t
i
=
0
;
i
<
sz
;
i
++
)
{
SMqVgEp
*
pVgEp
=
taosArrayGetP
(
pConsumerEp
->
vgs
,
i
);
SMqVgEp
*
pVgEp
=
taosArrayGetP
(
pConsumerEp
->
vgs
,
i
);
mInfo
(
"sub:%s mq re-balance final cfg: vg %d to consumer:0x%"
PRIx64
,
sub
,
pVgEp
->
vgId
,
mInfo
(
"sub:%s mq re-balance final cfg: vg %d to consumer:0x%"
PRIx64
,
pSubKey
,
pVgEp
->
vgId
,
pConsumerEp
->
consumerId
);
pConsumerEp
->
consumerId
);
}
}
}
}
...
@@ -555,17 +595,24 @@ static int32_t mndProcessRebalanceReq(SRpcMsg *pMsg) {
...
@@ -555,17 +595,24 @@ static int32_t mndProcessRebalanceReq(SRpcMsg *pMsg) {
SMnode
*
pMnode
=
pMsg
->
info
.
node
;
SMnode
*
pMnode
=
pMsg
->
info
.
node
;
SMqDoRebalanceMsg
*
pReq
=
pMsg
->
pCont
;
SMqDoRebalanceMsg
*
pReq
=
pMsg
->
pCont
;
void
*
pIter
=
NULL
;
void
*
pIter
=
NULL
;
bool
rebalanceExec
=
false
;
// to ensure only once.
mInfo
(
"mq re-balance start
"
);
mInfo
(
"mq re-balance start
, total required re-balanced trans:%d"
,
taosHashGetSize
(
pReq
->
rebSubHash
)
);
// here we only handle one topic rebalance requirement to ensure the atomic execution of this transaction.
while
(
1
)
{
while
(
1
)
{
if
(
rebalanceExec
)
{
break
;
}
pIter
=
taosHashIterate
(
pReq
->
rebSubHash
,
pIter
);
pIter
=
taosHashIterate
(
pReq
->
rebSubHash
,
pIter
);
if
(
pIter
==
NULL
)
{
if
(
pIter
==
NULL
)
{
break
;
break
;
}
}
SMqRebInputObj
rebInput
=
{
0
}
;
taosSsleep
(
20
)
;
SMqRebInputObj
rebInput
=
{
0
};
SMqRebOutputObj
rebOutput
=
{
0
};
SMqRebOutputObj
rebOutput
=
{
0
};
rebOutput
.
newConsumers
=
taosArrayInit
(
0
,
sizeof
(
int64_t
));
rebOutput
.
newConsumers
=
taosArrayInit
(
0
,
sizeof
(
int64_t
));
rebOutput
.
removedConsumers
=
taosArrayInit
(
0
,
sizeof
(
int64_t
));
rebOutput
.
removedConsumers
=
taosArrayInit
(
0
,
sizeof
(
int64_t
));
...
@@ -582,9 +629,10 @@ static int32_t mndProcessRebalanceReq(SRpcMsg *pMsg) {
...
@@ -582,9 +629,10 @@ static int32_t mndProcessRebalanceReq(SRpcMsg *pMsg) {
char
topic
[
TSDB_TOPIC_FNAME_LEN
];
char
topic
[
TSDB_TOPIC_FNAME_LEN
];
char
cgroup
[
TSDB_CGROUP_LEN
];
char
cgroup
[
TSDB_CGROUP_LEN
];
mndSplitSubscribeKey
(
pRebInfo
->
key
,
topic
,
cgroup
,
true
);
mndSplitSubscribeKey
(
pRebInfo
->
key
,
topic
,
cgroup
,
true
);
SMqTopicObj
*
pTopic
=
mndAcquireTopic
(
pMnode
,
topic
);
SMqTopicObj
*
pTopic
=
mndAcquireTopic
(
pMnode
,
topic
);
if
(
pTopic
==
NULL
)
{
if
(
pTopic
==
NULL
)
{
mError
(
"mq re-balance %s ignored since topic %s
no
t exist"
,
pRebInfo
->
key
,
topic
);
mError
(
"mq re-balance %s ignored since topic %s
doesn'
t exist"
,
pRebInfo
->
key
,
topic
);
continue
;
continue
;
}
}
...
@@ -604,11 +652,13 @@ static int32_t mndProcessRebalanceReq(SRpcMsg *pMsg) {
...
@@ -604,11 +652,13 @@ static int32_t mndProcessRebalanceReq(SRpcMsg *pMsg) {
mndReleaseTopic
(
pMnode
,
pTopic
);
mndReleaseTopic
(
pMnode
,
pTopic
);
rebInput
.
oldConsumerNum
=
0
;
rebInput
.
oldConsumerNum
=
0
;
mInfo
(
"topic:%s has no consumers sub yet"
,
topic
);
}
else
{
}
else
{
taosRLockLatch
(
&
pSub
->
lock
);
taosRLockLatch
(
&
pSub
->
lock
);
rebInput
.
oldConsumerNum
=
taosHashGetSize
(
pSub
->
consumerHash
);
rebInput
.
oldConsumerNum
=
taosHashGetSize
(
pSub
->
consumerHash
);
rebOutput
.
pSub
=
tCloneSubscribeObj
(
pSub
);
rebOutput
.
pSub
=
tCloneSubscribeObj
(
pSub
);
taosRUnLockLatch
(
&
pSub
->
lock
);
taosRUnLockLatch
(
&
pSub
->
lock
);
mInfo
(
"topic:%s has %d consumers sub till now"
,
pRebInfo
->
key
,
rebInput
.
oldConsumerNum
);
mndReleaseSubscribe
(
pMnode
,
pSub
);
mndReleaseSubscribe
(
pMnode
,
pSub
);
}
}
...
@@ -633,6 +683,8 @@ static int32_t mndProcessRebalanceReq(SRpcMsg *pMsg) {
...
@@ -633,6 +683,8 @@ static int32_t mndProcessRebalanceReq(SRpcMsg *pMsg) {
taosArrayDestroy
(
rebOutput
.
rebVgs
);
taosArrayDestroy
(
rebOutput
.
rebVgs
);
tDeleteSubscribeObj
(
rebOutput
.
pSub
);
tDeleteSubscribeObj
(
rebOutput
.
pSub
);
taosMemoryFree
(
rebOutput
.
pSub
);
taosMemoryFree
(
rebOutput
.
pSub
);
rebalanceExec
=
true
;
}
}
// reset flag
// reset flag
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录