commit
23f8739efd
|
@ -31,22 +31,7 @@
|
||||||
#include "dnodeWrite.h"
|
#include "dnodeWrite.h"
|
||||||
#include "vnode.h"
|
#include "vnode.h"
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int32_t vgId; // global vnode group ID
|
|
||||||
int32_t refCount; // reference count
|
|
||||||
EVnodeStatus status; // status: master, slave, notready, deleting
|
|
||||||
int64_t version;
|
|
||||||
void * wworker;
|
|
||||||
void * rworker;
|
|
||||||
void * wal;
|
|
||||||
void * tsdb;
|
|
||||||
void * replica;
|
|
||||||
void * events;
|
|
||||||
void * cq; // continuous query
|
|
||||||
} SVnodeObj;
|
|
||||||
|
|
||||||
static int32_t dnodeOpenVnodes();
|
static int32_t dnodeOpenVnodes();
|
||||||
static void dnodeCleanupVnodes();
|
|
||||||
static int32_t dnodeProcessCreateVnodeMsg(SRpcMsg *pMsg);
|
static int32_t dnodeProcessCreateVnodeMsg(SRpcMsg *pMsg);
|
||||||
static int32_t dnodeProcessDropVnodeMsg(SRpcMsg *pMsg);
|
static int32_t dnodeProcessDropVnodeMsg(SRpcMsg *pMsg);
|
||||||
static int32_t dnodeProcessAlterVnodeMsg(SRpcMsg *pMsg);
|
static int32_t dnodeProcessAlterVnodeMsg(SRpcMsg *pMsg);
|
||||||
|
@ -56,7 +41,6 @@ static int32_t (*dnodeProcessMgmtMsgFp[TSDB_MSG_TYPE_MAX])(SRpcMsg *pMsg);
|
||||||
static void dnodeSendStatusMsg(void *handle, void *tmrId);
|
static void dnodeSendStatusMsg(void *handle, void *tmrId);
|
||||||
static void dnodeReadDnodeId();
|
static void dnodeReadDnodeId();
|
||||||
|
|
||||||
void *tsDnodeVnodesHash = NULL;
|
|
||||||
static void *tsDnodeTmr = NULL;
|
static void *tsDnodeTmr = NULL;
|
||||||
static void *tsStatusTimer = NULL;
|
static void *tsStatusTimer = NULL;
|
||||||
static uint32_t tsRebootTime;
|
static uint32_t tsRebootTime;
|
||||||
|
@ -72,12 +56,6 @@ int32_t dnodeInitMgmt() {
|
||||||
dnodeProcessMgmtMsgFp[TSDB_MSG_TYPE_MD_ALTER_STREAM] = dnodeProcessAlterStreamMsg;
|
dnodeProcessMgmtMsgFp[TSDB_MSG_TYPE_MD_ALTER_STREAM] = dnodeProcessAlterStreamMsg;
|
||||||
dnodeProcessMgmtMsgFp[TSDB_MSG_TYPE_MD_CONFIG_DNODE] = dnodeProcessConfigDnodeMsg;
|
dnodeProcessMgmtMsgFp[TSDB_MSG_TYPE_MD_CONFIG_DNODE] = dnodeProcessConfigDnodeMsg;
|
||||||
|
|
||||||
tsDnodeVnodesHash = taosInitIntHash(TSDB_MAX_VNODES, sizeof(SVnodeObj), taosHashInt);
|
|
||||||
if (tsDnodeVnodesHash == NULL) {
|
|
||||||
dError("failed to init vnode list");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
tsRebootTime = taosGetTimestampSec();
|
tsRebootTime = taosGetTimestampSec();
|
||||||
|
|
||||||
tsDnodeTmr = taosTmrInit(100, 200, 60000, "DND-DM");
|
tsDnodeTmr = taosTmrInit(100, 200, 60000, "DND-DM");
|
||||||
|
@ -86,6 +64,10 @@ int32_t dnodeInitMgmt() {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( vnodeInitModule() != TSDB_CODE_SUCCESS) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t code = dnodeOpenVnodes();
|
int32_t code = dnodeOpenVnodes();
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -106,11 +88,7 @@ void dnodeCleanupMgmt() {
|
||||||
tsDnodeTmr = NULL;
|
tsDnodeTmr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dnodeCleanupVnodes();
|
vnodeCleanupModule();
|
||||||
if (tsDnodeVnodesHash == NULL) {
|
|
||||||
taosCleanUpIntHash(tsDnodeVnodesHash);
|
|
||||||
tsDnodeVnodesHash = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void dnodeMgmt(SRpcMsg *pMsg) {
|
void dnodeMgmt(SRpcMsg *pMsg) {
|
||||||
|
@ -129,14 +107,6 @@ void dnodeMgmt(SRpcMsg *pMsg) {
|
||||||
rpcFreeCont(pMsg->pCont);
|
rpcFreeCont(pMsg->pCont);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *dnodeGetVnodeWworker(void *pVnode) {
|
|
||||||
return ((SVnodeObj *)pVnode)->wworker;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *dnodeGetVnodeRworker(void *pVnode) {
|
|
||||||
return ((SVnodeObj *)pVnode)->rworker;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t dnodeOpenVnodes() {
|
static int32_t dnodeOpenVnodes() {
|
||||||
DIR *dir = opendir(tsVnodeDir);
|
DIR *dir = opendir(tsVnodeDir);
|
||||||
if (dir == NULL) {
|
if (dir == NULL) {
|
||||||
|
@ -166,13 +136,6 @@ static int32_t dnodeOpenVnodes() {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef void (*CleanupFp)(char *);
|
|
||||||
static void dnodeCleanupVnodes() {
|
|
||||||
int32_t num = taosGetIntHashSize(tsDnodeVnodesHash);
|
|
||||||
taosCleanUpIntHashWithFp(tsDnodeVnodesHash, (CleanupFp)vnodeClose);
|
|
||||||
dPrint("dnode mgmt is closed, vnodes:%d", num);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t dnodeProcessCreateVnodeMsg(SRpcMsg *rpcMsg) {
|
static int32_t dnodeProcessCreateVnodeMsg(SRpcMsg *rpcMsg) {
|
||||||
|
|
||||||
SMDCreateVnodeMsg *pCreate = rpcMsg->pCont;
|
SMDCreateVnodeMsg *pCreate = rpcMsg->pCont;
|
||||||
|
@ -219,19 +182,6 @@ static int32_t dnodeProcessConfigDnodeMsg(SRpcMsg *pMsg) {
|
||||||
return tsCfgDynamicOptions(pCfg->config);
|
return tsCfgDynamicOptions(pCfg->config);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dnodeBuildVloadMsg(char *pNode, void * param) {
|
|
||||||
SVnodeObj *pVnode = (SVnodeObj *) pNode;
|
|
||||||
if (pVnode->status == TSDB_VN_STATUS_DELETING) return;
|
|
||||||
|
|
||||||
SDMStatusMsg *pStatus = param;
|
|
||||||
if (pStatus->openVnodes >= TSDB_MAX_VNODES) return;
|
|
||||||
|
|
||||||
SVnodeLoad *pLoad = &pStatus->load[pStatus->openVnodes++];
|
|
||||||
pLoad->vgId = htonl(pVnode->vgId);
|
|
||||||
pLoad->vnode = htonl(pVnode->vgId);
|
|
||||||
pLoad->status = pVnode->status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dnodeSendStatusMsg(void *handle, void *tmrId) {
|
static void dnodeSendStatusMsg(void *handle, void *tmrId) {
|
||||||
if (tsDnodeTmr == NULL) {
|
if (tsDnodeTmr == NULL) {
|
||||||
dError("dnode timer is already released");
|
dError("dnode timer is already released");
|
||||||
|
@ -263,7 +213,7 @@ static void dnodeSendStatusMsg(void *handle, void *tmrId) {
|
||||||
pStatus->diskAvailable = tsAvailDataDirGB;
|
pStatus->diskAvailable = tsAvailDataDirGB;
|
||||||
pStatus->alternativeRole = (uint8_t) tsAlternativeRole;
|
pStatus->alternativeRole = (uint8_t) tsAlternativeRole;
|
||||||
|
|
||||||
taosVisitIntHashWithFp(tsDnodeVnodesHash, dnodeBuildVloadMsg, pStatus);
|
vnodeBuildStatusMsg(pStatus);
|
||||||
contLen = sizeof(SDMStatusMsg) + pStatus->openVnodes * sizeof(SVnodeLoad);
|
contLen = sizeof(SDMStatusMsg) + pStatus->openVnodes * sizeof(SVnodeLoad);
|
||||||
pStatus->openVnodes = htons(pStatus->openVnodes);
|
pStatus->openVnodes = htons(pStatus->openVnodes);
|
||||||
|
|
||||||
|
|
|
@ -127,7 +127,7 @@ void dnodeRead(SRpcMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void *dnodeAllocateRqueue(void *pVnode) {
|
void *dnodeAllocateRqueue(void *pVnode) {
|
||||||
taos_queue *queue = taosOpenQueue(sizeof(SReadMsg));
|
taos_queue queue = taosOpenQueue();
|
||||||
if (queue == NULL) return NULL;
|
if (queue == NULL) return NULL;
|
||||||
|
|
||||||
taosAddIntoQset(readQset, queue, pVnode);
|
taosAddIntoQset(readQset, queue, pVnode);
|
||||||
|
@ -144,6 +144,8 @@ void *dnodeAllocateRqueue(void *pVnode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dTrace("pVnode:%p, queue:%p is allocated", pVnode, queue);
|
||||||
|
|
||||||
return queue;
|
return queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,7 @@ void dnodeWrite(SRpcMsg *pMsg) {
|
||||||
|
|
||||||
void *dnodeAllocateWqueue(void *pVnode) {
|
void *dnodeAllocateWqueue(void *pVnode) {
|
||||||
SWriteWorker *pWorker = wWorkerPool.writeWorker + wWorkerPool.nextId;
|
SWriteWorker *pWorker = wWorkerPool.writeWorker + wWorkerPool.nextId;
|
||||||
taos_queue *queue = taosOpenQueue();
|
void *queue = taosOpenQueue();
|
||||||
if (queue == NULL) return NULL;
|
if (queue == NULL) return NULL;
|
||||||
|
|
||||||
if (pWorker->qset == NULL) {
|
if (pWorker->qset == NULL) {
|
||||||
|
@ -129,7 +129,7 @@ void *dnodeAllocateWqueue(void *pVnode) {
|
||||||
wWorkerPool.nextId = (wWorkerPool.nextId + 1) % wWorkerPool.max;
|
wWorkerPool.nextId = (wWorkerPool.nextId + 1) % wWorkerPool.max;
|
||||||
}
|
}
|
||||||
|
|
||||||
dTrace("queue:%p is allocated for pVnode:%p", queue, pVnode);
|
dTrace("pVnode:%p, queue:%p is allocated", pVnode, queue);
|
||||||
|
|
||||||
return queue;
|
return queue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,6 @@ void *dnodeAllocateRqueue(void *pVnode);
|
||||||
void dnodeFreeRqueue(void *rqueue);
|
void dnodeFreeRqueue(void *rqueue);
|
||||||
void dnodeSendWriteResponse(void *pVnode, void *param, int32_t code);
|
void dnodeSendWriteResponse(void *pVnode, void *param, int32_t code);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -25,6 +25,9 @@ typedef struct {
|
||||||
void *rsp;
|
void *rsp;
|
||||||
} SRspRet;
|
} SRspRet;
|
||||||
|
|
||||||
|
int32_t vnodeInitModule();
|
||||||
|
void vnodeCleanupModule();
|
||||||
|
|
||||||
int32_t vnodeCreate(SMDCreateVnodeMsg *pVnodeCfg);
|
int32_t vnodeCreate(SMDCreateVnodeMsg *pVnodeCfg);
|
||||||
int32_t vnodeDrop(int32_t vgId);
|
int32_t vnodeDrop(int32_t vgId);
|
||||||
int32_t vnodeOpen(int32_t vnode, char *rootDir);
|
int32_t vnodeOpen(int32_t vnode, char *rootDir);
|
||||||
|
@ -39,6 +42,7 @@ void* vnodeGetWal(void *pVnode);
|
||||||
void* vnodeGetTsdb(void *pVnode);
|
void* vnodeGetTsdb(void *pVnode);
|
||||||
|
|
||||||
int32_t vnodeProcessWrite(void *pVnode, int qtype, SWalHead *pHead, void *item);
|
int32_t vnodeProcessWrite(void *pVnode, int qtype, SWalHead *pHead, void *item);
|
||||||
|
void vnodeBuildStatusMsg(void * param);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,7 +117,7 @@ int taosWriteQitem(taos_queue param, int type, void *item) {
|
||||||
queue->numOfItems++;
|
queue->numOfItems++;
|
||||||
if (queue->qset) atomic_add_fetch_32(&queue->qset->numOfItems, 1);
|
if (queue->qset) atomic_add_fetch_32(&queue->qset->numOfItems, 1);
|
||||||
|
|
||||||
//pTrace("item:%p is put into queue, items:%d", item, queue->numOfItems);
|
//pTrace("item:%p is put into queue, type:%d items:%d", item, type, queue->numOfItems);
|
||||||
|
|
||||||
pthread_mutex_unlock(&queue->mutex);
|
pthread_mutex_unlock(&queue->mutex);
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ int taosGetQitem(taos_qall param, int *type, void **pitem) {
|
||||||
*pitem = pNode->item;
|
*pitem = pNode->item;
|
||||||
*type = pNode->type;
|
*type = pNode->type;
|
||||||
num = 1;
|
num = 1;
|
||||||
//pTrace("item:%p is fetched", *pitem);
|
// pTrace("item:%p is fetched, type:%d", *pitem, *type);
|
||||||
}
|
}
|
||||||
|
|
||||||
return num;
|
return num;
|
||||||
|
|
|
@ -34,13 +34,13 @@ typedef struct {
|
||||||
EVnStatus status;
|
EVnStatus status;
|
||||||
int role;
|
int role;
|
||||||
int64_t version;
|
int64_t version;
|
||||||
void * wqueue;
|
void *wqueue;
|
||||||
void * rqueue;
|
void *rqueue;
|
||||||
void * wal;
|
void *wal;
|
||||||
void * tsdb;
|
void *tsdb;
|
||||||
void * sync;
|
void *sync;
|
||||||
void * events;
|
void *events;
|
||||||
void * cq; // continuous query
|
void *cq; // continuous query
|
||||||
} SVnodeObj;
|
} SVnodeObj;
|
||||||
|
|
||||||
int vnodeWriteToQueue(void *param, SWalHead *pHead, int type);
|
int vnodeWriteToQueue(void *param, SWalHead *pHead, int type);
|
||||||
|
|
|
@ -25,10 +25,32 @@
|
||||||
#include "ttime.h"
|
#include "ttime.h"
|
||||||
#include "ttimer.h"
|
#include "ttimer.h"
|
||||||
#include "twal.h"
|
#include "twal.h"
|
||||||
|
#include "dnode.h"
|
||||||
|
#include "vnode.h"
|
||||||
#include "vnodeInt.h"
|
#include "vnodeInt.h"
|
||||||
|
|
||||||
extern void *tsDnodeVnodesHash;
|
static void *tsDnodeVnodesHash;
|
||||||
static void vnodeCleanUp(SVnodeObj *pVnode);
|
static void vnodeCleanUp(SVnodeObj *pVnode);
|
||||||
|
static void vnodeBuildVloadMsg(char *pNode, void * param);
|
||||||
|
|
||||||
|
int32_t vnodeInitModule() {
|
||||||
|
|
||||||
|
vnodeInitWriteFp();
|
||||||
|
|
||||||
|
tsDnodeVnodesHash = taosInitIntHash(TSDB_MAX_VNODES, sizeof(SVnodeObj), taosHashInt);
|
||||||
|
if (tsDnodeVnodesHash == NULL) {
|
||||||
|
dError("failed to init vnode list");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef void (*CleanupFp)(char *);
|
||||||
|
void vnodeCleanupModule() {
|
||||||
|
taosCleanUpIntHashWithFp(tsDnodeVnodesHash, (CleanupFp)vnodeClose);
|
||||||
|
taosCleanUpIntHash(tsDnodeVnodesHash);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t vnodeCreate(SMDCreateVnodeMsg *pVnodeCfg) {
|
int32_t vnodeCreate(SMDCreateVnodeMsg *pVnodeCfg) {
|
||||||
int32_t code;
|
int32_t code;
|
||||||
|
@ -95,9 +117,6 @@ int32_t vnodeDrop(int32_t vgId) {
|
||||||
int32_t vnodeOpen(int32_t vnode, char *rootDir) {
|
int32_t vnodeOpen(int32_t vnode, char *rootDir) {
|
||||||
char temp[TSDB_FILENAME_LEN];
|
char temp[TSDB_FILENAME_LEN];
|
||||||
|
|
||||||
static pthread_once_t vnodeInitWrite = PTHREAD_ONCE_INIT;
|
|
||||||
pthread_once(&vnodeInitWrite, vnodeInitWriteFp);
|
|
||||||
|
|
||||||
SVnodeObj vnodeObj = {0};
|
SVnodeObj vnodeObj = {0};
|
||||||
vnodeObj.vgId = vnode;
|
vnodeObj.vgId = vnode;
|
||||||
vnodeObj.status = VN_STATUS_INIT;
|
vnodeObj.status = VN_STATUS_INIT;
|
||||||
|
@ -194,6 +213,24 @@ void *vnodeGetTsdb(void *pVnode) {
|
||||||
return ((SVnodeObj *)pVnode)->tsdb;
|
return ((SVnodeObj *)pVnode)->tsdb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vnodeBuildStatusMsg(void *param) {
|
||||||
|
SDMStatusMsg *pStatus = param;
|
||||||
|
taosVisitIntHashWithFp(tsDnodeVnodesHash, vnodeBuildVloadMsg, pStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void vnodeBuildVloadMsg(char *pNode, void * param) {
|
||||||
|
SVnodeObj *pVnode = (SVnodeObj *) pNode;
|
||||||
|
if (pVnode->status == VN_STATUS_DELETING) return;
|
||||||
|
|
||||||
|
SDMStatusMsg *pStatus = param;
|
||||||
|
if (pStatus->openVnodes >= TSDB_MAX_VNODES) return;
|
||||||
|
|
||||||
|
SVnodeLoad *pLoad = &pStatus->load[pStatus->openVnodes++];
|
||||||
|
pLoad->vgId = htonl(pVnode->vgId);
|
||||||
|
pLoad->vnode = htonl(pVnode->vgId);
|
||||||
|
pLoad->status = pVnode->status;
|
||||||
|
}
|
||||||
|
|
||||||
static void vnodeCleanUp(SVnodeObj *pVnode) {
|
static void vnodeCleanUp(SVnodeObj *pVnode) {
|
||||||
taosDeleteIntHash(tsDnodeVnodesHash, pVnode->vgId);
|
taosDeleteIntHash(tsDnodeVnodesHash, pVnode->vgId);
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#include "vnode.h"
|
#include "vnode.h"
|
||||||
#include "vnodeInt.h"
|
#include "vnodeInt.h"
|
||||||
|
|
||||||
static int32_t (*vnodeProcessWriteMsgFp[TSDB_MSG_TYPE_MAX])(SVnodeObj *, void *, void*);
|
static int32_t (*vnodeProcessWriteMsgFp[TSDB_MSG_TYPE_MAX])(SVnodeObj *, void *, SRspRet *);
|
||||||
static int32_t vnodeProcessSubmitMsg(SVnodeObj *pVnode, void *pMsg, SRspRet *);
|
static int32_t vnodeProcessSubmitMsg(SVnodeObj *pVnode, void *pMsg, SRspRet *);
|
||||||
static int32_t vnodeProcessCreateTableMsg(SVnodeObj *pVnode, void *pMsg, SRspRet *);
|
static int32_t vnodeProcessCreateTableMsg(SVnodeObj *pVnode, void *pMsg, SRspRet *);
|
||||||
static int32_t vnodeProcessDropTableMsg(SVnodeObj *pVnode, void *pMsg, SRspRet *);
|
static int32_t vnodeProcessDropTableMsg(SVnodeObj *pVnode, void *pMsg, SRspRet *);
|
||||||
|
|
|
@ -284,7 +284,7 @@ static int walRestoreWalFile(char *name, void *pVnode, int (*writeFp)(void *, SW
|
||||||
}
|
}
|
||||||
|
|
||||||
// write into queue
|
// write into queue
|
||||||
(*writeFp)(pVnode, buffer, TAOS_QTYPE_WAL);
|
(*writeFp)(pVnode, pHead, TAOS_QTYPE_WAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
Loading…
Reference in New Issue