提交 6ece0d9a 编写于 作者: S Shengliang Guan

shm

上级 5bd37b75
...@@ -32,19 +32,17 @@ typedef void *(*ProcConsumeFp)(void *pParent, void *pHead, int16_t headLen, void ...@@ -32,19 +32,17 @@ typedef void *(*ProcConsumeFp)(void *pParent, void *pHead, int16_t headLen, void
ProcFuncType ftype); ProcFuncType ftype);
typedef struct { typedef struct {
int32_t childQueueSize;
ProcConsumeFp childConsumeFp; ProcConsumeFp childConsumeFp;
ProcMallocFp childMallocHeadFp; ProcMallocFp childMallocHeadFp;
ProcFreeFp childFreeHeadFp; ProcFreeFp childFreeHeadFp;
ProcMallocFp childMallocBodyFp; ProcMallocFp childMallocBodyFp;
ProcFreeFp childFreeBodyFp; ProcFreeFp childFreeBodyFp;
int32_t parentQueueSize;
ProcConsumeFp parentConsumeFp; ProcConsumeFp parentConsumeFp;
ProcMallocFp parentdMallocHeadFp; ProcMallocFp parentdMallocHeadFp;
ProcFreeFp parentFreeHeadFp; ProcFreeFp parentFreeHeadFp;
ProcMallocFp parentMallocBodyFp; ProcMallocFp parentMallocBodyFp;
ProcFreeFp parentFreeBodyFp; ProcFreeFp parentFreeBodyFp;
bool testFlag; SShm shm;
void *pParent; void *pParent;
const char *name; const char *name;
} SProcCfg; } SProcCfg;
......
...@@ -28,14 +28,18 @@ static bool dndRequireNode(SMgmtWrapper *pWrapper) { ...@@ -28,14 +28,18 @@ static bool dndRequireNode(SMgmtWrapper *pWrapper) {
} }
int32_t dndOpenNode(SMgmtWrapper *pWrapper) { int32_t dndOpenNode(SMgmtWrapper *pWrapper) {
int32_t code = (*pWrapper->fp.openFp)(pWrapper); if (taosMkDir(pWrapper->path) != 0) {
if (code != 0) { terrno = TAOS_SYSTEM_ERROR(errno);
dError("node:%s, failed to create dir:%s since %s", pWrapper->name, pWrapper->path, terrstr());
return -1;
}
if ((*pWrapper->fp.openFp)(pWrapper) != 0) {
dError("node:%s, failed to open since %s", pWrapper->name, terrstr()); dError("node:%s, failed to open since %s", pWrapper->name, terrstr());
return -1; return -1;
} else {
dDebug("node:%s, has been opened", pWrapper->name);
} }
dDebug("node:%s, has been opened", pWrapper->name);
pWrapper->deployed = true; pWrapper->deployed = true;
return 0; return 0;
} }
...@@ -62,22 +66,13 @@ void dndCloseNode(SMgmtWrapper *pWrapper) { ...@@ -62,22 +66,13 @@ void dndCloseNode(SMgmtWrapper *pWrapper) {
} }
static int32_t dndRunInSingleProcess(SDnode *pDnode) { static int32_t dndRunInSingleProcess(SDnode *pDnode) {
dDebug("dnode run in single process mode"); dInfo("dnode start to run in single process");
SMsgCb msgCb = dndCreateMsgcb(&pDnode->wrappers[0]);
tmsgSetDefaultMsgCb(&msgCb);
for (ENodeType n = DNODE; n < NODE_MAX; ++n) { for (ENodeType n = DNODE; n < NODE_MAX; ++n) {
SMgmtWrapper *pWrapper = &pDnode->wrappers[n]; SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
pWrapper->required = dndRequireNode(pWrapper); pWrapper->required = dndRequireNode(pWrapper);
if (!pWrapper->required) continue; if (!pWrapper->required) continue;
if (taosMkDir(pWrapper->path) != 0) {
terrno = TAOS_SYSTEM_ERROR(errno);
dError("node:%s, failed to create dir:%s since %s", pWrapper->name, pWrapper->path, terrstr());
return -1;
}
pWrapper->procType = PROC_SINGLE;
if (dndOpenNode(pWrapper) != 0) { if (dndOpenNode(pWrapper) != 0) {
dError("node:%s, failed to start since %s", pWrapper->name, terrstr()); dError("node:%s, failed to start since %s", pWrapper->name, terrstr());
return -1; return -1;
...@@ -96,18 +91,10 @@ static int32_t dndRunInSingleProcess(SDnode *pDnode) { ...@@ -96,18 +91,10 @@ static int32_t dndRunInSingleProcess(SDnode *pDnode) {
} }
} }
dInfo("dnode running in single process");
return 0; return 0;
} }
static void dndClearNodesExecpt(SDnode *pDnode, ENodeType except) {
// dndCleanupServer(pDnode);
for (ENodeType n = 0; n < NODE_MAX; ++n) {
if (except == n) continue;
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
pWrapper->required = false;
}
}
static void dndConsumeChildQueue(SMgmtWrapper *pWrapper, SNodeMsg *pMsg, int16_t msgLen, void *pCont, int32_t contLen, static void dndConsumeChildQueue(SMgmtWrapper *pWrapper, SNodeMsg *pMsg, int16_t msgLen, void *pCont, int32_t contLen,
ProcFuncType ftype) { ProcFuncType ftype) {
SRpcMsg *pRpc = &pMsg->rpcMsg; SRpcMsg *pRpc = &pMsg->rpcMsg;
...@@ -153,115 +140,126 @@ static void dndConsumeParentQueue(SMgmtWrapper *pWrapper, SRpcMsg *pMsg, int16_t ...@@ -153,115 +140,126 @@ static void dndConsumeParentQueue(SMgmtWrapper *pWrapper, SRpcMsg *pMsg, int16_t
taosMemoryFree(pMsg); taosMemoryFree(pMsg);
} }
static int32_t dndRunInMultiProcess(SDnode *pDnode) { static int32_t dndRunInParentProcess(SDnode *pDnode) {
dInfo("dnode run in multi process mode"); dInfo("dnode start to run in parent process");
SMgmtWrapper *pDWrapper = &pDnode->wrappers[DNODE];
if (dndOpenNode(pDWrapper) != 0) {
dError("node:%s, failed to start since %s", pDWrapper->name, terrstr());
return -1;
}
for (ENodeType n = 0; n < NODE_MAX; ++n) { for (ENodeType n = DNODE + 1; n < NODE_MAX; ++n) {
SMgmtWrapper *pWrapper = &pDnode->wrappers[n]; SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
pWrapper->required = dndRequireNode(pWrapper); pWrapper->required = dndRequireNode(pWrapper);
if (!pWrapper->required) continue; if (!pWrapper->required) continue;
SMsgCb msgCb = dndCreateMsgcb(pWrapper); int64_t shmsize = 1024 * 1024 * 2; // size will be a configuration item
tmsgSetDefaultMsgCb(&msgCb); if (taosCreateShm(&pWrapper->shm, shmsize) != 0) {
terrno = TAOS_SYSTEM_ERROR(terrno);
if (taosMkDir(pWrapper->path) != 0) { dError("node:%s, failed to create shm size:%" PRId64 " since %s", pWrapper->name, shmsize, terrstr());
terrno = TAOS_SYSTEM_ERROR(errno);
dError("failed to create dir:%s since %s", pWrapper->path, terrstr());
return -1; return -1;
} }
if (n == DNODE) { SProcCfg cfg = {.parentConsumeFp = (ProcConsumeFp)dndConsumeParentQueue,
dInfo("node:%s, will start in parent process", pWrapper->name); .parentdMallocHeadFp = (ProcMallocFp)taosMemoryMalloc,
pWrapper->procType = PROC_SINGLE; .parentFreeHeadFp = (ProcFreeFp)taosMemoryFree,
if (dndOpenNode(pWrapper) != 0) { .parentMallocBodyFp = (ProcMallocFp)rpcMallocCont,
dError("node:%s, failed to start since %s", pWrapper->name, terrstr()); .parentFreeBodyFp = (ProcFreeFp)rpcFreeCont,
return -1; .shm = pWrapper->shm,
} .pParent = pWrapper,
continue; .name = pWrapper->name};
pWrapper->pProc = taosProcInit(&cfg);
if (pWrapper->pProc == NULL) {
dError("node:%s, failed to create proc since %s", pWrapper->name, terrstr());
return -1;
} }
}
if (dndWriteRuntimeFile(pDnode) != 0) {
dError("failed to write runtime file since %s", terrstr());
return -1;
}
for (ENodeType n = DNODE + 1; n < NODE_MAX; ++n) {
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
if (!pWrapper->required) continue;
SProcCfg cfg = {.childQueueSize = 1024 * 1024 * 2, // size will be a configuration item dInfo("node:%s, will not start in parent process", pWrapper->name);
.childConsumeFp = (ProcConsumeFp)dndConsumeChildQueue, // exec new node
.childMallocHeadFp = (ProcMallocFp)taosAllocateQitem,
.childFreeHeadFp = (ProcFreeFp)taosFreeQitem, pWrapper->procType = PROC_PARENT;
.childMallocBodyFp = (ProcMallocFp)rpcMallocCont, if (taosProcRun(pWrapper->pProc) != 0) {
.childFreeBodyFp = (ProcFreeFp)rpcFreeCont, dError("node:%s, failed to run proc since %s", pWrapper->name, terrstr());
.parentQueueSize = 1024 * 1024 * 2, // size will be a configuration item
.parentConsumeFp = (ProcConsumeFp)dndConsumeParentQueue,
.parentdMallocHeadFp = (ProcMallocFp)taosMemoryMalloc,
.parentFreeHeadFp = (ProcFreeFp)taosMemoryFree,
.parentMallocBodyFp = (ProcMallocFp)rpcMallocCont,
.parentFreeBodyFp = (ProcFreeFp)rpcFreeCont,
.pParent = pWrapper,
.name = pWrapper->name};
SProcObj *pProc = taosProcInit(&cfg);
if (pProc == NULL) {
dError("node:%s, failed to fork since %s", pWrapper->name, terrstr());
return -1; return -1;
} }
}
pWrapper->pProc = pProc; dndSetStatus(pDnode, DND_STAT_RUNNING);
if (taosProcIsChild(pProc)) { if ((*pDWrapper->fp.startFp)(pDWrapper) != 0) {
dInfo("node:%s, will start in child process", pWrapper->name); dError("node:%s, failed to start since %s", pDWrapper->name, terrstr());
pWrapper->procType = PROC_CHILD; return -1;
// dndResetLog(pWrapper); }
dInfo("node:%s, clean up resources inherited from parent", pWrapper->name); dInfo("dnode running in parent process");
dndClearNodesExecpt(pDnode, n); return 0;
}
dInfo("node:%s, will be initialized in child process", pWrapper->name); static int32_t dndRunInChildProcess(SDnode *pDnode) {
if (dndOpenNode(pWrapper) != 0) { dInfo("dnode start to run in child process");
dInfo("node:%s, failed to init in child process since %s", pWrapper->name, terrstr());
return -1;
}
if (taosProcRun(pProc) != 0) { SMgmtWrapper *pWrapper = &pDnode->wrappers[pDnode->ntype];
dError("node:%s, failed to run proc since %s", pWrapper->name, terrstr()); if (dndOpenNode(pWrapper) != 0) {
return -1; dError("node:%s, failed to start since %s", pWrapper->name, terrstr());
} return -1;
break;
} else {
dInfo("node:%s, will not start in parent process, child pid:%d", pWrapper->name, taosProcChildId(pProc));
pWrapper->procType = PROC_PARENT;
if (taosProcRun(pProc) != 0) {
dError("node:%s, failed to run proc since %s", pWrapper->name, terrstr());
return -1;
}
}
} }
dndSetStatus(pDnode, DND_STAT_RUNNING); SProcCfg cfg = {.childConsumeFp = (ProcConsumeFp)dndConsumeChildQueue,
.childMallocHeadFp = (ProcMallocFp)taosAllocateQitem,
.childFreeHeadFp = (ProcFreeFp)taosFreeQitem,
.childMallocBodyFp = (ProcMallocFp)rpcMallocCont,
.childFreeBodyFp = (ProcFreeFp)rpcFreeCont,
.shm = pWrapper->shm,
.pParent = pWrapper,
.name = pWrapper->name};
pWrapper->pProc = taosProcInit(&cfg);
if (pWrapper->pProc == NULL) {
dError("node:%s, failed to create proc since %s", pWrapper->name, terrstr());
return -1;
}
for (ENodeType n = 0; n < NODE_MAX; ++n) { pWrapper->procType = PROC_CHILD;
SMgmtWrapper *pWrapper = &pDnode->wrappers[n]; if (taosProcRun(pWrapper->pProc) != 0) {
if (!pWrapper->required) continue; dError("node:%s, failed to run proc since %s", pWrapper->name, terrstr());
if (pWrapper->fp.startFp == NULL) continue; return -1;
if (pWrapper->procType == PROC_PARENT && n != DNODE) continue;
if (pWrapper->procType == PROC_CHILD && n == DNODE) continue;
if ((*pWrapper->fp.startFp)(pWrapper) != 0) {
dError("node:%s, failed to start since %s", pWrapper->name, terrstr());
return -1;
}
} }
dInfo("dnode running in child process");
return 0; return 0;
} }
int32_t dndRun(SDnode *pDnode) { int32_t dndRun(SDnode * pDnode) {
if (!tsMultiProcess) { if (!tsMultiProcess) {
if (dndRunInSingleProcess(pDnode) != 0) { if (dndRunInSingleProcess(pDnode) != 0) {
dError("failed to run dnode in single process mode since %s", terrstr()); dError("failed to run dnode since %s", terrstr());
return -1;
}
} else if (pDnode->ntype == DNODE) {
if (dndRunInParentProcess(pDnode) != 0) {
dError("failed to run dnode in parent process since %s", terrstr());
return -1; return -1;
} }
} else { } else {
if (dndRunInMultiProcess(pDnode) != 0) { if (dndRunInChildProcess(pDnode) != 0) {
dError("failed to run dnode in multi process mode since %s", terrstr()); dError("failed to run dnode in child process since %s", terrstr());
return -1; return -1;
} }
} }
dndReportStartup(pDnode, "TDengine", "initialized successfully"); dndReportStartup(pDnode, "TDengine", "initialized successfully");
dInfo("TDengine initialized successfully");
while (1) { while (1) {
if (pDnode->event == DND_EVENT_STOP) { if (pDnode->event == DND_EVENT_STOP) {
......
...@@ -101,6 +101,9 @@ SDnode *dndCreate(const SDnodeOpt *pOption) { ...@@ -101,6 +101,9 @@ SDnode *dndCreate(const SDnodeOpt *pOption) {
goto _OVER; goto _OVER;
} }
SMsgCb msgCb = dndCreateMsgcb(&pDnode->wrappers[0]);
tmsgSetDefaultMsgCb(&msgCb);
dInfo("dnode object is created, data:%p", pDnode); dInfo("dnode object is created, data:%p", pDnode);
code = 0; code = 0;
......
...@@ -359,8 +359,8 @@ SProcObj *taosProcInit(const SProcCfg *pCfg) { ...@@ -359,8 +359,8 @@ SProcObj *taosProcInit(const SProcCfg *pCfg) {
} }
pProc->name = pCfg->name; pProc->name = pCfg->name;
pProc->pChildQueue = taosProcInitQueue(pCfg->childQueueSize); pProc->pChildQueue = taosProcInitQueue(pCfg->shm.size / 2);
pProc->pParentQueue = taosProcInitQueue(pCfg->parentQueueSize); pProc->pParentQueue = taosProcInitQueue(pCfg->shm.size / 2);
if (pProc->pChildQueue == NULL || pProc->pParentQueue == NULL) { if (pProc->pChildQueue == NULL || pProc->pParentQueue == NULL) {
taosProcCleanupQueue(pProc->pChildQueue); taosProcCleanupQueue(pProc->pChildQueue);
taosMemoryFree(pProc); taosMemoryFree(pProc);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册