shm
This commit is contained in:
parent
bd660a5b2d
commit
143a311360
|
@ -49,7 +49,6 @@ typedef struct SRpcMsg {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char user[TSDB_USER_LEN];
|
char user[TSDB_USER_LEN];
|
||||||
SRpcMsg rpcMsg;
|
SRpcMsg rpcMsg;
|
||||||
SEpSet rpcEpSet;
|
|
||||||
int32_t rspLen;
|
int32_t rspLen;
|
||||||
void *pRsp;
|
void *pRsp;
|
||||||
} SNodeMsg;
|
} SNodeMsg;
|
||||||
|
|
|
@ -72,15 +72,13 @@ typedef struct SQnodeMgmt SQnodeMgmt;
|
||||||
typedef struct SSnodeMgmt SSnodeMgmt;
|
typedef struct SSnodeMgmt SSnodeMgmt;
|
||||||
typedef struct SBnodeMgmt SBnodeMgmt;
|
typedef struct SBnodeMgmt SBnodeMgmt;
|
||||||
|
|
||||||
typedef void (*RpcMsgFp)(SMgmtWrapper *pWrapper, SRpcMsg *pMsg, SEpSet *pEps);
|
typedef int32_t (*NodeMsgFp)(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
typedef void (*NodeMsgFp)(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
|
||||||
typedef int32_t (*OpenNodeFp)(SMgmtWrapper *pWrapper);
|
typedef int32_t (*OpenNodeFp)(SMgmtWrapper *pWrapper);
|
||||||
typedef void (*CloseNodeFp)(SMgmtWrapper *pWrapper);
|
typedef void (*CloseNodeFp)(SMgmtWrapper *pWrapper);
|
||||||
typedef bool (*RequireNodeFp)(SMgmtWrapper *pWrapper);
|
typedef bool (*RequireNodeFp)(SMgmtWrapper *pWrapper);
|
||||||
|
|
||||||
typedef struct SMsgHandle {
|
typedef struct SMsgHandle {
|
||||||
RpcMsgFp rpcMsgFp;
|
NodeMsgFp msgFp;
|
||||||
NodeMsgFp nodeMsgFp;
|
|
||||||
SMgmtWrapper *pWrapper;
|
SMgmtWrapper *pWrapper;
|
||||||
} SMsgHandle;
|
} SMsgHandle;
|
||||||
|
|
||||||
|
@ -98,7 +96,7 @@ typedef struct SMgmtWrapper {
|
||||||
SProcObj *pProc;
|
SProcObj *pProc;
|
||||||
void *pMgmt;
|
void *pMgmt;
|
||||||
SDnode *pDnode;
|
SDnode *pDnode;
|
||||||
SMsgHandle msgHandles[TDMT_MAX];
|
NodeMsgFp msgFps[TDMT_MAX];
|
||||||
SMgmtFp fp;
|
SMgmtFp fp;
|
||||||
} SMgmtWrapper;
|
} SMgmtWrapper;
|
||||||
|
|
||||||
|
|
|
@ -65,11 +65,7 @@ void dndCleanup() {
|
||||||
SMgmtWrapper *dndGetWrapper(SDnode *pDnode, ENodeType nodeType) { return &pDnode->wrappers[nodeType]; }
|
SMgmtWrapper *dndGetWrapper(SDnode *pDnode, ENodeType nodeType) { return &pDnode->wrappers[nodeType]; }
|
||||||
|
|
||||||
void dndSetMsgHandle(SMgmtWrapper *pWrapper, int32_t msgType, NodeMsgFp nodeMsgFp) {
|
void dndSetMsgHandle(SMgmtWrapper *pWrapper, int32_t msgType, NodeMsgFp nodeMsgFp) {
|
||||||
SMsgHandle *pHandle = &pWrapper->msgHandles[TMSG_INDEX(msgType)];
|
pWrapper->msgFps[TMSG_INDEX(msgType)] = nodeMsgFp;
|
||||||
|
|
||||||
pHandle->pWrapper = pWrapper;
|
|
||||||
pHandle->nodeMsgFp = nodeMsgFp;
|
|
||||||
pHandle->rpcMsgFp = dndProcessRpcMsg;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EDndStatus dndGetStatus(SDnode *pDnode) { return pDnode->status; }
|
EDndStatus dndGetStatus(SDnode *pDnode) { return pDnode->status; }
|
||||||
|
|
|
@ -257,8 +257,65 @@ void dndeHandleEvent(SDnode *pDnode, EDndEvent event) {
|
||||||
pDnode->event = event;
|
pDnode->event = event;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dndProcessRpcMsg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
static int32_t dndBuildMsg(SNodeMsg *pMsg, SRpcMsg *pRpc, SEpSet *pEpSet) {
|
||||||
if (pEpSet && pEpSet->numOfEps > 0 && pMsg->msgType == TDMT_MND_STATUS_RSP) {
|
SRpcConnInfo connInfo = {0};
|
||||||
dmUpdateMnodeEpSet(pWrapper->pDnode, pEpSet);
|
if ((pRpc->msgType & 1U) && rpcGetConnInfo(pRpc->handle, &connInfo) != 0) {
|
||||||
|
terrno = TSDB_CODE_MND_NO_USER_FROM_CONN;
|
||||||
|
dError("failed to build msg since %s, app:%p RPC:%p", terrstr(), pRpc->ahandle, pRpc->handle);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(pMsg->user, connInfo.user, TSDB_USER_LEN);
|
||||||
|
pMsg->rpcMsg = *pRpc;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dndSendRpcRsp(SDnode *pDnode, SRpcMsg *pRpc) {
|
||||||
|
if (pRpc->code == TSDB_CODE_APP_NOT_READY) {
|
||||||
|
dmSendRedirectRsp(pDnode, pRpc);
|
||||||
|
} else {
|
||||||
|
rpcSendResponse(pRpc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dndProcessRpcMsg(SMgmtWrapper *pWrapper, SRpcMsg *pRpc, SEpSet *pEpSet) {
|
||||||
|
if (pEpSet && pEpSet->numOfEps > 0 && pRpc->msgType == TDMT_MND_STATUS_RSP) {
|
||||||
|
dmUpdateMnodeEpSet(pWrapper->pDnode, pEpSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t code = -1;
|
||||||
|
SNodeMsg *pMsg = NULL;
|
||||||
|
|
||||||
|
NodeMsgFp msgFp = pWrapper->msgFps[TMSG_INDEX(pRpc->msgType)];
|
||||||
|
if (msgFp == NULL) {
|
||||||
|
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
pMsg = taosAllocateQitem(sizeof(SNodeMsg));
|
||||||
|
if (pMsg == NULL) {
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dndBuildMsg(pMsg, pRpc, pEpSet) != 0) {
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
dTrace("msg:%p, is created, app:%p RPC:%p user:%s, processd by %s", pMsg, pRpc->ahandle, pRpc->handle, pMsg->user,
|
||||||
|
pWrapper->name);
|
||||||
|
code = (*msgFp)(pWrapper, pMsg);
|
||||||
|
|
||||||
|
_OVER:
|
||||||
|
|
||||||
|
if (code != 0) {
|
||||||
|
bool isReq = (pRpc->msgType & 1U);
|
||||||
|
if (isReq) {
|
||||||
|
SRpcMsg rsp = {.handle = pRpc->handle, .ahandle = pRpc->ahandle, .code = terrno};
|
||||||
|
dndSendRpcRsp(pWrapper->pDnode, &rsp);
|
||||||
|
}
|
||||||
|
dTrace("msg:%p, is freed", pMsg);
|
||||||
|
taosFreeQitem(pMsg);
|
||||||
|
rpcFreeCont(pRpc->pCont);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -36,10 +36,10 @@ static void dndProcessResponse(void *parent, SRpcMsg *pRsp, SEpSet *pEpSet) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SMsgHandle *pHandle = &pMgmt->msgHandles[TMSG_INDEX(msgType)];
|
SMsgHandle *pHandle = &pMgmt->msgHandles[TMSG_INDEX(msgType)];
|
||||||
if (pHandle->rpcMsgFp != NULL) {
|
if (pHandle->msgFp != NULL) {
|
||||||
dTrace("RPC %p, rsp:%s will be processed by %s, code:0x%x app:%p", pRsp->handle, TMSG_INFO(msgType),
|
dTrace("RPC %p, rsp:%s will be processed by %s, code:0x%x app:%p", pRsp->handle, TMSG_INFO(msgType),
|
||||||
pHandle->pWrapper->name, pRsp->code & 0XFFFF, pRsp->ahandle);
|
pHandle->pWrapper->name, pRsp->code & 0XFFFF, pRsp->ahandle);
|
||||||
(*pHandle->rpcMsgFp)(pHandle->pWrapper, pRsp, pEpSet);
|
dndProcessRpcMsg(pHandle->pWrapper, pRsp, pEpSet);
|
||||||
} else {
|
} else {
|
||||||
dError("RPC %p, rsp:%s not processed, app:%p", pRsp->handle, TMSG_INFO(msgType), pRsp->ahandle);
|
dError("RPC %p, rsp:%s not processed, app:%p", pRsp->handle, TMSG_INFO(msgType), pRsp->ahandle);
|
||||||
rpcFreeCont(pRsp->pCont);
|
rpcFreeCont(pRsp->pCont);
|
||||||
|
@ -118,10 +118,10 @@ static void dndProcessRequest(void *param, SRpcMsg *pReq, SEpSet *pEpSet) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SMsgHandle *pHandle = &pMgmt->msgHandles[TMSG_INDEX(msgType)];
|
SMsgHandle *pHandle = &pMgmt->msgHandles[TMSG_INDEX(msgType)];
|
||||||
if (pHandle->rpcMsgFp != NULL) {
|
if (pHandle->msgFp != NULL) {
|
||||||
dTrace("RPC %p, req:%s will be processed by %s, app:%p", pReq->handle, TMSG_INFO(msgType), pHandle->pWrapper->name,
|
dTrace("RPC %p, req:%s will be processed by %s, app:%p", pReq->handle, TMSG_INFO(msgType), pHandle->pWrapper->name,
|
||||||
pReq->ahandle);
|
pReq->ahandle);
|
||||||
(*pHandle->rpcMsgFp)(pHandle->pWrapper, pReq, pEpSet);
|
dndProcessRpcMsg(pHandle->pWrapper, pReq, pEpSet);
|
||||||
} else {
|
} else {
|
||||||
dError("RPC %p, req:%s not processed since no handle, app:%p", pReq->handle, TMSG_INFO(msgType), pReq->ahandle);
|
dError("RPC %p, req:%s not processed since no handle, app:%p", pReq->handle, TMSG_INFO(msgType), pReq->ahandle);
|
||||||
SRpcMsg rspMsg = {.handle = pReq->handle, .code = TSDB_CODE_MSG_NOT_PROCESSED, .ahandle = pReq->ahandle};
|
SRpcMsg rspMsg = {.handle = pReq->handle, .code = TSDB_CODE_MSG_NOT_PROCESSED, .ahandle = pReq->ahandle};
|
||||||
|
@ -253,17 +253,17 @@ int32_t dndInitMsgHandle(SDnode *pDnode) {
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[nodeType];
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[nodeType];
|
||||||
|
|
||||||
for (int32_t msgIndex = 0; msgIndex < TDMT_MAX; ++msgIndex) {
|
for (int32_t msgIndex = 0; msgIndex < TDMT_MAX; ++msgIndex) {
|
||||||
SMsgHandle msgHandle = pWrapper->msgHandles[msgIndex];
|
NodeMsgFp msgFp = pWrapper->msgFps[msgIndex];
|
||||||
if (msgHandle.rpcMsgFp == NULL) continue;
|
if (msgFp == NULL) continue;
|
||||||
|
|
||||||
SMsgHandle *pHandle = &pMgmt->msgHandles[msgIndex];
|
SMsgHandle *pHandle = &pMgmt->msgHandles[msgIndex];
|
||||||
if (pHandle->rpcMsgFp != NULL) {
|
if (pHandle->msgFp != NULL) {
|
||||||
dError("msg:%s, has multiple process nodes, prev node:%s, curr node:%s", tMsgInfo[msgIndex],
|
dError("msg:%s, has multiple process nodes, prev node:%s, curr node:%s", tMsgInfo[msgIndex],
|
||||||
pHandle->pWrapper->name, pWrapper->name);
|
pHandle->pWrapper->name, pWrapper->name);
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
dDebug("msg:%s, will be processed by node:%s", tMsgInfo[msgIndex], pWrapper->name);
|
dDebug("msg:%s, will be processed by node:%s", tMsgInfo[msgIndex], pWrapper->name);
|
||||||
*pHandle = msgHandle;
|
pHandle->msgFp = msgFp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ extern "C" {
|
||||||
|
|
||||||
int32_t dmStartWorker();
|
int32_t dmStartWorker();
|
||||||
void dmStopWorker();
|
void dmStopWorker();
|
||||||
void dmProcessMgmtMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t dmProcessMgmtMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -161,7 +161,7 @@ void dmStopWorker(SDnodeMgmt *pMgmt) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dmProcessMgmtMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {
|
int32_t dmProcessMgmtMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {
|
||||||
SDnodeMgmt *pMgmt = pWrapper->pMgmt;
|
SDnodeMgmt *pMgmt = pWrapper->pMgmt;
|
||||||
|
|
||||||
SDnodeWorker *pWorker = &pMgmt->mgmtWorker;
|
SDnodeWorker *pWorker = &pMgmt->mgmtWorker;
|
||||||
|
@ -169,12 +169,5 @@ void dmProcessMgmtMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {
|
||||||
pWorker = &pMgmt->statusWorker;
|
pWorker = &pMgmt->statusWorker;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dndWriteMsgToWorker(pWorker, pMsg, sizeof(SNodeMsg)) != 0) {
|
return dndWriteMsgToWorker(pWorker, pMsg, sizeof(SNodeMsg));
|
||||||
if (pMsg->rpcMsg.msgType & 1u) {
|
|
||||||
SRpcMsg rsp = {.handle = pMsg->rpcMsg.handle, .code = TSDB_CODE_OUT_OF_MEMORY};
|
|
||||||
rpcSendResponse(&rsp);
|
|
||||||
}
|
|
||||||
rpcFreeCont(pMsg->rpcMsg.pCont);
|
|
||||||
taosFreeQitem(pMsg);
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -31,9 +31,9 @@ int32_t mmPutMsgToReadQueue(SDnode *pDnode, SRpcMsg *pRpcMsg);
|
||||||
void mmConsumeChildQueue(SDnode *pDnode, SMndMsg *pMsg, int32_t msgLen, void *pCont, int32_t contLen);
|
void mmConsumeChildQueue(SDnode *pDnode, SMndMsg *pMsg, int32_t msgLen, void *pCont, int32_t contLen);
|
||||||
void mmConsumeParentQueue(SDnode *pDnode, SRpcMsg *pMsg, int32_t msgLen, void *pCont, int32_t contLen);
|
void mmConsumeParentQueue(SDnode *pDnode, SRpcMsg *pMsg, int32_t msgLen, void *pCont, int32_t contLen);
|
||||||
|
|
||||||
void mmProcessWriteMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t mmProcessWriteMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
void mmProcessSyncMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t mmProcessSyncMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
void mmProcessReadMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t mmProcessReadMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -268,6 +268,6 @@ static void mmConsumeMsgQueue(SDnode *pDnode, SMndMsg *pMsg) {
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void mmProcessWriteMsg( SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {}
|
int32_t mmProcessWriteMsg( SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {return 0;}
|
||||||
void mmProcessSyncMsg( SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {}
|
int32_t mmProcessSyncMsg( SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {return 0;}
|
||||||
void mmProcessReadMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {}
|
int32_t mmProcessReadMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {return 0;}
|
|
@ -31,10 +31,10 @@ int32_t vmPutMsgToReadQueue(SDnode *pDnode, SRpcMsg *pRpcMsg);
|
||||||
void vmConsumeChildQueue(SDnode *pDnode, SMndMsg *pMsg, int32_t msgLen, void *pCont, int32_t contLen);
|
void vmConsumeChildQueue(SDnode *pDnode, SMndMsg *pMsg, int32_t msgLen, void *pCont, int32_t contLen);
|
||||||
void vmConsumeParentQueue(SDnode *pDnode, SRpcMsg *pMsg, int32_t msgLen, void *pCont, int32_t contLen);
|
void vmConsumeParentQueue(SDnode *pDnode, SRpcMsg *pMsg, int32_t msgLen, void *pCont, int32_t contLen);
|
||||||
|
|
||||||
void vmProcessWriteMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t vmProcessWriteMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
void vmProcessSyncMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t vmProcessSyncMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
void vmProcessQueryMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t vmProcessQueryMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
void vmProcessFetchMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t vmProcessFetchMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "vmWorker.h"
|
#include "vmWorker.h"
|
||||||
|
|
||||||
void vmProcessWriteMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg){}
|
int32_t vmProcessWriteMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg){return 0;}
|
||||||
void vmProcessSyncMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg){}
|
int32_t vmProcessSyncMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg){return 0;}
|
||||||
void vmProcessQueryMsg( SMgmtWrapper *pWrapper, SNodeMsg *pMsg){}
|
int32_t vmProcessQueryMsg( SMgmtWrapper *pWrapper, SNodeMsg *pMsg){return 0;}
|
||||||
void vmProcessFetchMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg){}
|
int32_t vmProcessFetchMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg){return 0;}
|
Loading…
Reference in New Issue