fix(stream): clear the msgId if send success, and handle the race condition problem.
This commit is contained in:
parent
2345f6cf7f
commit
1ffec769b8
|
@ -40,6 +40,20 @@ void initRpcMsg(SRpcMsg* pMsg, int32_t msgType, void* pCont, int32_t contLen) {
|
||||||
pMsg->contLen = contLen;
|
pMsg->contLen = contLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void initDispatchInfo(SDispatchMsgInfo* pInfo, int32_t msgId) {
|
||||||
|
pInfo->startTs = taosGetTimestampMs();
|
||||||
|
pInfo->rspTs = -1;
|
||||||
|
pInfo->msgId = msgId;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void clearDispatchInfo(SDispatchMsgInfo* pInfo) {
|
||||||
|
pInfo->startTs = -1;
|
||||||
|
pInfo->msgId = -1;
|
||||||
|
pInfo->rspTs = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void updateDispatchInfo(SDispatchMsgInfo* pInfo, int64_t recvTs) { pInfo->rspTs = recvTs; }
|
||||||
|
|
||||||
static int32_t tInitStreamDispatchReq(SStreamDispatchReq* pReq, const SStreamTask* pTask, int32_t vgId,
|
static int32_t tInitStreamDispatchReq(SStreamDispatchReq* pReq, const SStreamTask* pTask, int32_t vgId,
|
||||||
int32_t numOfBlocks, int64_t dstTaskId, int32_t type) {
|
int32_t numOfBlocks, int64_t dstTaskId, int32_t type) {
|
||||||
pReq->streamId = pTask->id.streamId;
|
pReq->streamId = pTask->id.streamId;
|
||||||
|
@ -225,12 +239,15 @@ void clearBufferedDispatchMsg(SStreamTask* pTask) {
|
||||||
destroyDispatchMsg(pMsgInfo->pData, streamTaskGetNumOfDownstream(pTask));
|
destroyDispatchMsg(pMsgInfo->pData, streamTaskGetNumOfDownstream(pTask));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taosThreadMutexLock(&pMsgInfo->lock);
|
||||||
|
|
||||||
pMsgInfo->checkpointId = -1;
|
pMsgInfo->checkpointId = -1;
|
||||||
pMsgInfo->transId = -1;
|
pMsgInfo->transId = -1;
|
||||||
pMsgInfo->pData = NULL;
|
pMsgInfo->pData = NULL;
|
||||||
pMsgInfo->dispatchMsgType = 0;
|
pMsgInfo->dispatchMsgType = 0;
|
||||||
|
|
||||||
taosThreadMutexLock(&pMsgInfo->lock);
|
clearDispatchInfo(pMsgInfo);
|
||||||
|
|
||||||
taosArrayClear(pTask->msgInfo.pSendInfo);
|
taosArrayClear(pTask->msgInfo.pSendInfo);
|
||||||
taosThreadMutexUnlock(&pMsgInfo->lock);
|
taosThreadMutexUnlock(&pMsgInfo->lock);
|
||||||
}
|
}
|
||||||
|
@ -643,20 +660,6 @@ int32_t streamSearchAndAddBlock(SStreamTask* pTask, SStreamDispatchReq* pReqs, S
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initDispatchInfo(SDispatchMsgInfo* pInfo, int32_t msgId) {
|
|
||||||
pInfo->startTs = taosGetTimestampMs();
|
|
||||||
pInfo->rspTs = -1;
|
|
||||||
pInfo->msgId = msgId;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void clearDispatchInfo(SDispatchMsgInfo* pInfo) {
|
|
||||||
pInfo->startTs = -1;
|
|
||||||
pInfo->msgId = -1;
|
|
||||||
pInfo->rspTs = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void updateDispatchInfo(SDispatchMsgInfo* pInfo, int64_t recvTs) { pInfo->rspTs = recvTs; }
|
|
||||||
|
|
||||||
int32_t streamDispatchStreamBlock(SStreamTask* pTask) {
|
int32_t streamDispatchStreamBlock(SStreamTask* pTask) {
|
||||||
ASSERT((pTask->outputInfo.type == TASK_OUTPUT__FIXED_DISPATCH ||
|
ASSERT((pTask->outputInfo.type == TASK_OUTPUT__FIXED_DISPATCH ||
|
||||||
pTask->outputInfo.type == TASK_OUTPUT__SHUFFLE_DISPATCH));
|
pTask->outputInfo.type == TASK_OUTPUT__SHUFFLE_DISPATCH));
|
||||||
|
@ -699,7 +702,10 @@ int32_t streamDispatchStreamBlock(SStreamTask* pTask) {
|
||||||
type == STREAM_INPUT__TRANS_STATE);
|
type == STREAM_INPUT__TRANS_STATE);
|
||||||
|
|
||||||
pTask->execInfo.dispatch += 1;
|
pTask->execInfo.dispatch += 1;
|
||||||
|
|
||||||
|
taosThreadMutexLock(&pTask->msgInfo.lock);
|
||||||
initDispatchInfo(&pTask->msgInfo, pTask->execInfo.dispatch);
|
initDispatchInfo(&pTask->msgInfo, pTask->execInfo.dispatch);
|
||||||
|
taosThreadMutexUnlock(&pTask->msgInfo.lock);
|
||||||
|
|
||||||
int32_t code = doBuildDispatchMsg(pTask, pBlock);
|
int32_t code = doBuildDispatchMsg(pTask, pBlock);
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
|
@ -1222,10 +1228,13 @@ int32_t streamProcessDispatchRsp(SStreamTask* pTask, SStreamDispatchRsp* pRsp, i
|
||||||
const char* id = pTask->id.idStr;
|
const char* id = pTask->id.idStr;
|
||||||
int32_t vgId = pTask->pMeta->vgId;
|
int32_t vgId = pTask->pMeta->vgId;
|
||||||
SDispatchMsgInfo* pMsgInfo = &pTask->msgInfo;
|
SDispatchMsgInfo* pMsgInfo = &pTask->msgInfo;
|
||||||
int32_t msgId = pMsgInfo->msgId;
|
|
||||||
int64_t now = taosGetTimestampMs();
|
int64_t now = taosGetTimestampMs();
|
||||||
int32_t totalRsp = 0;
|
int32_t totalRsp = 0;
|
||||||
|
|
||||||
|
taosThreadMutexLock(&pMsgInfo->lock);
|
||||||
|
int32_t msgId = pMsgInfo->msgId;
|
||||||
|
taosThreadMutexUnlock(&pMsgInfo->lock);
|
||||||
|
|
||||||
// follower not handle the dispatch rsp
|
// follower not handle the dispatch rsp
|
||||||
if ((pTask->pMeta->role == NODE_ROLE_FOLLOWER) || (pTask->status.downstreamReady != 1)) {
|
if ((pTask->pMeta->role == NODE_ROLE_FOLLOWER) || (pTask->status.downstreamReady != 1)) {
|
||||||
stError("s-task:%s vgId:%d is follower or task just re-launched, not handle the dispatch rsp, discard it", id,
|
stError("s-task:%s vgId:%d is follower or task just re-launched, not handle the dispatch rsp, discard it", id,
|
||||||
|
|
Loading…
Reference in New Issue