Merge pull request #2559 from taosdata/hotfix/crash
[TD-825] vnodehash may be null while close all vnodes
This commit is contained in:
commit
af4b02246a
|
@ -176,6 +176,7 @@ void dnodeCleanupMgmt() {
|
||||||
tsMgmtQset = NULL;
|
tsMgmtQset = NULL;
|
||||||
tsMgmtQueue = NULL;
|
tsMgmtQueue = NULL;
|
||||||
|
|
||||||
|
vnodeCleanupResources();
|
||||||
}
|
}
|
||||||
|
|
||||||
void dnodeDispatchToMgmtQueue(SRpcMsg *pMsg) {
|
void dnodeDispatchToMgmtQueue(SRpcMsg *pMsg) {
|
||||||
|
@ -242,8 +243,14 @@ static int32_t dnodeGetVnodeList(int32_t vnodeList[], int32_t *numOfVnodes) {
|
||||||
int32_t vnode = atoi(de->d_name + 5);
|
int32_t vnode = atoi(de->d_name + 5);
|
||||||
if (vnode == 0) continue;
|
if (vnode == 0) continue;
|
||||||
|
|
||||||
vnodeList[*numOfVnodes] = vnode;
|
|
||||||
(*numOfVnodes)++;
|
(*numOfVnodes)++;
|
||||||
|
|
||||||
|
if (*numOfVnodes >= TSDB_MAX_VNODES) {
|
||||||
|
dError("vgId:%d, too many vnode directory in disk, exist:%d max:%d", vnode, *numOfVnodes, TSDB_MAX_VNODES);
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
vnodeList[*numOfVnodes - 1] = vnode;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
|
@ -337,7 +344,7 @@ static int32_t dnodeOpenVnodes() {
|
||||||
void dnodeStartStream() {
|
void dnodeStartStream() {
|
||||||
int32_t vnodeList[TSDB_MAX_VNODES];
|
int32_t vnodeList[TSDB_MAX_VNODES];
|
||||||
int32_t numOfVnodes = 0;
|
int32_t numOfVnodes = 0;
|
||||||
int32_t status = dnodeGetVnodeList(vnodeList, &numOfVnodes);
|
int32_t status = vnodeGetVnodeList(vnodeList, &numOfVnodes);
|
||||||
|
|
||||||
if (status != TSDB_CODE_SUCCESS) {
|
if (status != TSDB_CODE_SUCCESS) {
|
||||||
dInfo("get dnode list failed");
|
dInfo("get dnode list failed");
|
||||||
|
@ -352,15 +359,14 @@ void dnodeStartStream() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dnodeCloseVnodes() {
|
static void dnodeCloseVnodes() {
|
||||||
int32_t *vnodeList = (int32_t *)malloc(sizeof(int32_t) * TSDB_MAX_VNODES);
|
int32_t vnodeList[TSDB_MAX_VNODES];
|
||||||
int32_t numOfVnodes;
|
int32_t numOfVnodes;
|
||||||
int32_t status;
|
int32_t status;
|
||||||
|
|
||||||
status = dnodeGetVnodeList(vnodeList, &numOfVnodes);
|
status = vnodeGetVnodeList(vnodeList, &numOfVnodes);
|
||||||
|
|
||||||
if (status != TSDB_CODE_SUCCESS) {
|
if (status != TSDB_CODE_SUCCESS) {
|
||||||
dInfo("get dnode list failed");
|
dInfo("get dnode list failed");
|
||||||
free(vnodeList);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -368,7 +374,6 @@ static void dnodeCloseVnodes() {
|
||||||
vnodeClose(vnodeList[i]);
|
vnodeClose(vnodeList[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(vnodeList);
|
|
||||||
dInfo("total vnodes:%d are all closed", numOfVnodes);
|
dInfo("total vnodes:%d are all closed", numOfVnodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,8 +58,10 @@ void* vnodeGetWqueue(int32_t vgId);
|
||||||
void* vnodeGetWal(void *pVnode);
|
void* vnodeGetWal(void *pVnode);
|
||||||
|
|
||||||
int32_t vnodeProcessWrite(void *pVnode, int qtype, void *pHead, void *item);
|
int32_t vnodeProcessWrite(void *pVnode, int qtype, void *pHead, void *item);
|
||||||
void vnodeBuildStatusMsg(void * param);
|
int32_t vnodeGetVnodeList(int32_t vnodeList[], int32_t *numOfVnodes);
|
||||||
|
void vnodeBuildStatusMsg(void *param);
|
||||||
void vnodeSetAccess(SDMVgroupAccess *pAccess, int32_t numOfVnodes);
|
void vnodeSetAccess(SDMVgroupAccess *pAccess, int32_t numOfVnodes);
|
||||||
|
void vnodeCleanupResources();
|
||||||
|
|
||||||
int32_t vnodeProcessRead(void *pVnode, SReadMsg *pReadMsg);
|
int32_t vnodeProcessRead(void *pVnode, SReadMsg *pReadMsg);
|
||||||
|
|
||||||
|
|
|
@ -111,7 +111,7 @@ void mqttStopSystem() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void mqttCleanUpSystem() {
|
void mqttCleanUpSystem() {
|
||||||
mqttInfo("starting to clean up mqtt");
|
mqttInfo("starting to cleanup mqtt");
|
||||||
free(recntStatus.user_name);
|
free(recntStatus.user_name);
|
||||||
free(recntStatus.password);
|
free(recntStatus.password);
|
||||||
free(recntStatus.hostname);
|
free(recntStatus.hostname);
|
||||||
|
|
|
@ -68,6 +68,12 @@ static void vnodeInit() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vnodeCleanupResources() {
|
||||||
|
taosHashCleanup(tsDnodeVnodesHash);
|
||||||
|
vnodeModuleInit = PTHREAD_ONCE_INIT;
|
||||||
|
tsDnodeVnodesHash = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t vnodeCreate(SMDCreateVnodeMsg *pVnodeCfg) {
|
int32_t vnodeCreate(SMDCreateVnodeMsg *pVnodeCfg) {
|
||||||
int32_t code;
|
int32_t code;
|
||||||
pthread_once(&vnodeModuleInit, vnodeInit);
|
pthread_once(&vnodeModuleInit, vnodeInit);
|
||||||
|
@ -362,12 +368,6 @@ void vnodeRelease(void *pVnodeRaw) {
|
||||||
|
|
||||||
int32_t count = atomic_sub_fetch_32(&tsOpennedVnodes, 1);
|
int32_t count = atomic_sub_fetch_32(&tsOpennedVnodes, 1);
|
||||||
vDebug("vgId:%d, vnode is released, vnodes:%d", vgId, count);
|
vDebug("vgId:%d, vnode is released, vnodes:%d", vgId, count);
|
||||||
|
|
||||||
if (count <= 0) {
|
|
||||||
taosHashCleanup(tsDnodeVnodesHash);
|
|
||||||
vnodeModuleInit = PTHREAD_ONCE_INIT;
|
|
||||||
tsDnodeVnodesHash = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *vnodeGetVnode(int32_t vgId) {
|
void *vnodeGetVnode(int32_t vgId) {
|
||||||
|
@ -433,6 +433,28 @@ static void vnodeBuildVloadMsg(SVnodeObj *pVnode, SDMStatusMsg *pStatus) {
|
||||||
pLoad->replica = pVnode->syncCfg.replica;
|
pLoad->replica = pVnode->syncCfg.replica;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t vnodeGetVnodeList(int32_t vnodeList[], int32_t *numOfVnodes) {
|
||||||
|
if (tsDnodeVnodesHash == NULL) return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
SHashMutableIterator *pIter = taosHashCreateIter(tsDnodeVnodesHash);
|
||||||
|
while (taosHashIterNext(pIter)) {
|
||||||
|
SVnodeObj **pVnode = taosHashIterGet(pIter);
|
||||||
|
if (pVnode == NULL) continue;
|
||||||
|
if (*pVnode == NULL) continue;
|
||||||
|
|
||||||
|
(*numOfVnodes)++;
|
||||||
|
if (*numOfVnodes >= TSDB_MAX_VNODES) {
|
||||||
|
vError("vgId:%d, too many open vnodes, exist:%d max:%d", (*pVnode)->vgId, *numOfVnodes, TSDB_MAX_VNODES);
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
vnodeList[*numOfVnodes - 1] = (*pVnode)->vgId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
taosHashDestroyIter(pIter);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
void vnodeBuildStatusMsg(void *param) {
|
void vnodeBuildStatusMsg(void *param) {
|
||||||
SDMStatusMsg *pStatus = param;
|
SDMStatusMsg *pStatus = param;
|
||||||
SHashMutableIterator *pIter = taosHashCreateIter(tsDnodeVnodesHash);
|
SHashMutableIterator *pIter = taosHashCreateIter(tsDnodeVnodesHash);
|
||||||
|
|
Loading…
Reference in New Issue