commit
6129f132ac
|
@ -21,9 +21,11 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int32_t taosNewProc(char **args);
|
int32_t taosNewProc(char **args);
|
||||||
|
void taosWaitProc(int32_t pid);
|
||||||
|
void taosKillProc(int32_t pid);
|
||||||
|
bool taosProcExist(int32_t pid);
|
||||||
void taosSetProcName(int32_t argc, char **argv, const char *name);
|
void taosSetProcName(int32_t argc, char **argv, const char *name);
|
||||||
void taosSetProcPath(int32_t argc, char **argv);
|
void taosSetProcPath(int32_t argc, char **argv);
|
||||||
bool taosProcExists(int32_t pid);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,7 +200,7 @@ int32_t dmWriteFile(SDnodeMgmt *pMgmt) {
|
||||||
taosMemoryFree(content);
|
taosMemoryFree(content);
|
||||||
|
|
||||||
char realfile[PATH_MAX];
|
char realfile[PATH_MAX];
|
||||||
snprintf(realfile, sizeof(realfile), "%s%smnode.json", pMgmt->path, TD_DIRSEP);
|
snprintf(realfile, sizeof(realfile), "%s%sdnode.json", pMgmt->path, TD_DIRSEP);
|
||||||
|
|
||||||
if (taosRenameFile(file, realfile) != 0) {
|
if (taosRenameFile(file, realfile) != 0) {
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
|
|
@ -20,9 +20,9 @@ static bool dndRequireNode(SMgmtWrapper *pWrapper) {
|
||||||
bool required = false;
|
bool required = false;
|
||||||
int32_t code = (*pWrapper->fp.requiredFp)(pWrapper, &required);
|
int32_t code = (*pWrapper->fp.requiredFp)(pWrapper, &required);
|
||||||
if (!required) {
|
if (!required) {
|
||||||
dDebug("node:%s, no need to start", pWrapper->name);
|
dDebug("node:%s, does not require startup", pWrapper->name);
|
||||||
} else {
|
} else {
|
||||||
dDebug("node:%s, need to start", pWrapper->name);
|
dDebug("node:%s, needs to be started", pWrapper->name);
|
||||||
}
|
}
|
||||||
return required;
|
return required;
|
||||||
}
|
}
|
||||||
|
@ -255,17 +255,39 @@ static int32_t dndRunInParentProcess(SDnode *pDnode) {
|
||||||
while (1) {
|
while (1) {
|
||||||
if (pDnode->event == DND_EVENT_STOP) {
|
if (pDnode->event == DND_EVENT_STOP) {
|
||||||
dInfo("dnode is about to stop");
|
dInfo("dnode is about to stop");
|
||||||
|
for (ENodeType n = DNODE + 1; n < NODE_MAX; ++n) {
|
||||||
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
||||||
|
if (!pWrapper->required) continue;
|
||||||
|
if (pDnode->ntype == NODE_MAX) continue;
|
||||||
|
|
||||||
|
if (pWrapper->procId > 0 && taosProcExist(pWrapper->procId)) {
|
||||||
|
dInfo("node:%s, send kill signal to the child process:%d", pWrapper->name, pWrapper->procId);
|
||||||
|
taosKillProc(pWrapper->procId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ENodeType n = DNODE + 1; n < NODE_MAX; ++n) {
|
||||||
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
||||||
|
if (!pWrapper->required) continue;
|
||||||
|
if (pDnode->ntype == NODE_MAX) continue;
|
||||||
|
|
||||||
|
if (pWrapper->procId > 0 && taosProcExist(pWrapper->procId)) {
|
||||||
|
dInfo("node:%s, wait for child process:%d to stop", pWrapper->name, pWrapper->procId);
|
||||||
|
taosWaitProc(pWrapper->procId);
|
||||||
|
dInfo("node:%s, child process:%d is stopped", pWrapper->name, pWrapper->procId);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
} else {
|
||||||
|
for (ENodeType n = DNODE + 1; n < NODE_MAX; ++n) {
|
||||||
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
||||||
|
if (!pWrapper->required) continue;
|
||||||
|
if (pDnode->ntype == NODE_MAX) continue;
|
||||||
|
|
||||||
for (ENodeType n = DNODE + 1; n < NODE_MAX; ++n) {
|
if (pWrapper->procId <= 0 || !taosProcExist(pWrapper->procId)) {
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
dInfo("node:%s, process:%d is killed and needs to be restarted", pWrapper->name, pWrapper->procId);
|
||||||
if (!pWrapper->required) continue;
|
dndNewProc(pWrapper, n);
|
||||||
if (pDnode->ntype == NODE_MAX) continue;
|
}
|
||||||
|
|
||||||
if (pWrapper->procId <= 0 || !taosProcExists(pWrapper->procId)) {
|
|
||||||
dInfo("node:%s, process:%d is killed and needs to be restarted", pWrapper->name, pWrapper->procId);
|
|
||||||
dndNewProc(pWrapper, n);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,6 +301,12 @@ static int32_t dndRunInChildProcess(SDnode *pDnode) {
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[pDnode->ntype];
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[pDnode->ntype];
|
||||||
dInfo("%s run in child process", pWrapper->name);
|
dInfo("%s run in child process", pWrapper->name);
|
||||||
|
|
||||||
|
pWrapper->required = dndRequireNode(pWrapper);
|
||||||
|
if (!pWrapper->required) {
|
||||||
|
dError("%s does not require startup", pWrapper->name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
SMsgCb msgCb = dndCreateMsgcb(pWrapper);
|
SMsgCb msgCb = dndCreateMsgcb(pWrapper);
|
||||||
tmsgSetDefaultMsgCb(&msgCb);
|
tmsgSetDefaultMsgCb(&msgCb);
|
||||||
pWrapper->procType = PROC_CHILD;
|
pWrapper->procType = PROC_CHILD;
|
||||||
|
|
|
@ -32,6 +32,18 @@ int32_t taosNewProc(char **args) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void taosWaitProc(int32_t pid) {
|
||||||
|
int32_t status = 0;
|
||||||
|
waitpid(pid, &status, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void taosKillProc(int32_t pid) { kill(pid, SIGINT); }
|
||||||
|
|
||||||
|
bool taosProcExist(int32_t pid) {
|
||||||
|
int32_t p = getpgid(pid);
|
||||||
|
return p >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
// the length of the new name must be less than the original name to take effect
|
// the length of the new name must be less than the original name to take effect
|
||||||
void taosSetProcName(int32_t argc, char **argv, const char *name) {
|
void taosSetProcName(int32_t argc, char **argv, const char *name) {
|
||||||
prctl(PR_SET_NAME, name);
|
prctl(PR_SET_NAME, name);
|
||||||
|
@ -48,8 +60,3 @@ void taosSetProcName(int32_t argc, char **argv, const char *name) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosSetProcPath(int32_t argc, char **argv) { tsProcPath = argv[0]; }
|
void taosSetProcPath(int32_t argc, char **argv) { tsProcPath = argv[0]; }
|
||||||
|
|
||||||
bool taosProcExists(int32_t pid) {
|
|
||||||
int32_t p = getpgid(pid);
|
|
||||||
return p >= 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -590,7 +590,7 @@ void cfgDumpCfg(SConfig *pCfg, bool tsc, bool dump) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t cfgLoadFromEnvVar(SConfig *pConfig) {
|
int32_t cfgLoadFromEnvVar(SConfig *pConfig) {
|
||||||
uInfo("load from global env variables not implemented yet");
|
uInfo("load from env variables not implemented yet");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue