提交 5f86564a 编写于 作者: S Shengliang Guan

[149] fix bug while replace sdb

上级 a23b0b0c
......@@ -173,7 +173,6 @@ static int32_t dnodeOpenVnodes() {
int32_t numOfVnodes;
int32_t status;
vnodeInit();
status = dnodeGetVnodeList(vnodeList, &numOfVnodes);
if (status != TSDB_CODE_SUCCESS) {
......
......@@ -35,7 +35,6 @@ typedef struct {
void *qhandle; //used by query and retrieve msg
} SRspRet;
void vnodeInit();
int32_t vnodeCreate(SMDCreateVnodeMsg *pVnodeCfg);
int32_t vnodeDrop(int32_t vgId);
int32_t vnodeOpen(int32_t vgId, char *rootDir);
......
......@@ -18,7 +18,6 @@
#include "tsystem.h"
#include "ttimer.h"
#include "tutil.h"
#include "thash.h"
#include "rpcLog.h"
#include "rpcHaship.h"
#include "rpcUdp.h"
......
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TDENGINE_THASH_H
#define TDENGINE_THASH_H
#ifdef __cplusplus
extern "C" {
#endif
void *taosOpenHash(int maxSessions, int (*fp)(void *, uint64_t));
void taosCloseHash(void *handle);
int taosAddHash(void *handle, uint64_t, uint32_t id);
void taosDeleteHash(void *handle, uint64_t);
int32_t taosGetIdFromHash(void *handle, uint64_t);
int taosHashLong(void *, uint64_t ip);
uint64_t taosHashUInt64(uint64_t handle);
#ifdef __cplusplus
}
#endif
#endif // TDENGINE_THASH_H
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "os.h"
#include "tmempool.h"
typedef struct _long_hash_t {
unsigned int id;
struct _long_hash_t *prev;
struct _long_hash_t *next;
uint64_t cont;
} SLongHash;
typedef struct {
SLongHash **longHashList;
mpool_h longHashMemPool;
int (*hashFp)(void *, uint64_t);
int maxSessions;
pthread_mutex_t mutex;
} SHashObj;
uint64_t taosHashUInt64(uint64_t handle) {
uint64_t hash = handle >> 16;
hash += handle & 0xFFFF;
return hash;
}
int taosHashLong(void *handle, uint64_t ip) {
SHashObj *pObj = (SHashObj *)handle;
int hash = 0;
hash = (int)(ip >> 16);
hash += (int)(ip & 0xFFFF);
hash = hash % pObj->maxSessions;
return hash;
}
int taosAddHash(void *handle, uint64_t cont, unsigned int id) {
int hash;
SLongHash *pNode;
SHashObj * pObj;
pObj = (SHashObj *)handle;
if (pObj == NULL || pObj->maxSessions == 0) return -1;
pthread_mutex_lock(&pObj->mutex);
hash = (*pObj->hashFp)(pObj, cont);
pNode = (SLongHash *)taosMemPoolMalloc(pObj->longHashMemPool);
pNode->cont = cont;
pNode->id = id;
pNode->prev = 0;
pNode->next = pObj->longHashList[hash];
if (pObj->longHashList[hash] != 0) (pObj->longHashList[hash])->prev = pNode;
pObj->longHashList[hash] = pNode;
pthread_mutex_unlock(&pObj->mutex);
return 0;
}
void taosDeleteHash(void *handle, uint64_t cont) {
int hash;
SLongHash *pNode;
SHashObj * pObj;
pObj = (SHashObj *)handle;
if (pObj == NULL || pObj->maxSessions == 0) return;
hash = (*pObj->hashFp)(pObj, cont);
pthread_mutex_lock(&pObj->mutex);
pNode = pObj->longHashList[hash];
while (pNode) {
if (pNode->cont == cont) break;
pNode = pNode->next;
}
if (pNode) {
if (pNode->prev) {
pNode->prev->next = pNode->next;
} else {
pObj->longHashList[hash] = pNode->next;
}
if (pNode->next) {
pNode->next->prev = pNode->prev;
}
taosMemPoolFree(pObj->longHashMemPool, (char *)pNode);
}
pthread_mutex_unlock(&pObj->mutex);
}
int32_t taosGetIdFromHash(void *handle, uint64_t cont) {
int hash;
SLongHash *pNode;
SHashObj * pObj;
pObj = (SHashObj *)handle;
if (pObj == NULL || pObj->maxSessions == 0) return -1;
hash = (*pObj->hashFp)(pObj, cont);
pthread_mutex_lock(&pObj->mutex);
pNode = pObj->longHashList[hash];
while (pNode) {
if (pNode->cont == cont) {
break;
}
pNode = pNode->next;
}
pthread_mutex_unlock(&pObj->mutex);
if (pNode) return (int32_t)pNode->id;
return -1;
}
void *taosOpenHash(int maxSessions, int (*fp)(void *, uint64_t)) {
SLongHash **longHashList;
mpool_h longHashMemPool;
SHashObj * pObj;
longHashMemPool = taosMemPoolInit(maxSessions, sizeof(SLongHash));
if (longHashMemPool == 0) return NULL;
longHashList = calloc(sizeof(SLongHash *), (size_t)maxSessions);
if (longHashList == 0) {
taosMemPoolCleanUp(longHashMemPool);
return NULL;
}
pObj = malloc(sizeof(SHashObj));
if (pObj == NULL) {
taosMemPoolCleanUp(longHashMemPool);
free(longHashList);
return NULL;
}
pObj->maxSessions = maxSessions;
pObj->longHashMemPool = longHashMemPool;
pObj->longHashList = longHashList;
pObj->hashFp = fp;
pthread_mutex_init(&pObj->mutex, NULL);
return pObj;
}
void taosCloseHash(void *handle) {
SHashObj *pObj;
pObj = (SHashObj *)handle;
if (pObj == NULL || pObj->maxSessions == 0) return;
pthread_mutex_lock(&pObj->mutex);
if (pObj->longHashMemPool) taosMemPoolCleanUp(pObj->longHashMemPool);
if (pObj->longHashList) free(pObj->longHashList);
pthread_mutex_unlock(&pObj->mutex);
pthread_mutex_destroy(&pObj->mutex);
memset(pObj, 0, sizeof(SHashObj));
free(pObj);
}
......@@ -54,7 +54,7 @@ int syncGetNodesRole(tsync_h shandle, SNodesRole * cfg) { return 0; }
void syncConfirmForward(tsync_h shandle, uint64_t version, int32_t code) {}
#endif
void vnodeInit() {
static void vnodeInit() {
vnodeInitWriteFp();
vnodeInitReadFp();
......@@ -299,6 +299,8 @@ void vnodeRelease(void *pVnodeRaw) {
}
void *vnodeGetVnode(int32_t vgId) {
if (tsDnodeVnodesHash == NULL) return NULL;
SVnodeObj **ppVnode = (SVnodeObj **)taosHashGet(tsDnodeVnodesHash, (const char *)&vgId, sizeof(int32_t));
if (ppVnode == NULL || *ppVnode == NULL) {
terrno = TSDB_CODE_INVALID_VGROUP_ID;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册