[td-11818] merge 3.0
This commit is contained in:
commit
2d0b84c8d1
|
@ -1232,6 +1232,12 @@ typedef struct {
|
||||||
char data[];
|
char data[];
|
||||||
} SVShowTablesFetchRsp;
|
} SVShowTablesFetchRsp;
|
||||||
|
|
||||||
|
typedef struct SMqCMGetSubEpReq {
|
||||||
|
int64_t consumerId;
|
||||||
|
int32_t epoch;
|
||||||
|
char cgroup[TSDB_CONSUMER_GROUP_LEN];
|
||||||
|
} SMqCMGetSubEpReq;
|
||||||
|
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tEncodeSMsgHead(void** buf, const SMsgHead* pMsg) {
|
static FORCE_INLINE int32_t tEncodeSMsgHead(void** buf, const SMsgHead* pMsg) {
|
||||||
|
@ -1518,9 +1524,7 @@ typedef struct SMqSetCVgReq {
|
||||||
char* sql;
|
char* sql;
|
||||||
char* logicalPlan;
|
char* logicalPlan;
|
||||||
char* physicalPlan;
|
char* physicalPlan;
|
||||||
uint32_t qmsgLen;
|
char* qmsg;
|
||||||
void* qmsg;
|
|
||||||
//SSubQueryMsg msg;
|
|
||||||
} SMqSetCVgReq;
|
} SMqSetCVgReq;
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tEncodeSSubQueryMsg(void** buf, const SSubQueryMsg* pMsg) {
|
static FORCE_INLINE int32_t tEncodeSSubQueryMsg(void** buf, const SSubQueryMsg* pMsg) {
|
||||||
|
@ -1552,8 +1556,7 @@ static FORCE_INLINE int32_t tEncodeSMqSetCVgReq(void** buf, const SMqSetCVgReq*
|
||||||
tlen += taosEncodeString(buf, pReq->sql);
|
tlen += taosEncodeString(buf, pReq->sql);
|
||||||
tlen += taosEncodeString(buf, pReq->logicalPlan);
|
tlen += taosEncodeString(buf, pReq->logicalPlan);
|
||||||
tlen += taosEncodeString(buf, pReq->physicalPlan);
|
tlen += taosEncodeString(buf, pReq->physicalPlan);
|
||||||
tlen += taosEncodeFixedU32(buf, pReq->qmsgLen);
|
tlen += taosEncodeString(buf, (char*)pReq->qmsg);
|
||||||
tlen += taosEncodeBinary(buf, pReq->qmsg, pReq->qmsgLen);
|
|
||||||
//tlen += tEncodeSSubQueryMsg(buf, &pReq->msg);
|
//tlen += tEncodeSSubQueryMsg(buf, &pReq->msg);
|
||||||
return tlen;
|
return tlen;
|
||||||
}
|
}
|
||||||
|
@ -1567,8 +1570,7 @@ static FORCE_INLINE void* tDecodeSMqSetCVgReq(void* buf, SMqSetCVgReq* pReq) {
|
||||||
buf = taosDecodeString(buf, &pReq->sql);
|
buf = taosDecodeString(buf, &pReq->sql);
|
||||||
buf = taosDecodeString(buf, &pReq->logicalPlan);
|
buf = taosDecodeString(buf, &pReq->logicalPlan);
|
||||||
buf = taosDecodeString(buf, &pReq->physicalPlan);
|
buf = taosDecodeString(buf, &pReq->physicalPlan);
|
||||||
buf = taosDecodeFixedU32(buf, &pReq->qmsgLen);
|
buf = taosDecodeString(buf, (char**)&pReq->qmsg);
|
||||||
buf = taosDecodeBinary(buf, &pReq->qmsg, pReq->qmsgLen);
|
|
||||||
//buf = tDecodeSSubQueryMsg(buf, &pReq->msg);
|
//buf = tDecodeSSubQueryMsg(buf, &pReq->msg);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
@ -1585,14 +1587,12 @@ typedef struct SMqColData {
|
||||||
int16_t colId;
|
int16_t colId;
|
||||||
int16_t type;
|
int16_t type;
|
||||||
int16_t bytes;
|
int16_t bytes;
|
||||||
char data[];
|
} SMqColMeta;
|
||||||
} SMqColData;
|
|
||||||
|
|
||||||
typedef struct SMqTbData {
|
typedef struct SMqTbData {
|
||||||
int64_t uid;
|
int64_t uid;
|
||||||
int32_t numOfCols;
|
|
||||||
int32_t numOfRows;
|
int32_t numOfRows;
|
||||||
SMqColData colData[];
|
char colData[];
|
||||||
} SMqTbData;
|
} SMqTbData;
|
||||||
|
|
||||||
typedef struct SMqTopicBlk {
|
typedef struct SMqTopicBlk {
|
||||||
|
@ -1603,19 +1603,25 @@ typedef struct SMqTopicBlk {
|
||||||
int32_t skipLogNum;
|
int32_t skipLogNum;
|
||||||
int32_t bodyLen;
|
int32_t bodyLen;
|
||||||
int32_t numOfTb;
|
int32_t numOfTb;
|
||||||
SMqTbData tbData[];
|
SMqTbData* tbData;
|
||||||
} SMqTopicData;
|
} SMqTopicData;
|
||||||
|
|
||||||
typedef struct SMqConsumeRsp {
|
typedef struct SMqConsumeRsp {
|
||||||
int64_t reqId;
|
|
||||||
int64_t consumerId;
|
int64_t consumerId;
|
||||||
int32_t bodyLen;
|
int32_t numOfCols;
|
||||||
|
SMqColMeta* meta;
|
||||||
int32_t numOfTopics;
|
int32_t numOfTopics;
|
||||||
SMqTopicData data[];
|
SMqTopicData* data;
|
||||||
} SMqConsumeRsp;
|
} SMqConsumeRsp;
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tEncodeSMqConsumeRsp(void** buf, const SMqConsumeRsp* pRsp) {
|
||||||
|
int32_t tlen = 0;
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
// one req for one vg+topic
|
// one req for one vg+topic
|
||||||
typedef struct SMqConsumeReq {
|
typedef struct SMqConsumeReq {
|
||||||
|
SMsgHead head;
|
||||||
//0: commit only, current offset
|
//0: commit only, current offset
|
||||||
//1: consume only, poll next offset
|
//1: consume only, poll next offset
|
||||||
//2: commit current and consume next offset
|
//2: commit current and consume next offset
|
||||||
|
@ -1630,6 +1636,92 @@ typedef struct SMqConsumeReq {
|
||||||
char topic[TSDB_TOPIC_FNAME_LEN];
|
char topic[TSDB_TOPIC_FNAME_LEN];
|
||||||
} SMqConsumeReq;
|
} SMqConsumeReq;
|
||||||
|
|
||||||
|
typedef struct SMqSubVgEp {
|
||||||
|
int32_t vgId;
|
||||||
|
SEpSet epSet;
|
||||||
|
} SMqSubVgEp;
|
||||||
|
|
||||||
|
typedef struct SMqSubTopicEp {
|
||||||
|
char topic[TSDB_TOPIC_FNAME_LEN];
|
||||||
|
SArray* vgs; // SArray<SMqSubVgEp>
|
||||||
|
} SMqSubTopicEp;
|
||||||
|
|
||||||
|
typedef struct SMqCMGetSubEpRsp {
|
||||||
|
int64_t consumerId;
|
||||||
|
char cgroup[TSDB_CONSUMER_GROUP_LEN];
|
||||||
|
SArray* topics; // SArray<SMqSubTopicEp>
|
||||||
|
} SMqCMGetSubEpRsp;
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tEncodeSMqSubVgEp(void** buf, const SMqSubVgEp* pVgEp) {
|
||||||
|
int32_t tlen = 0;
|
||||||
|
tlen += taosEncodeFixedI32(buf, pVgEp->vgId);
|
||||||
|
tlen += taosEncodeSEpSet(buf, &pVgEp->epSet);
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void* tDecodeSMqSubVgEp(void* buf, SMqSubVgEp* pVgEp) {
|
||||||
|
buf = taosDecodeFixedI32(buf, &pVgEp->vgId);
|
||||||
|
buf = taosDecodeSEpSet(buf, &pVgEp->epSet);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tEncodeSMqSubTopicEp(void** buf, const SMqSubTopicEp* pTopicEp) {
|
||||||
|
int32_t tlen = 0;
|
||||||
|
tlen += taosEncodeString(buf, pTopicEp->topic);
|
||||||
|
int32_t sz = taosArrayGetSize(pTopicEp->vgs);
|
||||||
|
tlen += taosEncodeFixedI32(buf, sz);
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
SMqSubVgEp* pVgEp = (SMqSubVgEp*)taosArrayGet(pTopicEp->vgs, i);
|
||||||
|
tlen += tEncodeSMqSubVgEp(buf, pVgEp);
|
||||||
|
}
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void* tDecodeSMqSubTopicEp(void* buf, SMqSubTopicEp* pTopicEp) {
|
||||||
|
buf = taosDecodeStringTo(buf, pTopicEp->topic);
|
||||||
|
int32_t sz;
|
||||||
|
buf = taosDecodeFixedI32(buf, &sz);
|
||||||
|
pTopicEp->vgs = taosArrayInit(sz, sizeof(SMqSubVgEp));
|
||||||
|
if (pTopicEp->vgs == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
SMqSubVgEp vgEp;
|
||||||
|
buf = tDecodeSMqSubVgEp(buf, &vgEp);
|
||||||
|
taosArrayPush(pTopicEp->vgs, &vgEp);
|
||||||
|
}
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tEncodeSMqCMGetSubEpRsp(void** buf, const SMqCMGetSubEpRsp* pRsp) {
|
||||||
|
int32_t tlen = 0;
|
||||||
|
tlen += taosEncodeFixedI64(buf, pRsp->consumerId);
|
||||||
|
tlen += taosEncodeString(buf, pRsp->cgroup);
|
||||||
|
int32_t sz = taosArrayGetSize(pRsp->topics);
|
||||||
|
tlen += taosEncodeFixedI32(buf, sz);
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
SMqSubTopicEp* pVgEp = (SMqSubTopicEp*)taosArrayGet(pRsp->topics, i);
|
||||||
|
tlen += tEncodeSMqSubTopicEp(buf, pVgEp);
|
||||||
|
}
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void* tDecodeSMqCMGetSubEpRsp(void* buf, SMqCMGetSubEpRsp* pRsp) {
|
||||||
|
buf = taosDecodeFixedI64(buf, &pRsp->consumerId);
|
||||||
|
buf = taosDecodeStringTo(buf, pRsp->cgroup);
|
||||||
|
int32_t sz;
|
||||||
|
buf = taosDecodeFixedI32(buf, &sz);
|
||||||
|
pRsp->topics = taosArrayInit(sz, sizeof(SMqSubTopicEp));
|
||||||
|
if (pRsp->topics == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
SMqSubTopicEp topicEp;
|
||||||
|
buf = tDecodeSMqSubTopicEp(buf, &topicEp);
|
||||||
|
taosArrayPush(pRsp->topics, &topicEp);
|
||||||
|
}
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,6 +140,7 @@ enum {
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_ALTER_TOPIC, "mnode-alter-topic", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_ALTER_TOPIC, "mnode-alter-topic", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_DROP_TOPIC, "mnode-drop-topic", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_DROP_TOPIC, "mnode-drop-topic", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_SUBSCRIBE, "mnode-subscribe", SCMSubscribeReq, SCMSubscribeRsp)
|
TD_DEF_MSG_TYPE(TDMT_MND_SUBSCRIBE, "mnode-subscribe", SCMSubscribeReq, SCMSubscribeRsp)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_MND_GET_SUB_EP, "mnode-get-sub-ep", SMqCMGetSubEpReq, SMqCMGetSubEpRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_MQ_TIMER, "mnode-timer", SMqTmrMsg, SMqTmrMsg)
|
TD_DEF_MSG_TYPE(TDMT_MND_MQ_TIMER, "mnode-timer", SMqTmrMsg, SMqTmrMsg)
|
||||||
|
|
||||||
// Requests handled by VNODE
|
// Requests handled by VNODE
|
||||||
|
|
|
@ -24,6 +24,7 @@ extern "C" {
|
||||||
|
|
||||||
typedef void* qTaskInfo_t;
|
typedef void* qTaskInfo_t;
|
||||||
typedef void* DataSinkHandle;
|
typedef void* DataSinkHandle;
|
||||||
|
struct SRpcMsg;
|
||||||
struct SSubplan;
|
struct SSubplan;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -208,6 +209,8 @@ void** qReleaseTask(void* pMgmt, void* pQInfo, bool freeHandle);
|
||||||
*/
|
*/
|
||||||
void** qDeregisterQInfo(void* pMgmt, void* pQInfo);
|
void** qDeregisterQInfo(void* pMgmt, void* pQInfo);
|
||||||
|
|
||||||
|
void qProcessFetchRsp(void* parent, struct SRpcMsg* pMsg, struct SEpSet* pEpSet);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -49,9 +49,10 @@ typedef struct {
|
||||||
} SQWorkerStat;
|
} SQWorkerStat;
|
||||||
|
|
||||||
typedef int32_t (*putReqToQueryQFp)(void *, struct SRpcMsg *);
|
typedef int32_t (*putReqToQueryQFp)(void *, struct SRpcMsg *);
|
||||||
|
typedef int32_t (*sendReqToDnodeFp)(void *, struct SEpSet *, struct SRpcMsg *);
|
||||||
|
|
||||||
|
int32_t qWorkerInit(int8_t nodeType, int32_t nodeId, SQWorkerCfg *cfg, void **qWorkerMgmt, void *nodeObj,
|
||||||
int32_t qWorkerInit(int8_t nodeType, int32_t nodeId, SQWorkerCfg *cfg, void **qWorkerMgmt, void *nodeObj, putReqToQueryQFp fp);
|
putReqToQueryQFp fp1, sendReqToDnodeFp fp2);
|
||||||
|
|
||||||
int32_t qWorkerProcessQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
int32_t qWorkerProcessQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
||||||
|
@ -65,6 +66,8 @@ int32_t qWorkerProcessStatusMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
||||||
int32_t qWorkerProcessFetchMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
int32_t qWorkerProcessFetchMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
||||||
|
int32_t qWorkerProcessFetchRsp(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
||||||
int32_t qWorkerProcessCancelMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
int32_t qWorkerProcessCancelMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
||||||
int32_t qWorkerProcessDropMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
int32_t qWorkerProcessDropMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
|
#include "tmsg.h"
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
@ -159,7 +160,7 @@ int32_t walAlter(SWal *, SWalCfg *pCfg);
|
||||||
void walClose(SWal *);
|
void walClose(SWal *);
|
||||||
|
|
||||||
// write
|
// write
|
||||||
int64_t walWrite(SWal *, int64_t index, uint8_t msgType, const void *body, int32_t bodyLen);
|
int64_t walWrite(SWal *, int64_t index, tmsg_t msgType, const void *body, int32_t bodyLen);
|
||||||
void walFsync(SWal *, bool force);
|
void walFsync(SWal *, bool force);
|
||||||
|
|
||||||
// apis for lifecycle management
|
// apis for lifecycle management
|
||||||
|
|
|
@ -253,6 +253,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_MND_INVALID_TOPIC_OPTION TAOS_DEF_ERROR_CODE(0, 0x03E4)
|
#define TSDB_CODE_MND_INVALID_TOPIC_OPTION TAOS_DEF_ERROR_CODE(0, 0x03E4)
|
||||||
#define TSDB_CODE_MND_TOPIC_OPTION_UNCHNAGED TAOS_DEF_ERROR_CODE(0, 0x03E5)
|
#define TSDB_CODE_MND_TOPIC_OPTION_UNCHNAGED TAOS_DEF_ERROR_CODE(0, 0x03E5)
|
||||||
#define TSDB_CODE_MND_NAME_CONFLICT_WITH_STB TAOS_DEF_ERROR_CODE(0, 0x03E6)
|
#define TSDB_CODE_MND_NAME_CONFLICT_WITH_STB TAOS_DEF_ERROR_CODE(0, 0x03E6)
|
||||||
|
#define TSDB_CODE_MND_CONSUMER_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x03E7)
|
||||||
|
|
||||||
// dnode
|
// dnode
|
||||||
#define TSDB_CODE_DND_ACTION_IN_PROGRESS TAOS_DEF_ERROR_CODE(0, 0x0400)
|
#define TSDB_CODE_DND_ACTION_IN_PROGRESS TAOS_DEF_ERROR_CODE(0, 0x0400)
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#ifndef _TD_UTIL_QUEUE_H
|
#ifndef _TD_UTIL_QUEUE_H
|
||||||
#define _TD_UTIL_QUEUE_H
|
#define _TD_UTIL_QUEUE_H
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -40,12 +41,12 @@ shall be used to set up the protection.
|
||||||
typedef struct STaosQueue STaosQueue;
|
typedef struct STaosQueue STaosQueue;
|
||||||
typedef struct STaosQset STaosQset;
|
typedef struct STaosQset STaosQset;
|
||||||
typedef struct STaosQall STaosQall;
|
typedef struct STaosQall STaosQall;
|
||||||
typedef void (*FProcessItem)(void *ahandle, void *pItem);
|
typedef void (*FItem)(void *ahandle, void *pItem);
|
||||||
typedef void (*FProcessItems)(void *ahandle, STaosQall *qall, int32_t numOfItems);
|
typedef void (*FItems)(void *ahandle, STaosQall *qall, int32_t numOfItems);
|
||||||
|
|
||||||
STaosQueue *taosOpenQueue();
|
STaosQueue *taosOpenQueue();
|
||||||
void taosCloseQueue(STaosQueue *queue);
|
void taosCloseQueue(STaosQueue *queue);
|
||||||
void taosSetQueueFp(STaosQueue *queue, FProcessItem itemFp, FProcessItems itemsFp);
|
void taosSetQueueFp(STaosQueue *queue, FItem itemFp, FItems itemsFp);
|
||||||
void * taosAllocateQitem(int32_t size);
|
void * taosAllocateQitem(int32_t size);
|
||||||
void taosFreeQitem(void *pItem);
|
void taosFreeQitem(void *pItem);
|
||||||
int32_t taosWriteQitem(STaosQueue *queue, void *pItem);
|
int32_t taosWriteQitem(STaosQueue *queue, void *pItem);
|
||||||
|
@ -66,8 +67,11 @@ int32_t taosAddIntoQset(STaosQset *qset, STaosQueue *queue, void *ahandle);
|
||||||
void taosRemoveFromQset(STaosQset *qset, STaosQueue *queue);
|
void taosRemoveFromQset(STaosQset *qset, STaosQueue *queue);
|
||||||
int32_t taosGetQueueNumber(STaosQset *qset);
|
int32_t taosGetQueueNumber(STaosQset *qset);
|
||||||
|
|
||||||
int32_t taosReadQitemFromQset(STaosQset *qset, void **ppItem, void **ahandle, FProcessItem *itemFp);
|
int32_t taosReadQitemFromQset(STaosQset *qset, void **ppItem, void **ahandle, FItem *itemFp);
|
||||||
int32_t taosReadAllQitemsFromQset(STaosQset *qset, STaosQall *qall, void **ahandle, FProcessItems *itemsFp);
|
int32_t taosReadAllQitemsFromQset(STaosQset *qset, STaosQall *qall, void **ahandle, FItems *itemsFp);
|
||||||
|
|
||||||
|
int32_t taosReadQitemFromQsetByThread(STaosQset *qset, void **ppItem, void **ahandle, FItem *itemFp, int32_t threadId);
|
||||||
|
void taosResetQsetThread(STaosQset *qset, void *pItem);
|
||||||
|
|
||||||
int32_t taosGetQueueItemsNumber(STaosQueue *queue);
|
int32_t taosGetQueueItemsNumber(STaosQueue *queue);
|
||||||
int32_t taosGetQsetItemsNumber(STaosQset *qset);
|
int32_t taosGetQsetItemsNumber(STaosQset *qset);
|
||||||
|
|
|
@ -15,57 +15,61 @@
|
||||||
|
|
||||||
#ifndef _TD_UTIL_WORKER_H
|
#ifndef _TD_UTIL_WORKER_H
|
||||||
#define _TD_UTIL_WORKER_H
|
#define _TD_UTIL_WORKER_H
|
||||||
|
|
||||||
#include "tqueue.h"
|
#include "tqueue.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct SWorkerPool SWorkerPool;
|
typedef struct SQWorkerPool SQWorkerPool;
|
||||||
typedef struct SMWorkerPool SMWorkerPool;
|
typedef struct SWWorkerPool SWWorkerPool;
|
||||||
|
|
||||||
typedef struct SWorker {
|
typedef struct SQWorker {
|
||||||
int32_t id; // worker ID
|
int32_t id; // worker ID
|
||||||
pthread_t thread; // thread
|
pthread_t thread; // thread
|
||||||
SWorkerPool *pool;
|
SQWorkerPool *pool;
|
||||||
} SWorker;
|
} SQWorker, SFWorker;
|
||||||
|
|
||||||
typedef struct SWorkerPool {
|
typedef struct SQWorkerPool {
|
||||||
int32_t max; // max number of workers
|
int32_t max; // max number of workers
|
||||||
int32_t min; // min number of workers
|
int32_t min; // min number of workers
|
||||||
int32_t num; // current number of workers
|
int32_t num; // current number of workers
|
||||||
STaosQset * qset;
|
STaosQset * qset;
|
||||||
const char * name;
|
const char * name;
|
||||||
SWorker *workers;
|
SQWorker * workers;
|
||||||
pthread_mutex_t mutex;
|
pthread_mutex_t mutex;
|
||||||
} SWorkerPool;
|
} SQWorkerPool, SFWorkerPool;
|
||||||
|
|
||||||
typedef struct SMWorker {
|
typedef struct SWWorker {
|
||||||
int32_t id; // worker id
|
int32_t id; // worker id
|
||||||
pthread_t thread; // thread
|
pthread_t thread; // thread
|
||||||
STaosQall * qall;
|
STaosQall * qall;
|
||||||
STaosQset * qset; // queue set
|
STaosQset * qset; // queue set
|
||||||
SMWorkerPool *pool;
|
SWWorkerPool *pool;
|
||||||
} SMWorker;
|
} SWWorker;
|
||||||
|
|
||||||
typedef struct SMWorkerPool {
|
typedef struct SWWorkerPool {
|
||||||
int32_t max; // max number of workers
|
int32_t max; // max number of workers
|
||||||
int32_t nextId; // from 0 to max-1, cyclic
|
int32_t nextId; // from 0 to max-1, cyclic
|
||||||
const char * name;
|
const char * name;
|
||||||
SMWorker *workers;
|
SWWorker * workers;
|
||||||
pthread_mutex_t mutex;
|
pthread_mutex_t mutex;
|
||||||
} SMWorkerPool;
|
} SWWorkerPool;
|
||||||
|
|
||||||
int32_t tWorkerInit(SWorkerPool *pool);
|
int32_t tQWorkerInit(SQWorkerPool *pool);
|
||||||
void tWorkerCleanup(SWorkerPool *pool);
|
void tQWorkerCleanup(SQWorkerPool *pool);
|
||||||
STaosQueue *tWorkerAllocQueue(SWorkerPool *pool, void *ahandle, FProcessItem fp);
|
STaosQueue *tQWorkerAllocQueue(SQWorkerPool *pool, void *ahandle, FItem fp);
|
||||||
void tWorkerFreeQueue(SWorkerPool *pool, STaosQueue *queue);
|
void tQWorkerFreeQueue(SQWorkerPool *pool, STaosQueue *queue);
|
||||||
|
|
||||||
int32_t tMWorkerInit(SMWorkerPool *pool);
|
int32_t tFWorkerInit(SFWorkerPool *pool);
|
||||||
void tMWorkerCleanup(SMWorkerPool *pool);
|
void tFWorkerCleanup(SFWorkerPool *pool);
|
||||||
STaosQueue *tMWorkerAllocQueue(SMWorkerPool *pool, void *ahandle, FProcessItems fp);
|
STaosQueue *tFWorkerAllocQueue(SFWorkerPool *pool, void *ahandle, FItem fp);
|
||||||
void tMWorkerFreeQueue(SMWorkerPool *pool, STaosQueue *queue);
|
void tFWorkerFreeQueue(SFWorkerPool *pool, STaosQueue *queue);
|
||||||
|
|
||||||
|
int32_t tWWorkerInit(SWWorkerPool *pool);
|
||||||
|
void tWWorkerCleanup(SWWorkerPool *pool);
|
||||||
|
STaosQueue *tWWorkerAllocQueue(SWWorkerPool *pool, void *ahandle, FItems fp);
|
||||||
|
void tWWorkerFreeQueue(SWWorkerPool *pool, STaosQueue *queue);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -263,7 +263,7 @@ int32_t scheduleQuery(SRequestObj* pRequest, SQueryDag* pDag, SArray* pNodeList)
|
||||||
|
|
||||||
typedef struct SMqClientVg {
|
typedef struct SMqClientVg {
|
||||||
// statistics
|
// statistics
|
||||||
int64_t consumeCnt;
|
int64_t pollCnt;
|
||||||
// offset
|
// offset
|
||||||
int64_t committedOffset;
|
int64_t committedOffset;
|
||||||
int64_t currentOffset;
|
int64_t currentOffset;
|
||||||
|
@ -328,6 +328,7 @@ struct tmq_t {
|
||||||
char clientId[256];
|
char clientId[256];
|
||||||
int64_t consumerId;
|
int64_t consumerId;
|
||||||
int64_t status;
|
int64_t status;
|
||||||
|
tsem_t rspSem;
|
||||||
STscObj* pTscObj;
|
STscObj* pTscObj;
|
||||||
tmq_commit_cb* commit_cb;
|
tmq_commit_cb* commit_cb;
|
||||||
int32_t nextTopicIdx;
|
int32_t nextTopicIdx;
|
||||||
|
@ -344,7 +345,9 @@ tmq_t* taos_consumer_new(void* conn, tmq_conf_t* conf, char* errstr, int32_t err
|
||||||
strcpy(pTmq->clientId, conf->clientId);
|
strcpy(pTmq->clientId, conf->clientId);
|
||||||
strcpy(pTmq->groupId, conf->groupId);
|
strcpy(pTmq->groupId, conf->groupId);
|
||||||
pTmq->commit_cb = conf->commit_cb;
|
pTmq->commit_cb = conf->commit_cb;
|
||||||
|
tsem_init(&pTmq->rspSem, 0, 0);
|
||||||
pTmq->consumerId = generateRequestId() & ((uint64_t)-1 >> 1);
|
pTmq->consumerId = generateRequestId() & ((uint64_t)-1 >> 1);
|
||||||
|
pTmq->clientTopics = taosArrayInit(0, sizeof(SMqClientTopic));
|
||||||
return pTmq;
|
return pTmq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -371,11 +374,27 @@ int32_t tmq_list_append(tmq_list_t* ptr, char* src) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t tmq_null_cb(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
|
if (code == 0) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
//
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
TAOS_RES* tmq_subscribe(tmq_t* tmq, tmq_list_t* topic_list) {
|
TAOS_RES* tmq_subscribe(tmq_t* tmq, tmq_list_t* topic_list) {
|
||||||
SRequestObj *pRequest = NULL;
|
SRequestObj *pRequest = NULL;
|
||||||
tmq->status = 1;
|
|
||||||
int32_t sz = topic_list->cnt;
|
int32_t sz = topic_list->cnt;
|
||||||
tmq->clientTopics = taosArrayInit(sz, sizeof(void*));
|
//destroy ex
|
||||||
|
taosArrayDestroy(tmq->clientTopics);
|
||||||
|
tmq->clientTopics = taosArrayInit(sz, sizeof(SMqClientTopic));
|
||||||
|
|
||||||
|
SCMSubscribeReq req;
|
||||||
|
req.topicNum = sz;
|
||||||
|
req.consumerId = tmq->consumerId;
|
||||||
|
req.consumerGroup = strdup(tmq->groupId);
|
||||||
|
req.topicNames = taosArrayInit(sz, sizeof(void*));
|
||||||
|
|
||||||
for (int i = 0; i < sz; i++) {
|
for (int i = 0; i < sz; i++) {
|
||||||
char* topicName = topic_list->elems[i];
|
char* topicName = topic_list->elems[i];
|
||||||
|
|
||||||
|
@ -390,16 +409,21 @@ TAOS_RES* tmq_subscribe(tmq_t* tmq, tmq_list_t* topic_list) {
|
||||||
}
|
}
|
||||||
tNameExtractFullName(&name, topicFname);
|
tNameExtractFullName(&name, topicFname);
|
||||||
tscDebug("subscribe topic: %s", topicFname);
|
tscDebug("subscribe topic: %s", topicFname);
|
||||||
taosArrayPush(tmq->clientTopics, &topicFname);
|
SMqClientTopic topic = {
|
||||||
|
.nextVgIdx = 0,
|
||||||
|
.sql = NULL,
|
||||||
|
.sqlLen = 0,
|
||||||
|
.topicId = 0,
|
||||||
|
.topicName = topicFname,
|
||||||
|
.vgs = NULL
|
||||||
|
};
|
||||||
|
topic.vgs = taosArrayInit(0, sizeof(SMqClientVg));
|
||||||
|
taosArrayPush(tmq->clientTopics, &topic);
|
||||||
/*SMqClientTopic topic = {*/
|
/*SMqClientTopic topic = {*/
|
||||||
/*.*/
|
/*.*/
|
||||||
/*};*/
|
/*};*/
|
||||||
|
taosArrayPush(req.topicNames, &topicFname);
|
||||||
}
|
}
|
||||||
SCMSubscribeReq req;
|
|
||||||
req.topicNum = taosArrayGetSize(tmq->clientTopics);
|
|
||||||
req.consumerId = tmq->consumerId;
|
|
||||||
req.consumerGroup = strdup(tmq->groupId);
|
|
||||||
req.topicNames = tmq->clientTopics;
|
|
||||||
|
|
||||||
int tlen = tSerializeSCMSubscribeReq(NULL, &req);
|
int tlen = tSerializeSCMSubscribeReq(NULL, &req);
|
||||||
void* buf = malloc(tlen);
|
void* buf = malloc(tlen);
|
||||||
|
@ -411,26 +435,26 @@ TAOS_RES* tmq_subscribe(tmq_t* tmq, tmq_list_t* topic_list) {
|
||||||
tSerializeSCMSubscribeReq(&abuf, &req);
|
tSerializeSCMSubscribeReq(&abuf, &req);
|
||||||
/*printf("formatted: %s\n", dagStr);*/
|
/*printf("formatted: %s\n", dagStr);*/
|
||||||
|
|
||||||
pRequest = createRequest(tmq->pTscObj, NULL, NULL, TSDB_SQL_SELECT);
|
pRequest = createRequest(tmq->pTscObj, NULL, NULL, TDMT_MND_SUBSCRIBE);
|
||||||
if (pRequest == NULL) {
|
if (pRequest == NULL) {
|
||||||
tscError("failed to malloc sqlObj");
|
tscError("failed to malloc sqlObj");
|
||||||
}
|
}
|
||||||
|
|
||||||
pRequest->body.requestMsg = (SDataBuf){ .pData = buf, .len = tlen };
|
pRequest->body.requestMsg = (SDataBuf){ .pData = buf, .len = tlen };
|
||||||
pRequest->type = TDMT_MND_SUBSCRIBE;
|
|
||||||
|
|
||||||
SMsgSendInfo* body = buildMsgInfoImpl(pRequest);
|
SMsgSendInfo* sendInfo = buildMsgInfoImpl(pRequest);
|
||||||
|
/*sendInfo->fp*/
|
||||||
SEpSet epSet = getEpSet_s(&tmq->pTscObj->pAppInfo->mgmtEp);
|
SEpSet epSet = getEpSet_s(&tmq->pTscObj->pAppInfo->mgmtEp);
|
||||||
|
|
||||||
int64_t transporterId = 0;
|
int64_t transporterId = 0;
|
||||||
asyncSendMsgToServer(tmq->pTscObj->pAppInfo->pTransporter, &epSet, &transporterId, body);
|
asyncSendMsgToServer(tmq->pTscObj->pAppInfo->pTransporter, &epSet, &transporterId, sendInfo);
|
||||||
|
|
||||||
tsem_wait(&pRequest->body.rspSem);
|
tsem_wait(&pRequest->body.rspSem);
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
if (body != NULL) {
|
/*if (sendInfo != NULL) {*/
|
||||||
destroySendMsgInfo(body);
|
/*destroySendMsgInfo(sendInfo);*/
|
||||||
}
|
/*}*/
|
||||||
|
|
||||||
if (pRequest != NULL && terrno != TSDB_CODE_SUCCESS) {
|
if (pRequest != NULL && terrno != TSDB_CODE_SUCCESS) {
|
||||||
pRequest->code = terrno;
|
pRequest->code = terrno;
|
||||||
|
@ -569,19 +593,19 @@ TAOS_RES *taos_create_topic(TAOS* taos, const char* topicName, const char* sql,
|
||||||
pRequest->body.requestMsg = (SDataBuf){ .pData = buf, .len = tlen };
|
pRequest->body.requestMsg = (SDataBuf){ .pData = buf, .len = tlen };
|
||||||
pRequest->type = TDMT_MND_CREATE_TOPIC;
|
pRequest->type = TDMT_MND_CREATE_TOPIC;
|
||||||
|
|
||||||
SMsgSendInfo* body = buildMsgInfoImpl(pRequest);
|
SMsgSendInfo* sendInfo = buildMsgInfoImpl(pRequest);
|
||||||
SEpSet epSet = getEpSet_s(&pTscObj->pAppInfo->mgmtEp);
|
SEpSet epSet = getEpSet_s(&pTscObj->pAppInfo->mgmtEp);
|
||||||
|
|
||||||
int64_t transporterId = 0;
|
int64_t transporterId = 0;
|
||||||
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &epSet, &transporterId, body);
|
asyncSendMsgToServer(pTscObj->pAppInfo->pTransporter, &epSet, &transporterId, sendInfo);
|
||||||
|
|
||||||
tsem_wait(&pRequest->body.rspSem);
|
tsem_wait(&pRequest->body.rspSem);
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
qDestroyQuery(pQueryNode);
|
qDestroyQuery(pQueryNode);
|
||||||
if (body != NULL) {
|
/*if (sendInfo != NULL) {*/
|
||||||
destroySendMsgInfo(body);
|
/*destroySendMsgInfo(sendInfo);*/
|
||||||
}
|
/*}*/
|
||||||
|
|
||||||
if (pRequest != NULL && terrno != TSDB_CODE_SUCCESS) {
|
if (pRequest != NULL && terrno != TSDB_CODE_SUCCESS) {
|
||||||
pRequest->code = terrno;
|
pRequest->code = terrno;
|
||||||
|
@ -596,36 +620,117 @@ struct tmq_message_t {
|
||||||
SMqConsumeRsp rsp;
|
SMqConsumeRsp rsp;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int32_t tmq_poll_cb_inner(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tmq_ask_ep_cb(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
|
tmq_t* tmq = (tmq_t*)param;
|
||||||
|
if (code != 0) {
|
||||||
|
tsem_post(&tmq->rspSem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
tscDebug("tmq ask ep cb called");
|
||||||
|
bool set = false;
|
||||||
|
SMqCMGetSubEpRsp rsp;
|
||||||
|
tDecodeSMqCMGetSubEpRsp(pMsg->pData, &rsp);
|
||||||
|
int32_t sz = taosArrayGetSize(rsp.topics);
|
||||||
|
// TODO: lock
|
||||||
|
tmq->clientTopics = taosArrayInit(sz, sizeof(SMqClientTopic));
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
SMqClientTopic topic = {0};
|
||||||
|
SMqSubTopicEp* pTopicEp = taosArrayGet(rsp.topics, i);
|
||||||
|
topic.topicName = strdup(pTopicEp->topic);
|
||||||
|
int32_t vgSz = taosArrayGetSize(pTopicEp->vgs);
|
||||||
|
topic.vgs = taosArrayInit(vgSz, sizeof(SMqClientVg));
|
||||||
|
for (int32_t j = 0; j < vgSz; j++) {
|
||||||
|
SMqSubVgEp* pVgEp = taosArrayGet(pTopicEp->vgs, j);
|
||||||
|
SMqClientVg clientVg = {
|
||||||
|
.pollCnt = 0,
|
||||||
|
.committedOffset = -1,
|
||||||
|
.currentOffset = -1,
|
||||||
|
.vgId = pVgEp->vgId,
|
||||||
|
.epSet = pVgEp->epSet
|
||||||
|
};
|
||||||
|
taosArrayPush(topic.vgs, &clientVg);
|
||||||
|
set = true;
|
||||||
|
}
|
||||||
|
taosArrayPush(tmq->clientTopics, &topic);
|
||||||
|
}
|
||||||
|
if(set) tmq->status = 1;
|
||||||
|
// unlock
|
||||||
|
tsem_post(&tmq->rspSem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
tmq_message_t* tmq_consume_poll(tmq_t* tmq, int64_t blocking_time) {
|
tmq_message_t* tmq_consume_poll(tmq_t* tmq, int64_t blocking_time) {
|
||||||
if (tmq->clientTopics == NULL || taosArrayGetSize(tmq->clientTopics) == 0) {
|
|
||||||
|
if (taosArrayGetSize(tmq->clientTopics) == 0 || tmq->status == 0) {
|
||||||
|
int32_t tlen = sizeof(SMqCMGetSubEpReq);
|
||||||
|
SMqCMGetSubEpReq* buf = malloc(tlen);
|
||||||
|
if (buf == NULL) {
|
||||||
|
tscError("failed to malloc get subscribe ep buf");
|
||||||
|
}
|
||||||
|
buf->consumerId = htobe64(tmq->consumerId);
|
||||||
|
strcpy(buf->cgroup, tmq->groupId);
|
||||||
|
|
||||||
|
SRequestObj *pRequest = createRequest(tmq->pTscObj, NULL, NULL, TDMT_MND_GET_SUB_EP);
|
||||||
|
if (pRequest == NULL) {
|
||||||
|
tscError("failed to malloc subscribe ep request");
|
||||||
|
}
|
||||||
|
|
||||||
|
pRequest->body.requestMsg = (SDataBuf){ .pData = buf, .len = tlen };
|
||||||
|
|
||||||
|
SMsgSendInfo* sendInfo = buildMsgInfoImpl(pRequest);
|
||||||
|
sendInfo->requestObjRefId = 0;
|
||||||
|
sendInfo->param = tmq;
|
||||||
|
sendInfo->fp = tmq_ask_ep_cb;
|
||||||
|
|
||||||
|
SEpSet epSet = getEpSet_s(&tmq->pTscObj->pAppInfo->mgmtEp);
|
||||||
|
|
||||||
|
int64_t transporterId = 0;
|
||||||
|
asyncSendMsgToServer(tmq->pTscObj->pAppInfo->pTransporter, &epSet, &transporterId, sendInfo);
|
||||||
|
|
||||||
|
tsem_wait(&tmq->rspSem);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (taosArrayGetSize(tmq->clientTopics) == 0) {
|
||||||
|
tscDebug("consumer:%ld poll but not assigned", tmq->consumerId);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
SRequestObj *pRequest = NULL;
|
|
||||||
SMqConsumeReq req = {0};
|
SMqConsumeReq* pReq = malloc(sizeof(SMqConsumeReq));
|
||||||
req.reqType = 1;
|
pReq->reqType = 1;
|
||||||
req.blockingTime = blocking_time;
|
pReq->blockingTime = blocking_time;
|
||||||
req.consumerId = tmq->consumerId;
|
pReq->consumerId = tmq->consumerId;
|
||||||
strcpy(req.cgroup, tmq->groupId);
|
tmq_message_t* tmq_message = NULL;
|
||||||
|
strcpy(pReq->cgroup, tmq->groupId);
|
||||||
|
|
||||||
SMqClientTopic* pTopic = taosArrayGet(tmq->clientTopics, tmq->nextTopicIdx);
|
SMqClientTopic* pTopic = taosArrayGet(tmq->clientTopics, tmq->nextTopicIdx);
|
||||||
tmq->nextTopicIdx = (tmq->nextTopicIdx + 1) % taosArrayGetSize(tmq->clientTopics);
|
tmq->nextTopicIdx = (tmq->nextTopicIdx + 1) % taosArrayGetSize(tmq->clientTopics);
|
||||||
strcpy(req.topic, pTopic->topicName);
|
strcpy(pReq->topic, pTopic->topicName);
|
||||||
int32_t nextVgIdx = pTopic->nextVgIdx;
|
int32_t nextVgIdx = pTopic->nextVgIdx;
|
||||||
pTopic->nextVgIdx = (nextVgIdx + 1) % taosArrayGetSize(pTopic->vgs);
|
pTopic->nextVgIdx = (nextVgIdx + 1) % taosArrayGetSize(pTopic->vgs);
|
||||||
SMqClientVg* pVg = taosArrayGet(pTopic->vgs, nextVgIdx);
|
SMqClientVg* pVg = taosArrayGet(pTopic->vgs, nextVgIdx);
|
||||||
req.offset = pVg->currentOffset;
|
pReq->offset = pVg->currentOffset;
|
||||||
|
|
||||||
pRequest->body.requestMsg = (SDataBuf){ .pData = &req, .len = sizeof(SMqConsumeReq) };
|
pReq->head.vgId = htonl(pVg->vgId);
|
||||||
pRequest->type = TDMT_VND_CONSUME;
|
pReq->head.contLen = htonl(sizeof(SMqConsumeReq));
|
||||||
|
|
||||||
SMsgSendInfo* body = buildMsgInfoImpl(pRequest);
|
SRequestObj* pRequest = createRequest(tmq->pTscObj, NULL, NULL, TDMT_VND_CONSUME);
|
||||||
|
pRequest->body.requestMsg = (SDataBuf){ .pData = pReq, .len = sizeof(SMqConsumeReq) };
|
||||||
|
|
||||||
|
SMsgSendInfo* sendInfo = buildMsgInfoImpl(pRequest);
|
||||||
|
/*sendInfo->requestObjRefId = 0;*/
|
||||||
|
/*sendInfo->param = &tmq_message;*/
|
||||||
|
/*sendInfo->fp = tmq_poll_cb_inner;*/
|
||||||
|
|
||||||
int64_t transporterId = 0;
|
int64_t transporterId = 0;
|
||||||
asyncSendMsgToServer(tmq->pTscObj->pAppInfo->pTransporter, &pVg->epSet, &transporterId, body);
|
asyncSendMsgToServer(tmq->pTscObj->pAppInfo->pTransporter, &pVg->epSet, &transporterId, sendInfo);
|
||||||
|
|
||||||
tsem_wait(&pRequest->body.rspSem);
|
tsem_wait(&pRequest->body.rspSem);
|
||||||
|
|
||||||
return (tmq_message_t*)pRequest->body.resInfo.pData;
|
return tmq_message;
|
||||||
|
|
||||||
/*tsem_wait(&pRequest->body.rspSem);*/
|
/*tsem_wait(&pRequest->body.rspSem);*/
|
||||||
|
|
||||||
|
|
|
@ -571,7 +571,7 @@ TEST(testCase, create_topic_Test) {
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
//taos_free_result(pRes);
|
||||||
|
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
ASSERT_TRUE(pFields == nullptr);
|
ASSERT_TRUE(pFields == nullptr);
|
||||||
|
@ -592,6 +592,12 @@ TEST(testCase, tmq_subscribe_Test) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
assert(pConn != NULL);
|
assert(pConn != NULL);
|
||||||
|
|
||||||
|
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
|
||||||
tmq_conf_t* conf = tmq_conf_new();
|
tmq_conf_t* conf = tmq_conf_new();
|
||||||
tmq_conf_set(conf, "group.id", "tg1");
|
tmq_conf_set(conf, "group.id", "tg1");
|
||||||
tmq_t* tmq = taos_consumer_new(pConn, conf, NULL, 0);
|
tmq_t* tmq = taos_consumer_new(pConn, conf, NULL, 0);
|
||||||
|
@ -603,16 +609,16 @@ TEST(testCase, tmq_subscribe_Test) {
|
||||||
while (1) {
|
while (1) {
|
||||||
tmq_message_t* msg = tmq_consume_poll(tmq, 0);
|
tmq_message_t* msg = tmq_consume_poll(tmq, 0);
|
||||||
printf("get msg\n");
|
printf("get msg\n");
|
||||||
if (msg == NULL) break;
|
//if (msg == NULL) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
TEST(testCase, tmq_consume_Test) {
|
TEST(testCase, tmq_consume_Test) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(testCase, tmq_commit_TEST) {
|
TEST(testCase, tmq_commit_TEST) {
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
TEST(testCase, projection_query_tables) {
|
TEST(testCase, projection_query_tables) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
|
|
@ -31,8 +31,8 @@ typedef struct {
|
||||||
SDnode *pDnode;
|
SDnode *pDnode;
|
||||||
STaosQueue *queue;
|
STaosQueue *queue;
|
||||||
union {
|
union {
|
||||||
SWorkerPool pool;
|
SQWorkerPool pool;
|
||||||
SMWorkerPool mpool;
|
SWWorkerPool mpool;
|
||||||
};
|
};
|
||||||
} SDnodeWorker;
|
} SDnodeWorker;
|
||||||
|
|
||||||
|
@ -109,10 +109,10 @@ typedef struct {
|
||||||
int32_t openVnodes;
|
int32_t openVnodes;
|
||||||
int32_t totalVnodes;
|
int32_t totalVnodes;
|
||||||
SRWLatch latch;
|
SRWLatch latch;
|
||||||
SWorkerPool queryPool;
|
SQWorkerPool queryPool;
|
||||||
SWorkerPool fetchPool;
|
SFWorkerPool fetchPool;
|
||||||
SMWorkerPool syncPool;
|
SWWorkerPool syncPool;
|
||||||
SMWorkerPool writePool;
|
SWWorkerPool writePool;
|
||||||
} SVnodesMgmt;
|
} SVnodesMgmt;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -289,6 +289,7 @@ int32_t dndInit(const SDnodeEnvCfg *pCfg) {
|
||||||
.charset = pCfg->charset,
|
.charset = pCfg->charset,
|
||||||
.nthreads = pCfg->numOfCommitThreads,
|
.nthreads = pCfg->numOfCommitThreads,
|
||||||
.putReqToVQueryQFp = dndPutReqToVQueryQ,
|
.putReqToVQueryQFp = dndPutReqToVQueryQ,
|
||||||
|
.sendReqToDnodeFp = dndSendReqToDnode
|
||||||
};
|
};
|
||||||
|
|
||||||
if (vnodeInit(&vnodeOpt) != 0) {
|
if (vnodeInit(&vnodeOpt) != 0) {
|
||||||
|
|
|
@ -532,7 +532,7 @@ int32_t dndInitMgmt(SDnode *pDnode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pMgmt->dropped) {
|
if (pMgmt->dropped) {
|
||||||
dError("dnode will not start for its already dropped");
|
dError("dnode not start since its already dropped");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,9 +25,9 @@
|
||||||
#include "dndMnode.h"
|
#include "dndMnode.h"
|
||||||
#include "dndVnodes.h"
|
#include "dndVnodes.h"
|
||||||
|
|
||||||
#define INTERNAL_USER "_internal"
|
#define INTERNAL_USER "_dnd"
|
||||||
#define INTERNAL_CKEY "_key"
|
#define INTERNAL_CKEY "_key"
|
||||||
#define INTERNAL_SECRET "_secret"
|
#define INTERNAL_SECRET "_pwd"
|
||||||
|
|
||||||
static void dndInitMsgFp(STransMgmt *pMgmt) {
|
static void dndInitMsgFp(STransMgmt *pMgmt) {
|
||||||
// Requests handled by DNODE
|
// Requests handled by DNODE
|
||||||
|
@ -115,12 +115,14 @@ static void dndInitMsgFp(STransMgmt *pMgmt) {
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_MND_SUBSCRIBE)] = dndProcessMnodeWriteMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_MND_SUBSCRIBE)] = dndProcessMnodeWriteMsg;
|
||||||
/*pMgmt->msgFp[TMSG_INDEX(TDMT_VND_SUBSCRIBE_RSP)] = dndProcessMnodeWriteMsg;*/
|
/*pMgmt->msgFp[TMSG_INDEX(TDMT_VND_SUBSCRIBE_RSP)] = dndProcessMnodeWriteMsg;*/
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_SET_CONN_RSP)] = dndProcessMnodeWriteMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_SET_CONN_RSP)] = dndProcessMnodeWriteMsg;
|
||||||
|
pMgmt->msgFp[TMSG_INDEX(TDMT_MND_GET_SUB_EP)] = dndProcessMnodeReadMsg;
|
||||||
|
|
||||||
// Requests handled by VNODE
|
// Requests handled by VNODE
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_SUBMIT)] = dndProcessVnodeWriteMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_SUBMIT)] = dndProcessVnodeWriteMsg;
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_QUERY)] = dndProcessVnodeQueryMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_QUERY)] = dndProcessVnodeQueryMsg;
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_QUERY_CONTINUE)] = dndProcessVnodeQueryMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_QUERY_CONTINUE)] = dndProcessVnodeQueryMsg;
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_FETCH)] = dndProcessVnodeFetchMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_FETCH)] = dndProcessVnodeFetchMsg;
|
||||||
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_FETCH_RSP)] = dndProcessVnodeFetchMsg;
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_ALTER_TABLE)] = dndProcessVnodeWriteMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_ALTER_TABLE)] = dndProcessVnodeWriteMsg;
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_UPDATE_TAG_VAL)] = dndProcessVnodeWriteMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_UPDATE_TAG_VAL)] = dndProcessVnodeWriteMsg;
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_TABLE_META)] = dndProcessVnodeFetchMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_TABLE_META)] = dndProcessVnodeFetchMsg;
|
||||||
|
@ -147,6 +149,7 @@ static void dndInitMsgFp(STransMgmt *pMgmt) {
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_SHOW_TABLES_FETCH)] = dndProcessVnodeFetchMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_SHOW_TABLES_FETCH)] = dndProcessVnodeFetchMsg;
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_SET_CONN)] = dndProcessVnodeWriteMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_SET_CONN)] = dndProcessVnodeWriteMsg;
|
||||||
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_SET_CUR)] = dndProcessVnodeFetchMsg;
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_MQ_SET_CUR)] = dndProcessVnodeFetchMsg;
|
||||||
|
pMgmt->msgFp[TMSG_INDEX(TDMT_VND_CONSUME)] = dndProcessVnodeFetchMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dndProcessResponse(void *parent, SRpcMsg *pRsp, SEpSet *pEpSet) {
|
static void dndProcessResponse(void *parent, SRpcMsg *pRsp, SEpSet *pEpSet) {
|
||||||
|
@ -157,17 +160,18 @@ static void dndProcessResponse(void *parent, SRpcMsg *pRsp, SEpSet *pEpSet) {
|
||||||
|
|
||||||
if (dndGetStat(pDnode) == DND_STAT_STOPPED) {
|
if (dndGetStat(pDnode) == DND_STAT_STOPPED) {
|
||||||
if (pRsp == NULL || pRsp->pCont == NULL) return;
|
if (pRsp == NULL || pRsp->pCont == NULL) return;
|
||||||
dTrace("RPC %p, rsp:%s is ignored since dnode is stopping", pRsp->handle, TMSG_INFO(msgType));
|
dTrace("RPC %p, rsp:%s ignored since dnode exiting, app:%p", pRsp->handle, TMSG_INFO(msgType), pRsp->ahandle);
|
||||||
rpcFreeCont(pRsp->pCont);
|
rpcFreeCont(pRsp->pCont);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DndMsgFp fp = pMgmt->msgFp[TMSG_INDEX(msgType)];
|
DndMsgFp fp = pMgmt->msgFp[TMSG_INDEX(msgType)];
|
||||||
if (fp != NULL) {
|
if (fp != NULL) {
|
||||||
dTrace("RPC %p, rsp:%s will be processed, code:0x%x", pRsp->handle, TMSG_INFO(msgType), pRsp->code & 0XFFFF);
|
dTrace("RPC %p, rsp:%s will be processed, code:0x%x app:%p", pRsp->handle, TMSG_INFO(msgType), pRsp->code & 0XFFFF,
|
||||||
|
pRsp->ahandle);
|
||||||
(*fp)(pDnode, pRsp, pEpSet);
|
(*fp)(pDnode, pRsp, pEpSet);
|
||||||
} else {
|
} else {
|
||||||
dError("RPC %p, rsp:%s not processed", pRsp->handle, TMSG_INFO(msgType));
|
dError("RPC %p, rsp:%s not processed, app:%p", pRsp->handle, TMSG_INFO(msgType), pRsp->ahandle);
|
||||||
rpcFreeCont(pRsp->pCont);
|
rpcFreeCont(pRsp->pCont);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -194,7 +198,7 @@ static int32_t dndInitClient(SDnode *pDnode) {
|
||||||
|
|
||||||
pMgmt->clientRpc = rpcOpen(&rpcInit);
|
pMgmt->clientRpc = rpcOpen(&rpcInit);
|
||||||
if (pMgmt->clientRpc == NULL) {
|
if (pMgmt->clientRpc == NULL) {
|
||||||
dError("failed to init rpc client");
|
dError("failed to init dnode rpc client");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,40 +221,39 @@ static void dndProcessRequest(void *param, SRpcMsg *pReq, SEpSet *pEpSet) {
|
||||||
|
|
||||||
tmsg_t msgType = pReq->msgType;
|
tmsg_t msgType = pReq->msgType;
|
||||||
if (msgType == TDMT_DND_NETWORK_TEST) {
|
if (msgType == TDMT_DND_NETWORK_TEST) {
|
||||||
dTrace("RPC %p, network test req, app:%p will be processed, code:0x%x", pReq->handle, pReq->ahandle, pReq->code);
|
dTrace("RPC %p, network test req will be processed, app:%p", pReq->handle, pReq->ahandle);
|
||||||
dndProcessStartupReq(pDnode, pReq);
|
dndProcessStartupReq(pDnode, pReq);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dndGetStat(pDnode) == DND_STAT_STOPPED) {
|
if (dndGetStat(pDnode) == DND_STAT_STOPPED) {
|
||||||
dError("RPC %p, req:%s app:%p is ignored since dnode exiting", pReq->handle, TMSG_INFO(msgType), pReq->ahandle);
|
dError("RPC %p, req:%s ignored since dnode exiting, app:%p", pReq->handle, TMSG_INFO(msgType), pReq->ahandle);
|
||||||
SRpcMsg rspMsg = {.handle = pReq->handle, .code = TSDB_CODE_DND_OFFLINE};
|
SRpcMsg rspMsg = {.handle = pReq->handle, .code = TSDB_CODE_DND_OFFLINE, .ahandle = pReq->ahandle};
|
||||||
rpcSendResponse(&rspMsg);
|
rpcSendResponse(&rspMsg);
|
||||||
rpcFreeCont(pReq->pCont);
|
rpcFreeCont(pReq->pCont);
|
||||||
return;
|
return;
|
||||||
} else if (dndGetStat(pDnode) != DND_STAT_RUNNING) {
|
} else if (dndGetStat(pDnode) != DND_STAT_RUNNING) {
|
||||||
dError("RPC %p, req:%s app:%p is ignored since dnode not running", pReq->handle, TMSG_INFO(msgType), pReq->ahandle);
|
dError("RPC %p, req:%s ignored since dnode not running, app:%p", pReq->handle, TMSG_INFO(msgType), pReq->ahandle);
|
||||||
SRpcMsg rspMsg = {.handle = pReq->handle, .code = TSDB_CODE_APP_NOT_READY};
|
SRpcMsg rspMsg = {.handle = pReq->handle, .code = TSDB_CODE_APP_NOT_READY, .ahandle = pReq->ahandle};
|
||||||
rpcSendResponse(&rspMsg);
|
rpcSendResponse(&rspMsg);
|
||||||
rpcFreeCont(pReq->pCont);
|
rpcFreeCont(pReq->pCont);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pReq->pCont == NULL) {
|
if (pReq->pCont == NULL) {
|
||||||
dTrace("RPC %p, req:%s app:%p not processed since content is null", pReq->handle, TMSG_INFO(msgType),
|
dTrace("RPC %p, req:%s not processed since its empty, app:%p", pReq->handle, TMSG_INFO(msgType), pReq->ahandle);
|
||||||
pReq->ahandle);
|
SRpcMsg rspMsg = {.handle = pReq->handle, .code = TSDB_CODE_DND_INVALID_MSG_LEN, .ahandle = pReq->ahandle};
|
||||||
SRpcMsg rspMsg = {.handle = pReq->handle, .code = TSDB_CODE_DND_INVALID_MSG_LEN};
|
|
||||||
rpcSendResponse(&rspMsg);
|
rpcSendResponse(&rspMsg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DndMsgFp fp = pMgmt->msgFp[TMSG_INDEX(msgType)];
|
DndMsgFp fp = pMgmt->msgFp[TMSG_INDEX(msgType)];
|
||||||
if (fp != NULL) {
|
if (fp != NULL) {
|
||||||
dTrace("RPC %p, req:%s app:%p will be processed", pReq->handle, TMSG_INFO(msgType), pReq->ahandle);
|
dTrace("RPC %p, req:%s will be processed, app:%p", pReq->handle, TMSG_INFO(msgType), pReq->ahandle);
|
||||||
(*fp)(pDnode, pReq, pEpSet);
|
(*fp)(pDnode, pReq, pEpSet);
|
||||||
} else {
|
} else {
|
||||||
dError("RPC %p, req:%s app:%p is not processed since no handle", pReq->handle, TMSG_INFO(msgType), pReq->ahandle);
|
dError("RPC %p, req:%s not processed since no handle, app:%p", pReq->handle, TMSG_INFO(msgType), pReq->ahandle);
|
||||||
SRpcMsg rspMsg = {.handle = pReq->handle, .code = TSDB_CODE_MSG_NOT_PROCESSED};
|
SRpcMsg rspMsg = {.handle = pReq->handle, .code = TSDB_CODE_MSG_NOT_PROCESSED, .ahandle = pReq->ahandle};
|
||||||
rpcSendResponse(&rspMsg);
|
rpcSendResponse(&rspMsg);
|
||||||
rpcFreeCont(pReq->pCont);
|
rpcFreeCont(pReq->pCont);
|
||||||
}
|
}
|
||||||
|
@ -290,24 +293,24 @@ static int32_t dndRetrieveUserAuthInfo(void *parent, char *user, char *spi, char
|
||||||
SDnode *pDnode = parent;
|
SDnode *pDnode = parent;
|
||||||
|
|
||||||
if (dndAuthInternalReq(parent, user, spi, encrypt, secret, ckey) == 0) {
|
if (dndAuthInternalReq(parent, user, spi, encrypt, secret, ckey) == 0) {
|
||||||
dTrace("user:%s, get auth from internal mnode, spi:%d encrypt:%d", user, *spi, *encrypt);
|
dTrace("user:%s, get auth from mnode, spi:%d encrypt:%d", user, *spi, *encrypt);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dndGetUserAuthFromMnode(pDnode, user, spi, encrypt, secret, ckey) == 0) {
|
if (dndGetUserAuthFromMnode(pDnode, user, spi, encrypt, secret, ckey) == 0) {
|
||||||
dTrace("user:%s, get auth from internal mnode, spi:%d encrypt:%d", user, *spi, *encrypt);
|
dTrace("user:%s, get auth from mnode, spi:%d encrypt:%d", user, *spi, *encrypt);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (terrno != TSDB_CODE_APP_NOT_READY) {
|
if (terrno != TSDB_CODE_APP_NOT_READY) {
|
||||||
dTrace("failed to get user auth from internal mnode since %s", terrstr());
|
dTrace("failed to get user auth from mnode since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SAuthReq *pReq = rpcMallocCont(sizeof(SAuthReq));
|
SAuthReq *pReq = rpcMallocCont(sizeof(SAuthReq));
|
||||||
tstrncpy(pReq->user, user, TSDB_USER_LEN);
|
tstrncpy(pReq->user, user, TSDB_USER_LEN);
|
||||||
|
|
||||||
SRpcMsg rpcMsg = {.pCont = pReq, .contLen = sizeof(SAuthReq), .msgType = TDMT_MND_AUTH};
|
SRpcMsg rpcMsg = {.pCont = pReq, .contLen = sizeof(SAuthReq), .msgType = TDMT_MND_AUTH, .ahandle = (void *)9528};
|
||||||
SRpcMsg rpcRsp = {0};
|
SRpcMsg rpcRsp = {0};
|
||||||
dTrace("user:%s, send user auth req to other mnodes, spi:%d encrypt:%d", user, pReq->spi, pReq->encrypt);
|
dTrace("user:%s, send user auth req to other mnodes, spi:%d encrypt:%d", user, pReq->spi, pReq->encrypt);
|
||||||
dndSendMsgToMnodeRecv(pDnode, &rpcMsg, &rpcRsp);
|
dndSendMsgToMnodeRecv(pDnode, &rpcMsg, &rpcRsp);
|
||||||
|
@ -351,7 +354,7 @@ static int32_t dndInitServer(SDnode *pDnode) {
|
||||||
|
|
||||||
pMgmt->serverRpc = rpcOpen(&rpcInit);
|
pMgmt->serverRpc = rpcOpen(&rpcInit);
|
||||||
if (pMgmt->serverRpc == NULL) {
|
if (pMgmt->serverRpc == NULL) {
|
||||||
dError("failed to init rpc server");
|
dError("failed to init dnode rpc server");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -527,7 +527,6 @@ static void dndGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) {
|
||||||
pCfg->vgId = pCreate->vgId;
|
pCfg->vgId = pCreate->vgId;
|
||||||
pCfg->wsize = pCreate->cacheBlockSize;
|
pCfg->wsize = pCreate->cacheBlockSize;
|
||||||
pCfg->ssize = pCreate->cacheBlockSize;
|
pCfg->ssize = pCreate->cacheBlockSize;
|
||||||
pCfg->wsize = pCreate->cacheBlockSize;
|
|
||||||
pCfg->lsize = pCreate->cacheBlockSize;
|
pCfg->lsize = pCreate->cacheBlockSize;
|
||||||
pCfg->isHeapAllocator = true;
|
pCfg->isHeapAllocator = true;
|
||||||
pCfg->ttl = 4;
|
pCfg->ttl = 4;
|
||||||
|
@ -737,15 +736,9 @@ int32_t dndProcessCompactVnodeReq(SDnode *pDnode, SRpcMsg *pReq) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dndProcessVnodeQueryQueue(SVnodeObj *pVnode, SRpcMsg *pMsg) {
|
static void dndProcessVnodeQueryQueue(SVnodeObj *pVnode, SRpcMsg *pMsg) { vnodeProcessQueryMsg(pVnode->pImpl, pMsg); }
|
||||||
SRpcMsg *pRsp = NULL;
|
|
||||||
vnodeProcessQueryReq(pVnode->pImpl, pMsg, &pRsp);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dndProcessVnodeFetchQueue(SVnodeObj *pVnode, SRpcMsg *pMsg) {
|
static void dndProcessVnodeFetchQueue(SVnodeObj *pVnode, SRpcMsg *pMsg) { vnodeProcessFetchMsg(pVnode->pImpl, pMsg); }
|
||||||
SRpcMsg *pRsp = NULL;
|
|
||||||
vnodeProcessFetchReq(pVnode->pImpl, pMsg, &pRsp);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dndProcessVnodeWriteQueue(SVnodeObj *pVnode, STaosQall *qall, int32_t numOfMsgs) {
|
static void dndProcessVnodeWriteQueue(SVnodeObj *pVnode, STaosQall *qall, int32_t numOfMsgs) {
|
||||||
SArray *pArray = taosArrayInit(numOfMsgs, sizeof(SRpcMsg *));
|
SArray *pArray = taosArrayInit(numOfMsgs, sizeof(SRpcMsg *));
|
||||||
|
@ -916,27 +909,27 @@ static int32_t dndInitVnodeWorkers(SDnode *pDnode) {
|
||||||
int32_t maxWriteThreads = TMAX(pDnode->env.numOfCores, 1);
|
int32_t maxWriteThreads = TMAX(pDnode->env.numOfCores, 1);
|
||||||
int32_t maxSyncThreads = TMAX(pDnode->env.numOfCores / 2, 1);
|
int32_t maxSyncThreads = TMAX(pDnode->env.numOfCores / 2, 1);
|
||||||
|
|
||||||
SWorkerPool *pPool = &pMgmt->queryPool;
|
SQWorkerPool *pQPool = &pMgmt->queryPool;
|
||||||
pPool->name = "vnode-query";
|
pQPool->name = "vnode-query";
|
||||||
pPool->min = minQueryThreads;
|
pQPool->min = minQueryThreads;
|
||||||
pPool->max = maxQueryThreads;
|
pQPool->max = maxQueryThreads;
|
||||||
if (tWorkerInit(pPool) != 0) return -1;
|
if (tQWorkerInit(pQPool) != 0) return -1;
|
||||||
|
|
||||||
pPool = &pMgmt->fetchPool;
|
SFWorkerPool *pFPool = &pMgmt->fetchPool;
|
||||||
pPool->name = "vnode-fetch";
|
pFPool->name = "vnode-fetch";
|
||||||
pPool->min = minFetchThreads;
|
pFPool->min = minFetchThreads;
|
||||||
pPool->max = maxFetchThreads;
|
pFPool->max = maxFetchThreads;
|
||||||
if (tWorkerInit(pPool) != 0) return -1;
|
if (tFWorkerInit(pFPool) != 0) return -1;
|
||||||
|
|
||||||
SMWorkerPool *pMPool = &pMgmt->writePool;
|
SWWorkerPool *pWPool = &pMgmt->writePool;
|
||||||
pMPool->name = "vnode-write";
|
pWPool->name = "vnode-write";
|
||||||
pMPool->max = maxWriteThreads;
|
pWPool->max = maxWriteThreads;
|
||||||
if (tMWorkerInit(pMPool) != 0) return -1;
|
if (tWWorkerInit(pWPool) != 0) return -1;
|
||||||
|
|
||||||
pMPool = &pMgmt->syncPool;
|
pWPool = &pMgmt->syncPool;
|
||||||
pMPool->name = "vnode-sync";
|
pWPool->name = "vnode-sync";
|
||||||
pMPool->max = maxSyncThreads;
|
pWPool->max = maxSyncThreads;
|
||||||
if (tMWorkerInit(pMPool) != 0) return -1;
|
if (tWWorkerInit(pWPool) != 0) return -1;
|
||||||
|
|
||||||
dDebug("vnode workers is initialized");
|
dDebug("vnode workers is initialized");
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -944,21 +937,21 @@ static int32_t dndInitVnodeWorkers(SDnode *pDnode) {
|
||||||
|
|
||||||
static void dndCleanupVnodeWorkers(SDnode *pDnode) {
|
static void dndCleanupVnodeWorkers(SDnode *pDnode) {
|
||||||
SVnodesMgmt *pMgmt = &pDnode->vmgmt;
|
SVnodesMgmt *pMgmt = &pDnode->vmgmt;
|
||||||
tWorkerCleanup(&pMgmt->fetchPool);
|
tFWorkerCleanup(&pMgmt->fetchPool);
|
||||||
tWorkerCleanup(&pMgmt->queryPool);
|
tQWorkerCleanup(&pMgmt->queryPool);
|
||||||
tMWorkerCleanup(&pMgmt->writePool);
|
tWWorkerCleanup(&pMgmt->writePool);
|
||||||
tMWorkerCleanup(&pMgmt->syncPool);
|
tWWorkerCleanup(&pMgmt->syncPool);
|
||||||
dDebug("vnode workers is closed");
|
dDebug("vnode workers is closed");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t dndAllocVnodeQueue(SDnode *pDnode, SVnodeObj *pVnode) {
|
static int32_t dndAllocVnodeQueue(SDnode *pDnode, SVnodeObj *pVnode) {
|
||||||
SVnodesMgmt *pMgmt = &pDnode->vmgmt;
|
SVnodesMgmt *pMgmt = &pDnode->vmgmt;
|
||||||
|
|
||||||
pVnode->pWriteQ = tMWorkerAllocQueue(&pMgmt->writePool, pVnode, (FProcessItems)dndProcessVnodeWriteQueue);
|
pVnode->pWriteQ = tWWorkerAllocQueue(&pMgmt->writePool, pVnode, (FItems)dndProcessVnodeWriteQueue);
|
||||||
pVnode->pApplyQ = tMWorkerAllocQueue(&pMgmt->writePool, pVnode, (FProcessItems)dndProcessVnodeApplyQueue);
|
pVnode->pApplyQ = tWWorkerAllocQueue(&pMgmt->writePool, pVnode, (FItems)dndProcessVnodeApplyQueue);
|
||||||
pVnode->pSyncQ = tMWorkerAllocQueue(&pMgmt->syncPool, pVnode, (FProcessItems)dndProcessVnodeSyncQueue);
|
pVnode->pSyncQ = tWWorkerAllocQueue(&pMgmt->syncPool, pVnode, (FItems)dndProcessVnodeSyncQueue);
|
||||||
pVnode->pFetchQ = tWorkerAllocQueue(&pMgmt->fetchPool, pVnode, (FProcessItem)dndProcessVnodeFetchQueue);
|
pVnode->pFetchQ = tFWorkerAllocQueue(&pMgmt->fetchPool, pVnode, (FItem)dndProcessVnodeFetchQueue);
|
||||||
pVnode->pQueryQ = tWorkerAllocQueue(&pMgmt->queryPool, pVnode, (FProcessItem)dndProcessVnodeQueryQueue);
|
pVnode->pQueryQ = tQWorkerAllocQueue(&pMgmt->queryPool, pVnode, (FItem)dndProcessVnodeQueryQueue);
|
||||||
|
|
||||||
if (pVnode->pApplyQ == NULL || pVnode->pWriteQ == NULL || pVnode->pSyncQ == NULL || pVnode->pFetchQ == NULL ||
|
if (pVnode->pApplyQ == NULL || pVnode->pWriteQ == NULL || pVnode->pSyncQ == NULL || pVnode->pFetchQ == NULL ||
|
||||||
pVnode->pQueryQ == NULL) {
|
pVnode->pQueryQ == NULL) {
|
||||||
|
@ -971,11 +964,11 @@ static int32_t dndAllocVnodeQueue(SDnode *pDnode, SVnodeObj *pVnode) {
|
||||||
|
|
||||||
static void dndFreeVnodeQueue(SDnode *pDnode, SVnodeObj *pVnode) {
|
static void dndFreeVnodeQueue(SDnode *pDnode, SVnodeObj *pVnode) {
|
||||||
SVnodesMgmt *pMgmt = &pDnode->vmgmt;
|
SVnodesMgmt *pMgmt = &pDnode->vmgmt;
|
||||||
tWorkerFreeQueue(&pMgmt->queryPool, pVnode->pQueryQ);
|
tQWorkerFreeQueue(&pMgmt->queryPool, pVnode->pQueryQ);
|
||||||
tWorkerFreeQueue(&pMgmt->fetchPool, pVnode->pFetchQ);
|
tFWorkerFreeQueue(&pMgmt->fetchPool, pVnode->pFetchQ);
|
||||||
tMWorkerFreeQueue(&pMgmt->writePool, pVnode->pWriteQ);
|
tWWorkerFreeQueue(&pMgmt->writePool, pVnode->pWriteQ);
|
||||||
tMWorkerFreeQueue(&pMgmt->writePool, pVnode->pApplyQ);
|
tWWorkerFreeQueue(&pMgmt->writePool, pVnode->pApplyQ);
|
||||||
tMWorkerFreeQueue(&pMgmt->syncPool, pVnode->pSyncQ);
|
tWWorkerFreeQueue(&pMgmt->syncPool, pVnode->pSyncQ);
|
||||||
pVnode->pWriteQ = NULL;
|
pVnode->pWriteQ = NULL;
|
||||||
pVnode->pApplyQ = NULL;
|
pVnode->pApplyQ = NULL;
|
||||||
pVnode->pSyncQ = NULL;
|
pVnode->pSyncQ = NULL;
|
||||||
|
|
|
@ -31,28 +31,28 @@ int32_t dndInitWorker(SDnode *pDnode, SDnodeWorker *pWorker, EWorkerType type, c
|
||||||
pWorker->pDnode = pDnode;
|
pWorker->pDnode = pDnode;
|
||||||
|
|
||||||
if (pWorker->type == DND_WORKER_SINGLE) {
|
if (pWorker->type == DND_WORKER_SINGLE) {
|
||||||
SWorkerPool *pPool = &pWorker->pool;
|
SQWorkerPool *pPool = &pWorker->pool;
|
||||||
pPool->name = name;
|
pPool->name = name;
|
||||||
pPool->min = minNum;
|
pPool->min = minNum;
|
||||||
pPool->max = maxNum;
|
pPool->max = maxNum;
|
||||||
if (tWorkerInit(pPool) != 0) {
|
if (tQWorkerInit(pPool) != 0) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pWorker->queue = tWorkerAllocQueue(pPool, pDnode, (FProcessItem)queueFp);
|
pWorker->queue = tQWorkerAllocQueue(pPool, pDnode, (FItem)queueFp);
|
||||||
if (pWorker->queue == NULL) {
|
if (pWorker->queue == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (pWorker->type == DND_WORKER_MULTI) {
|
} else if (pWorker->type == DND_WORKER_MULTI) {
|
||||||
SMWorkerPool *pPool = &pWorker->mpool;
|
SWWorkerPool *pPool = &pWorker->mpool;
|
||||||
pPool->name = name;
|
pPool->name = name;
|
||||||
pPool->max = maxNum;
|
pPool->max = maxNum;
|
||||||
if (tMWorkerInit(pPool) != 0) {
|
if (tWWorkerInit(pPool) != 0) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pWorker->queue = tMWorkerAllocQueue(pPool, pDnode, (FProcessItems)queueFp);
|
pWorker->queue = tWWorkerAllocQueue(pPool, pDnode, (FItems)queueFp);
|
||||||
if (pWorker->queue == NULL) {
|
if (pWorker->queue == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -70,11 +70,11 @@ void dndCleanupWorker(SDnodeWorker *pWorker) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pWorker->type == DND_WORKER_SINGLE) {
|
if (pWorker->type == DND_WORKER_SINGLE) {
|
||||||
tWorkerCleanup(&pWorker->pool);
|
tQWorkerCleanup(&pWorker->pool);
|
||||||
tWorkerFreeQueue(&pWorker->pool, pWorker->queue);
|
tQWorkerFreeQueue(&pWorker->pool, pWorker->queue);
|
||||||
} else if (pWorker->type == DND_WORKER_MULTI) {
|
} else if (pWorker->type == DND_WORKER_MULTI) {
|
||||||
tMWorkerCleanup(&pWorker->mpool);
|
tWWorkerCleanup(&pWorker->mpool);
|
||||||
tMWorkerFreeQueue(&pWorker->mpool, pWorker->queue);
|
tWWorkerFreeQueue(&pWorker->mpool, pWorker->queue);
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ extern "C" {
|
||||||
int32_t mndInitConsumer(SMnode *pMnode);
|
int32_t mndInitConsumer(SMnode *pMnode);
|
||||||
void mndCleanupConsumer(SMnode *pMnode);
|
void mndCleanupConsumer(SMnode *pMnode);
|
||||||
|
|
||||||
SMqConsumerObj *mndAcquireConsumer(SMnode *pMnode, int32_t consumerId);
|
SMqConsumerObj *mndAcquireConsumer(SMnode *pMnode, int64_t consumerId);
|
||||||
void mndReleaseConsumer(SMnode *pMnode, SMqConsumerObj *pConsumer);
|
void mndReleaseConsumer(SMnode *pMnode, SMqConsumerObj *pConsumer);
|
||||||
|
|
||||||
SSdbRaw *mndConsumerActionEncode(SMqConsumerObj *pConsumer);
|
SSdbRaw *mndConsumerActionEncode(SMqConsumerObj *pConsumer);
|
||||||
|
|
|
@ -363,9 +363,7 @@ typedef struct SMqConsumerEp {
|
||||||
int64_t consumerId; // -1 for unassigned
|
int64_t consumerId; // -1 for unassigned
|
||||||
int64_t lastConsumerHbTs;
|
int64_t lastConsumerHbTs;
|
||||||
int64_t lastVgHbTs;
|
int64_t lastVgHbTs;
|
||||||
uint32_t qmsgLen;
|
|
||||||
char* qmsg;
|
char* qmsg;
|
||||||
//SSubQueryMsg qExec;
|
|
||||||
} SMqConsumerEp;
|
} SMqConsumerEp;
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tEncodeSMqConsumerEp(void** buf, SMqConsumerEp* pConsumerEp) {
|
static FORCE_INLINE int32_t tEncodeSMqConsumerEp(void** buf, SMqConsumerEp* pConsumerEp) {
|
||||||
|
@ -374,9 +372,10 @@ static FORCE_INLINE int32_t tEncodeSMqConsumerEp(void** buf, SMqConsumerEp* pCon
|
||||||
tlen += taosEncodeFixedI32(buf, pConsumerEp->status);
|
tlen += taosEncodeFixedI32(buf, pConsumerEp->status);
|
||||||
tlen += taosEncodeSEpSet(buf, &pConsumerEp->epSet);
|
tlen += taosEncodeSEpSet(buf, &pConsumerEp->epSet);
|
||||||
tlen += taosEncodeFixedI64(buf, pConsumerEp->consumerId);
|
tlen += taosEncodeFixedI64(buf, pConsumerEp->consumerId);
|
||||||
|
tlen += taosEncodeFixedI64(buf, pConsumerEp->lastConsumerHbTs);
|
||||||
|
tlen += taosEncodeFixedI64(buf, pConsumerEp->lastVgHbTs);
|
||||||
//tlen += tEncodeSSubQueryMsg(buf, &pConsumerEp->qExec);
|
//tlen += tEncodeSSubQueryMsg(buf, &pConsumerEp->qExec);
|
||||||
tlen += taosEncodeFixedU32(buf, pConsumerEp->qmsgLen);
|
tlen += taosEncodeString(buf, pConsumerEp->qmsg);
|
||||||
tlen += taosEncodeBinary(buf, pConsumerEp->qmsg, pConsumerEp->qmsgLen);
|
|
||||||
return tlen;
|
return tlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -385,9 +384,10 @@ static FORCE_INLINE void* tDecodeSMqConsumerEp(void** buf, SMqConsumerEp* pConsu
|
||||||
buf = taosDecodeFixedI32(buf, &pConsumerEp->status);
|
buf = taosDecodeFixedI32(buf, &pConsumerEp->status);
|
||||||
buf = taosDecodeSEpSet(buf, &pConsumerEp->epSet);
|
buf = taosDecodeSEpSet(buf, &pConsumerEp->epSet);
|
||||||
buf = taosDecodeFixedI64(buf, &pConsumerEp->consumerId);
|
buf = taosDecodeFixedI64(buf, &pConsumerEp->consumerId);
|
||||||
|
buf = taosDecodeFixedI64(buf, &pConsumerEp->lastConsumerHbTs);
|
||||||
|
buf = taosDecodeFixedI64(buf, &pConsumerEp->lastVgHbTs);
|
||||||
//buf = tDecodeSSubQueryMsg(buf, &pConsumerEp->qExec);
|
//buf = tDecodeSSubQueryMsg(buf, &pConsumerEp->qExec);
|
||||||
buf = taosDecodeFixedU32(buf, &pConsumerEp->qmsgLen);
|
buf = taosDecodeString(buf, &pConsumerEp->qmsg);
|
||||||
buf = taosDecodeBinary(buf, (void**)&pConsumerEp->qmsg, pConsumerEp->qmsgLen);
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -423,18 +423,27 @@ static FORCE_INLINE SMqSubscribeObj* tNewSubscribeObj() {
|
||||||
free(pSub);
|
free(pSub);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
pSub->idleConsumer = taosArrayInit(0, sizeof(SMqConsumerEp));
|
pSub->lostConsumer = taosArrayInit(0, sizeof(SMqConsumerEp));
|
||||||
if (pSub->assigned == NULL) {
|
if (pSub->lostConsumer == NULL) {
|
||||||
taosArrayDestroy(pSub->availConsumer);
|
taosArrayDestroy(pSub->availConsumer);
|
||||||
taosArrayDestroy(pSub->idleConsumer);
|
taosArrayDestroy(pSub->assigned);
|
||||||
|
free(pSub);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
pSub->idleConsumer = taosArrayInit(0, sizeof(SMqConsumerEp));
|
||||||
|
if (pSub->idleConsumer == NULL) {
|
||||||
|
taosArrayDestroy(pSub->availConsumer);
|
||||||
|
taosArrayDestroy(pSub->assigned);
|
||||||
|
taosArrayDestroy(pSub->lostConsumer);
|
||||||
free(pSub);
|
free(pSub);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
pSub->unassignedVg = taosArrayInit(0, sizeof(SMqConsumerEp));
|
pSub->unassignedVg = taosArrayInit(0, sizeof(SMqConsumerEp));
|
||||||
if (pSub->assigned == NULL) {
|
if (pSub->unassignedVg == NULL) {
|
||||||
taosArrayDestroy(pSub->availConsumer);
|
taosArrayDestroy(pSub->availConsumer);
|
||||||
|
taosArrayDestroy(pSub->assigned);
|
||||||
|
taosArrayDestroy(pSub->lostConsumer);
|
||||||
taosArrayDestroy(pSub->idleConsumer);
|
taosArrayDestroy(pSub->idleConsumer);
|
||||||
taosArrayDestroy(pSub->unassignedVg);
|
|
||||||
free(pSub);
|
free(pSub);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -461,6 +470,13 @@ static FORCE_INLINE int32_t tEncodeSubscribeObj(void** buf, const SMqSubscribeOb
|
||||||
tlen += tEncodeSMqConsumerEp(buf, pCEp);
|
tlen += tEncodeSMqConsumerEp(buf, pCEp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sz = taosArrayGetSize(pSub->lostConsumer);
|
||||||
|
tlen += taosEncodeFixedI32(buf, sz);
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
SMqConsumerEp* pCEp = taosArrayGet(pSub->lostConsumer, i);
|
||||||
|
tlen += tEncodeSMqConsumerEp(buf, pCEp);
|
||||||
|
}
|
||||||
|
|
||||||
sz = taosArrayGetSize(pSub->idleConsumer);
|
sz = taosArrayGetSize(pSub->idleConsumer);
|
||||||
tlen += taosEncodeFixedI32(buf, sz);
|
tlen += taosEncodeFixedI32(buf, sz);
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
@ -485,20 +501,47 @@ static FORCE_INLINE void* tDecodeSubscribeObj(void* buf, SMqSubscribeObj* pSub)
|
||||||
int32_t sz;
|
int32_t sz;
|
||||||
|
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
buf = taosDecodeFixedI32(buf, &sz);
|
||||||
pSub->assigned = taosArrayInit(sz, sizeof(int64_t));
|
pSub->availConsumer = taosArrayInit(sz, sizeof(int64_t));
|
||||||
if (pSub->assigned == NULL) {
|
if (pSub->availConsumer == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
int64_t consumerId;
|
int64_t consumerId;
|
||||||
buf = taosDecodeFixedI64(buf, &consumerId);
|
buf = taosDecodeFixedI64(buf, &consumerId);
|
||||||
taosArrayPush(pSub->assigned, &consumerId);
|
taosArrayPush(pSub->availConsumer, &consumerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = taosDecodeFixedI32(buf, &sz);
|
||||||
|
pSub->assigned = taosArrayInit(sz, sizeof(SMqConsumerEp));
|
||||||
|
if (pSub->assigned == NULL) {
|
||||||
|
taosArrayDestroy(pSub->availConsumer);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
SMqConsumerEp cEp;
|
||||||
|
buf = tDecodeSMqConsumerEp(buf, &cEp);
|
||||||
|
taosArrayPush(pSub->assigned, &cEp);
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = taosDecodeFixedI32(buf, &sz);
|
||||||
|
pSub->lostConsumer = taosArrayInit(sz, sizeof(SMqConsumerEp));
|
||||||
|
if (pSub->lostConsumer == NULL) {
|
||||||
|
taosArrayDestroy(pSub->availConsumer);
|
||||||
|
taosArrayDestroy(pSub->assigned);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
SMqConsumerEp cEp;
|
||||||
|
buf = tDecodeSMqConsumerEp(buf, &cEp);
|
||||||
|
taosArrayPush(pSub->lostConsumer, &cEp);
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
buf = taosDecodeFixedI32(buf, &sz);
|
||||||
pSub->idleConsumer = taosArrayInit(sz, sizeof(SMqConsumerEp));
|
pSub->idleConsumer = taosArrayInit(sz, sizeof(SMqConsumerEp));
|
||||||
if (pSub->idleConsumer == NULL) {
|
if (pSub->idleConsumer == NULL) {
|
||||||
|
taosArrayDestroy(pSub->availConsumer);
|
||||||
taosArrayDestroy(pSub->assigned);
|
taosArrayDestroy(pSub->assigned);
|
||||||
|
taosArrayDestroy(pSub->lostConsumer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
@ -507,10 +550,13 @@ static FORCE_INLINE void* tDecodeSubscribeObj(void* buf, SMqSubscribeObj* pSub)
|
||||||
taosArrayPush(pSub->idleConsumer, &cEp);
|
taosArrayPush(pSub->idleConsumer, &cEp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
buf = taosDecodeFixedI32(buf, &sz);
|
||||||
pSub->unassignedVg = taosArrayInit(sz, sizeof(SMqConsumerEp));
|
pSub->unassignedVg = taosArrayInit(sz, sizeof(SMqConsumerEp));
|
||||||
if (pSub->unassignedVg == NULL) {
|
if (pSub->unassignedVg == NULL) {
|
||||||
|
taosArrayDestroy(pSub->availConsumer);
|
||||||
taosArrayDestroy(pSub->assigned);
|
taosArrayDestroy(pSub->assigned);
|
||||||
|
taosArrayDestroy(pSub->lostConsumer);
|
||||||
taosArrayDestroy(pSub->idleConsumer);
|
taosArrayDestroy(pSub->idleConsumer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -580,7 +626,10 @@ static FORCE_INLINE int32_t tEncodeSMqConsumerTopic(void** buf, SMqConsumerTopic
|
||||||
int32_t tlen = 0;
|
int32_t tlen = 0;
|
||||||
tlen += taosEncodeString(buf, pConsumerTopic->name);
|
tlen += taosEncodeString(buf, pConsumerTopic->name);
|
||||||
tlen += taosEncodeFixedI32(buf, pConsumerTopic->epoch);
|
tlen += taosEncodeFixedI32(buf, pConsumerTopic->epoch);
|
||||||
int32_t sz = taosArrayGetSize(pConsumerTopic->pVgInfo);
|
int32_t sz = 0;
|
||||||
|
if (pConsumerTopic->pVgInfo != NULL) {
|
||||||
|
sz = taosArrayGetSize(pConsumerTopic->pVgInfo);
|
||||||
|
}
|
||||||
tlen += taosEncodeFixedI32(buf, sz);
|
tlen += taosEncodeFixedI32(buf, sz);
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
int32_t* pVgInfo = taosArrayGet(pConsumerTopic->pVgInfo, i);
|
int32_t* pVgInfo = taosArrayGet(pConsumerTopic->pVgInfo, i);
|
||||||
|
|
|
@ -40,14 +40,13 @@ static void mndCancelGetNextConsumer(SMnode *pMnode, void *pIter);
|
||||||
|
|
||||||
int32_t mndInitConsumer(SMnode *pMnode) {
|
int32_t mndInitConsumer(SMnode *pMnode) {
|
||||||
SSdbTable table = {.sdbType = SDB_CONSUMER,
|
SSdbTable table = {.sdbType = SDB_CONSUMER,
|
||||||
.keyType = SDB_KEY_BINARY,
|
.keyType = SDB_KEY_INT64,
|
||||||
.encodeFp = (SdbEncodeFp)mndConsumerActionEncode,
|
.encodeFp = (SdbEncodeFp)mndConsumerActionEncode,
|
||||||
.decodeFp = (SdbDecodeFp)mndConsumerActionDecode,
|
.decodeFp = (SdbDecodeFp)mndConsumerActionDecode,
|
||||||
.insertFp = (SdbInsertFp)mndConsumerActionInsert,
|
.insertFp = (SdbInsertFp)mndConsumerActionInsert,
|
||||||
.updateFp = (SdbUpdateFp)mndConsumerActionUpdate,
|
.updateFp = (SdbUpdateFp)mndConsumerActionUpdate,
|
||||||
.deleteFp = (SdbDeleteFp)mndConsumerActionDelete};
|
.deleteFp = (SdbDeleteFp)mndConsumerActionDelete};
|
||||||
|
|
||||||
|
|
||||||
return sdbSetTable(pMnode->pSdb, table);
|
return sdbSetTable(pMnode->pSdb, table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,7 +146,7 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SMqConsumerObj *mndAcquireConsumer(SMnode *pMnode, int32_t consumerId) {
|
SMqConsumerObj *mndAcquireConsumer(SMnode *pMnode, int64_t consumerId) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
SMqConsumerObj *pConsumer = sdbAcquire(pSdb, SDB_CONSUMER, &consumerId);
|
SMqConsumerObj *pConsumer = sdbAcquire(pSdb, SDB_CONSUMER, &consumerId);
|
||||||
if (pConsumer == NULL) {
|
if (pConsumer == NULL) {
|
||||||
|
|
|
@ -226,10 +226,10 @@ static int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) {
|
||||||
if (pCfg->cacheBlockSize < TSDB_MIN_CACHE_BLOCK_SIZE || pCfg->cacheBlockSize > TSDB_MAX_CACHE_BLOCK_SIZE) return -1;
|
if (pCfg->cacheBlockSize < TSDB_MIN_CACHE_BLOCK_SIZE || pCfg->cacheBlockSize > TSDB_MAX_CACHE_BLOCK_SIZE) return -1;
|
||||||
if (pCfg->totalBlocks < TSDB_MIN_TOTAL_BLOCKS || pCfg->totalBlocks > TSDB_MAX_TOTAL_BLOCKS) return -1;
|
if (pCfg->totalBlocks < TSDB_MIN_TOTAL_BLOCKS || pCfg->totalBlocks > TSDB_MAX_TOTAL_BLOCKS) return -1;
|
||||||
if (pCfg->daysPerFile < TSDB_MIN_DAYS_PER_FILE || pCfg->daysPerFile > TSDB_MAX_DAYS_PER_FILE) return -1;
|
if (pCfg->daysPerFile < TSDB_MIN_DAYS_PER_FILE || pCfg->daysPerFile > TSDB_MAX_DAYS_PER_FILE) return -1;
|
||||||
if (pCfg->daysToKeep0 < pCfg->daysPerFile) return -1;
|
|
||||||
if (pCfg->daysToKeep0 < TSDB_MIN_KEEP || pCfg->daysToKeep0 > TSDB_MAX_KEEP) return -1;
|
if (pCfg->daysToKeep0 < TSDB_MIN_KEEP || pCfg->daysToKeep0 > TSDB_MAX_KEEP) return -1;
|
||||||
if (pCfg->daysToKeep1 < TSDB_MIN_KEEP || pCfg->daysToKeep1 > TSDB_MAX_KEEP) return -1;
|
if (pCfg->daysToKeep1 < TSDB_MIN_KEEP || pCfg->daysToKeep1 > TSDB_MAX_KEEP) return -1;
|
||||||
if (pCfg->daysToKeep2 < TSDB_MIN_KEEP || pCfg->daysToKeep2 > TSDB_MAX_KEEP) return -1;
|
if (pCfg->daysToKeep2 < TSDB_MIN_KEEP || pCfg->daysToKeep2 > TSDB_MAX_KEEP) return -1;
|
||||||
|
if (pCfg->daysToKeep0 < pCfg->daysPerFile) return -1;
|
||||||
if (pCfg->daysToKeep0 > pCfg->daysToKeep1) return -1;
|
if (pCfg->daysToKeep0 > pCfg->daysToKeep1) return -1;
|
||||||
if (pCfg->daysToKeep1 > pCfg->daysToKeep2) return -1;
|
if (pCfg->daysToKeep1 > pCfg->daysToKeep2) return -1;
|
||||||
if (pCfg->minRows < TSDB_MIN_MIN_ROW_FBLOCK || pCfg->minRows > TSDB_MAX_MIN_ROW_FBLOCK) return -1;
|
if (pCfg->minRows < TSDB_MIN_MIN_ROW_FBLOCK || pCfg->minRows > TSDB_MAX_MIN_ROW_FBLOCK) return -1;
|
||||||
|
@ -498,7 +498,7 @@ static int32_t mndProcessCreateDbReq(SMnodeMsg *pReq) {
|
||||||
return TSDB_CODE_MND_ACTION_IN_PROGRESS;
|
return TSDB_CODE_MND_ACTION_IN_PROGRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndSetDbCfgFromAlterDbMsg(SDbObj *pDb, SAlterDbReq *pAlter) {
|
static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) {
|
||||||
terrno = TSDB_CODE_MND_DB_OPTION_UNCHANGED;
|
terrno = TSDB_CODE_MND_DB_OPTION_UNCHANGED;
|
||||||
|
|
||||||
if (pAlter->totalBlocks >= 0 && pAlter->totalBlocks != pDb->cfg.totalBlocks) {
|
if (pAlter->totalBlocks >= 0 && pAlter->totalBlocks != pDb->cfg.totalBlocks) {
|
||||||
|
@ -649,7 +649,7 @@ static int32_t mndProcessAlterDbReq(SMnodeMsg *pReq) {
|
||||||
SDbObj dbObj = {0};
|
SDbObj dbObj = {0};
|
||||||
memcpy(&dbObj, pDb, sizeof(SDbObj));
|
memcpy(&dbObj, pDb, sizeof(SDbObj));
|
||||||
|
|
||||||
int32_t code = mndSetDbCfgFromAlterDbMsg(&dbObj, pAlter);
|
int32_t code = mndSetDbCfgFromAlterDbReq(&dbObj, pAlter);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
mndReleaseDb(pMnode, pDb);
|
mndReleaseDb(pMnode, pDb);
|
||||||
mError("db:%s, failed to alter since %s", pAlter->db, tstrerror(code));
|
mError("db:%s, failed to alter since %s", pAlter->db, tstrerror(code));
|
||||||
|
@ -1143,7 +1143,7 @@ static int32_t mndRetrieveDbs(SMnodeMsg *pReq, SShowObj *pShow, char *data, int3
|
||||||
prec = TSDB_TIME_PRECISION_NANO_STR;
|
prec = TSDB_TIME_PRECISION_NANO_STR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(false);
|
prec = "none";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
STR_WITH_SIZE_TO_VARSTR(pWrite, prec, 2);
|
STR_WITH_SIZE_TO_VARSTR(pWrite, prec, 2);
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "mndTrans.h"
|
#include "mndTrans.h"
|
||||||
|
|
||||||
#define SDB_FUNC_VER 1
|
#define SDB_FUNC_VER 1
|
||||||
|
#define SDB_FUNC_RESERVE_SIZE 64
|
||||||
|
|
||||||
static SSdbRaw *mndFuncActionEncode(SFuncObj *pFunc);
|
static SSdbRaw *mndFuncActionEncode(SFuncObj *pFunc);
|
||||||
static SSdbRow *mndFuncActionDecode(SSdbRaw *pRaw);
|
static SSdbRow *mndFuncActionDecode(SSdbRaw *pRaw);
|
||||||
|
@ -60,7 +61,7 @@ void mndCleanupFunc(SMnode *pMnode) {}
|
||||||
static SSdbRaw *mndFuncActionEncode(SFuncObj *pFunc) {
|
static SSdbRaw *mndFuncActionEncode(SFuncObj *pFunc) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
int32_t size = pFunc->commentSize + pFunc->codeSize + sizeof(SFuncObj);
|
int32_t size = pFunc->commentSize + pFunc->codeSize + sizeof(SFuncObj) + SDB_FUNC_RESERVE_SIZE;
|
||||||
SSdbRaw *pRaw = sdbAllocRaw(SDB_FUNC, SDB_FUNC_VER, size);
|
SSdbRaw *pRaw = sdbAllocRaw(SDB_FUNC, SDB_FUNC_VER, size);
|
||||||
if (pRaw == NULL) goto FUNC_ENCODE_OVER;
|
if (pRaw == NULL) goto FUNC_ENCODE_OVER;
|
||||||
|
|
||||||
|
@ -78,6 +79,7 @@ static SSdbRaw *mndFuncActionEncode(SFuncObj *pFunc) {
|
||||||
SDB_SET_INT32(pRaw, dataPos, pFunc->codeSize, FUNC_ENCODE_OVER)
|
SDB_SET_INT32(pRaw, dataPos, pFunc->codeSize, FUNC_ENCODE_OVER)
|
||||||
SDB_SET_BINARY(pRaw, dataPos, pFunc->pComment, pFunc->commentSize, FUNC_ENCODE_OVER)
|
SDB_SET_BINARY(pRaw, dataPos, pFunc->pComment, pFunc->commentSize, FUNC_ENCODE_OVER)
|
||||||
SDB_SET_BINARY(pRaw, dataPos, pFunc->pCode, pFunc->codeSize, FUNC_ENCODE_OVER)
|
SDB_SET_BINARY(pRaw, dataPos, pFunc->pCode, pFunc->codeSize, FUNC_ENCODE_OVER)
|
||||||
|
SDB_SET_RESERVE(pRaw, dataPos, SDB_FUNC_RESERVE_SIZE, FUNC_ENCODE_OVER)
|
||||||
SDB_SET_DATALEN(pRaw, dataPos, FUNC_ENCODE_OVER);
|
SDB_SET_DATALEN(pRaw, dataPos, FUNC_ENCODE_OVER);
|
||||||
|
|
||||||
terrno = 0;
|
terrno = 0;
|
||||||
|
@ -131,6 +133,7 @@ static SSdbRow *mndFuncActionDecode(SSdbRaw *pRaw) {
|
||||||
|
|
||||||
SDB_GET_BINARY(pRaw, dataPos, pFunc->pComment, pFunc->commentSize, FUNC_DECODE_OVER)
|
SDB_GET_BINARY(pRaw, dataPos, pFunc->pComment, pFunc->commentSize, FUNC_DECODE_OVER)
|
||||||
SDB_GET_BINARY(pRaw, dataPos, pFunc->pCode, pFunc->codeSize, FUNC_DECODE_OVER)
|
SDB_GET_BINARY(pRaw, dataPos, pFunc->pCode, pFunc->codeSize, FUNC_DECODE_OVER)
|
||||||
|
SDB_GET_RESERVE(pRaw, dataPos, SDB_FUNC_RESERVE_SIZE, FUNC_DECODE_OVER)
|
||||||
|
|
||||||
terrno = 0;
|
terrno = 0;
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
#define MND_SUBSCRIBE_VER_NUMBER 1
|
#define MND_SUBSCRIBE_VER_NUMBER 1
|
||||||
#define MND_SUBSCRIBE_RESERVE_SIZE 64
|
#define MND_SUBSCRIBE_RESERVE_SIZE 64
|
||||||
|
|
||||||
|
static char *mndMakeSubscribeKey(char *cgroup, char *topicName);
|
||||||
|
|
||||||
static SSdbRaw *mndSubActionEncode(SMqSubscribeObj *);
|
static SSdbRaw *mndSubActionEncode(SMqSubscribeObj *);
|
||||||
static SSdbRow *mndSubActionDecode(SSdbRaw *pRaw);
|
static SSdbRow *mndSubActionDecode(SSdbRaw *pRaw);
|
||||||
static int32_t mndSubActionInsert(SSdb *pSdb, SMqSubscribeObj *);
|
static int32_t mndSubActionInsert(SSdb *pSdb, SMqSubscribeObj *);
|
||||||
|
@ -41,9 +43,10 @@ static int32_t mndProcessSubscribeRsp(SMnodeMsg *pMsg);
|
||||||
static int32_t mndProcessSubscribeInternalReq(SMnodeMsg *pMsg);
|
static int32_t mndProcessSubscribeInternalReq(SMnodeMsg *pMsg);
|
||||||
static int32_t mndProcessSubscribeInternalRsp(SMnodeMsg *pMsg);
|
static int32_t mndProcessSubscribeInternalRsp(SMnodeMsg *pMsg);
|
||||||
static int32_t mndProcessMqTimerMsg(SMnodeMsg *pMsg);
|
static int32_t mndProcessMqTimerMsg(SMnodeMsg *pMsg);
|
||||||
|
static int32_t mndProcessGetSubEpReq(SMnodeMsg *pMsg);
|
||||||
|
|
||||||
static int mndBuildMqSetConsumerVgReq(SMnode *pMnode, STrans *pTrans, SMqConsumerObj *pConsumer,
|
static int mndBuildMqSetConsumerVgReq(SMnode *pMnode, STrans *pTrans, SMqConsumerObj *pConsumer,
|
||||||
SMqConsumerTopic *pConsumerTopic, SMqTopicObj *pTopic);
|
SMqConsumerTopic *pConsumerTopic, SMqTopicObj *pTopic, SMqConsumerEp *pSub);
|
||||||
|
|
||||||
int32_t mndInitSubscribe(SMnode *pMnode) {
|
int32_t mndInitSubscribe(SMnode *pMnode) {
|
||||||
SSdbTable table = {.sdbType = SDB_SUBSCRIBE,
|
SSdbTable table = {.sdbType = SDB_SUBSCRIBE,
|
||||||
|
@ -57,9 +60,64 @@ int32_t mndInitSubscribe(SMnode *pMnode) {
|
||||||
mndSetMsgHandle(pMnode, TDMT_MND_SUBSCRIBE, mndProcessSubscribeReq);
|
mndSetMsgHandle(pMnode, TDMT_MND_SUBSCRIBE, mndProcessSubscribeReq);
|
||||||
mndSetMsgHandle(pMnode, TDMT_VND_MQ_SET_CONN_RSP, mndProcessSubscribeInternalRsp);
|
mndSetMsgHandle(pMnode, TDMT_VND_MQ_SET_CONN_RSP, mndProcessSubscribeInternalRsp);
|
||||||
mndSetMsgHandle(pMnode, TDMT_MND_MQ_TIMER, mndProcessMqTimerMsg);
|
mndSetMsgHandle(pMnode, TDMT_MND_MQ_TIMER, mndProcessMqTimerMsg);
|
||||||
|
mndSetMsgHandle(pMnode, TDMT_MND_GET_SUB_EP, mndProcessGetSubEpReq);
|
||||||
return sdbSetTable(pMnode->pSdb, table);
|
return sdbSetTable(pMnode->pSdb, table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndProcessGetSubEpReq(SMnodeMsg *pMsg) {
|
||||||
|
SMnode *pMnode = pMsg->pMnode;
|
||||||
|
SMqCMGetSubEpReq *pReq = (SMqCMGetSubEpReq *)pMsg->rpcMsg.pCont;
|
||||||
|
SMqCMGetSubEpRsp rsp;
|
||||||
|
int64_t consumerId = be64toh(pReq->consumerId);
|
||||||
|
|
||||||
|
SMqConsumerObj *pConsumer = mndAcquireConsumer(pMsg->pMnode, consumerId);
|
||||||
|
if (pConsumer == NULL) {
|
||||||
|
terrno = TSDB_CODE_MND_CONSUMER_NOT_EXIST;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ASSERT(strcmp(pReq->cgroup, pConsumer->cgroup) == 0);
|
||||||
|
|
||||||
|
strcpy(rsp.cgroup, pReq->cgroup);
|
||||||
|
rsp.consumerId = consumerId;
|
||||||
|
SArray *pTopics = pConsumer->topics;
|
||||||
|
int32_t sz = taosArrayGetSize(pTopics);
|
||||||
|
rsp.topics = taosArrayInit(sz, sizeof(SMqSubTopicEp));
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
SMqSubTopicEp topicEp;
|
||||||
|
SMqConsumerTopic *pConsumerTopic = taosArrayGet(pTopics, i);
|
||||||
|
strcpy(topicEp.topic, pConsumerTopic->name);
|
||||||
|
|
||||||
|
SMqSubscribeObj *pSub = mndAcquireSubscribe(pMnode, pConsumer->cgroup, pConsumerTopic->name);
|
||||||
|
int32_t assignedSz = taosArrayGetSize(pSub->assigned);
|
||||||
|
topicEp.vgs = taosArrayInit(assignedSz, sizeof(SMqSubVgEp));
|
||||||
|
for (int32_t j = 0; j < assignedSz; j++) {
|
||||||
|
SMqConsumerEp *pCEp = taosArrayGet(pSub->assigned, j);
|
||||||
|
if (pCEp->consumerId == consumerId) {
|
||||||
|
SMqSubVgEp vgEp = {
|
||||||
|
.epSet = pCEp->epSet,
|
||||||
|
.vgId = pCEp->vgId
|
||||||
|
};
|
||||||
|
taosArrayPush(topicEp.vgs, &vgEp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (taosArrayGetSize(topicEp.vgs) != 0) {
|
||||||
|
taosArrayPush(rsp.topics, &topicEp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int32_t tlen = tEncodeSMqCMGetSubEpRsp(NULL, &rsp);
|
||||||
|
void *buf = rpcMallocCont(tlen);
|
||||||
|
if (buf == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
void *abuf = buf;
|
||||||
|
tEncodeSMqCMGetSubEpRsp(&abuf, &rsp);
|
||||||
|
//TODO: free rsp
|
||||||
|
pMsg->pCont = buf;
|
||||||
|
pMsg->contLen = tlen;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndSplitSubscribeKey(char *key, char **topic, char **cgroup) {
|
static int32_t mndSplitSubscribeKey(char *key, char **topic, char **cgroup) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (key[i] != ':') {
|
while (key[i] != ':') {
|
||||||
|
@ -97,7 +155,7 @@ static int32_t mndProcessMqTimerMsg(SMnodeMsg *pMsg) {
|
||||||
|
|
||||||
// build msg
|
// build msg
|
||||||
|
|
||||||
SMqSetCVgReq* pReq = malloc(sizeof(SMqSetCVgReq) + pCEp->qmsgLen);
|
SMqSetCVgReq *pReq = malloc(sizeof(SMqSetCVgReq));
|
||||||
if (pReq == NULL) {
|
if (pReq == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -107,8 +165,7 @@ static int32_t mndProcessMqTimerMsg(SMnodeMsg *pMsg) {
|
||||||
pReq->sql = strdup(pTopic->sql);
|
pReq->sql = strdup(pTopic->sql);
|
||||||
pReq->logicalPlan = strdup(pTopic->logicalPlan);
|
pReq->logicalPlan = strdup(pTopic->logicalPlan);
|
||||||
pReq->physicalPlan = strdup(pTopic->physicalPlan);
|
pReq->physicalPlan = strdup(pTopic->physicalPlan);
|
||||||
pReq->qmsgLen = pCEp->qmsgLen;
|
pReq->qmsg = strdup(pCEp->qmsg);
|
||||||
memcpy(pReq->qmsg, pCEp->qmsg, pCEp->qmsgLen);
|
|
||||||
int32_t tlen = tEncodeSMqSetCVgReq(NULL, pReq);
|
int32_t tlen = tEncodeSMqSetCVgReq(NULL, pReq);
|
||||||
void *reqStr = malloc(tlen);
|
void *reqStr = malloc(tlen);
|
||||||
if (reqStr == NULL) {
|
if (reqStr == NULL) {
|
||||||
|
@ -137,7 +194,7 @@ static int32_t mndProcessMqTimerMsg(SMnodeMsg *pMsg) {
|
||||||
if (mndTransPrepare(pMnode, pTrans) != 0) {
|
if (mndTransPrepare(pMnode, pTrans) != 0) {
|
||||||
mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
|
mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
|
||||||
}
|
}
|
||||||
mndReleaseTopic(pMnode, pTopic);
|
/*mndReleaseTopic(pMnode, pTopic);*/
|
||||||
mndTransDrop(pTrans);
|
mndTransDrop(pTrans);
|
||||||
}
|
}
|
||||||
pIter = sdbFetch(pSdb, SDB_SUBSCRIBE, NULL, (void **)&pSub);
|
pIter = sdbFetch(pSdb, SDB_SUBSCRIBE, NULL, (void **)&pSub);
|
||||||
|
@ -151,7 +208,9 @@ static int mndInitUnassignedVg(SMnode *pMnode, SMqTopicObj *pTopic, SArray *unas
|
||||||
SArray *pArray;
|
SArray *pArray;
|
||||||
SArray *inner = taosArrayGet(pDag->pSubplans, 0);
|
SArray *inner = taosArrayGet(pDag->pSubplans, 0);
|
||||||
SSubplan *plan = taosArrayGetP(inner, 0);
|
SSubplan *plan = taosArrayGetP(inner, 0);
|
||||||
|
plan->execNode.inUse = 0;
|
||||||
|
strcpy(plan->execNode.epAddr[0].fqdn, "localhost");
|
||||||
|
plan->execNode.epAddr[0].port = 6030;
|
||||||
plan->execNode.nodeId = 2;
|
plan->execNode.nodeId = 2;
|
||||||
SEpSet* pEpSet = &plan->execNode.epset;
|
SEpSet* pEpSet = &plan->execNode.epset;
|
||||||
|
|
||||||
|
@ -167,17 +226,14 @@ static int mndInitUnassignedVg(SMnode *pMnode, SMqTopicObj *pTopic, SArray *unas
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
SMqConsumerEp CEp;
|
SMqConsumerEp CEp;
|
||||||
CEp.status = 0;
|
CEp.status = 0;
|
||||||
|
CEp.consumerId = -1;
|
||||||
CEp.lastConsumerHbTs = CEp.lastVgHbTs = -1;
|
CEp.lastConsumerHbTs = CEp.lastVgHbTs = -1;
|
||||||
STaskInfo *pTaskInfo = taosArrayGet(pArray, i);
|
STaskInfo *pTaskInfo = taosArrayGet(pArray, i);
|
||||||
CEp.epSet = pTaskInfo->addr.epset;
|
tConvertQueryAddrToEpSet(&CEp.epSet, &pTaskInfo->addr);
|
||||||
/*mDebug("subscribe convert ep %d %s %s %s %s %s\n", CEp.epSet.numOfEps, CEp.epSet.fqdn[0], CEp.epSet.fqdn[1], CEp.epSet.fqdn[2], CEp.epSet.fqdn[3], CEp.epSet.fqdn[4]);*/
|
/*mDebug("subscribe convert ep %d %s %s %s %s %s\n", CEp.epSet.numOfEps, CEp.epSet.fqdn[0], CEp.epSet.fqdn[1],
|
||||||
|
* CEp.epSet.fqdn[2], CEp.epSet.fqdn[3], CEp.epSet.fqdn[4]);*/
|
||||||
CEp.vgId = pTaskInfo->addr.nodeId;
|
CEp.vgId = pTaskInfo->addr.nodeId;
|
||||||
CEp.qmsgLen = pTaskInfo->msg->contentLen;
|
CEp.qmsg = strdup(pTaskInfo->msg->msg);
|
||||||
CEp.qmsg = malloc(CEp.qmsgLen);
|
|
||||||
if (CEp.qmsg == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
memcpy(CEp.qmsg, pTaskInfo->msg->msg, pTaskInfo->msg->contentLen);
|
|
||||||
taosArrayPush(unassignedVg, &CEp);
|
taosArrayPush(unassignedVg, &CEp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,7 +242,7 @@ static int mndInitUnassignedVg(SMnode *pMnode, SMqTopicObj *pTopic, SArray *unas
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mndBuildMqSetConsumerVgReq(SMnode *pMnode, STrans *pTrans, SMqConsumerObj *pConsumer,
|
static int mndBuildMqSetConsumerVgReq(SMnode *pMnode, STrans *pTrans, SMqConsumerObj *pConsumer,
|
||||||
SMqConsumerTopic *pConsumerTopic, SMqTopicObj *pTopic) {
|
SMqConsumerTopic *pConsumerTopic, SMqTopicObj *pTopic, SMqConsumerEp *pCEp) {
|
||||||
int32_t sz = taosArrayGetSize(pConsumerTopic->pVgInfo);
|
int32_t sz = taosArrayGetSize(pConsumerTopic->pVgInfo);
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
int32_t vgId = *(int32_t *)taosArrayGet(pConsumerTopic->pVgInfo, i);
|
int32_t vgId = *(int32_t *)taosArrayGet(pConsumerTopic->pVgInfo, i);
|
||||||
|
@ -201,6 +257,7 @@ static int mndBuildMqSetConsumerVgReq(SMnode *pMnode, STrans *pTrans, SMqConsume
|
||||||
req.sql = pTopic->sql;
|
req.sql = pTopic->sql;
|
||||||
req.logicalPlan = pTopic->logicalPlan;
|
req.logicalPlan = pTopic->logicalPlan;
|
||||||
req.physicalPlan = pTopic->physicalPlan;
|
req.physicalPlan = pTopic->physicalPlan;
|
||||||
|
req.qmsg = pCEp->qmsg;
|
||||||
int32_t tlen = tEncodeSMqSetCVgReq(NULL, &req);
|
int32_t tlen = tEncodeSMqSetCVgReq(NULL, &req);
|
||||||
void *buf = malloc(sizeof(SMsgHead) + tlen);
|
void *buf = malloc(sizeof(SMsgHead) + tlen);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
|
@ -219,7 +276,7 @@ static int mndBuildMqSetConsumerVgReq(SMnode *pMnode, STrans *pTrans, SMqConsume
|
||||||
STransAction action = {0};
|
STransAction action = {0};
|
||||||
action.epSet = mndGetVgroupEpset(pMnode, pVgObj);
|
action.epSet = mndGetVgroupEpset(pMnode, pVgObj);
|
||||||
action.pCont = buf;
|
action.pCont = buf;
|
||||||
action.contLen = tlen;
|
action.contLen = sizeof(SMsgHead) + tlen;
|
||||||
action.msgType = TDMT_VND_MQ_SET_CONN;
|
action.msgType = TDMT_VND_MQ_SET_CONN;
|
||||||
|
|
||||||
mndReleaseVgroup(pMnode, pVgObj);
|
mndReleaseVgroup(pMnode, pVgObj);
|
||||||
|
@ -509,12 +566,15 @@ static int32_t mndProcessSubscribeReq(SMnodeMsg *pMsg) {
|
||||||
if (taosArrayGetSize(pConsumerTopic->pVgInfo) > 0) {
|
if (taosArrayGetSize(pConsumerTopic->pVgInfo) > 0) {
|
||||||
ASSERT(taosArrayGetSize(pConsumerTopic->pVgInfo) == 1);
|
ASSERT(taosArrayGetSize(pConsumerTopic->pVgInfo) == 1);
|
||||||
int32_t vgId = *(int32_t *)taosArrayGetLast(pConsumerTopic->pVgInfo);
|
int32_t vgId = *(int32_t *)taosArrayGetLast(pConsumerTopic->pVgInfo);
|
||||||
// send setmsg to vnode
|
SMqConsumerEp *pCEp = taosArrayGetLast(pSub->assigned);
|
||||||
if (mndBuildMqSetConsumerVgReq(pMnode, pTrans, pConsumer, pConsumerTopic, pTopic) < 0) {
|
if (pCEp->vgId == vgId) {
|
||||||
|
if (mndBuildMqSetConsumerVgReq(pMnode, pTrans, pConsumer, pConsumerTopic, pTopic, pCEp) < 0) {
|
||||||
// TODO
|
// TODO
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// send setmsg to vnode
|
||||||
|
}
|
||||||
|
|
||||||
SSdbRaw *pRaw = mndSubActionEncode(pSub);
|
SSdbRaw *pRaw = mndSubActionEncode(pSub);
|
||||||
sdbSetRawStatus(pRaw, SDB_STATUS_READY);
|
sdbSetRawStatus(pRaw, SDB_STATUS_READY);
|
||||||
|
@ -570,14 +630,14 @@ static int32_t mndProcessSubscribeReq(SMnodeMsg *pMsg) {
|
||||||
mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
|
mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
|
||||||
if (newSub) taosArrayDestroy(newSub);
|
if (newSub) taosArrayDestroy(newSub);
|
||||||
mndTransDrop(pTrans);
|
mndTransDrop(pTrans);
|
||||||
mndReleaseConsumer(pMnode, pConsumer);
|
/*mndReleaseConsumer(pMnode, pConsumer);*/
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newSub) taosArrayDestroy(newSub);
|
if (newSub) taosArrayDestroy(newSub);
|
||||||
mndTransDrop(pTrans);
|
mndTransDrop(pTrans);
|
||||||
mndReleaseConsumer(pMnode, pConsumer);
|
/*mndReleaseConsumer(pMnode, pConsumer);*/
|
||||||
return 0;
|
return TSDB_CODE_MND_ACTION_IN_PROGRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndProcessSubscribeInternalRsp(SMnodeMsg *pRsp) {
|
static int32_t mndProcessSubscribeInternalRsp(SMnodeMsg *pRsp) {
|
||||||
|
|
|
@ -237,7 +237,7 @@ static int32_t mndCreateTopic(SMnode *pMnode, SMnodeMsg *pMsg, SCMCreateTopicReq
|
||||||
tstrncpy(topicObj.db, pDb->name, TSDB_DB_FNAME_LEN);
|
tstrncpy(topicObj.db, pDb->name, TSDB_DB_FNAME_LEN);
|
||||||
topicObj.createTime = taosGetTimestampMs();
|
topicObj.createTime = taosGetTimestampMs();
|
||||||
topicObj.updateTime = topicObj.createTime;
|
topicObj.updateTime = topicObj.createTime;
|
||||||
topicObj.uid = mndGenerateUid(pCreate->name, TSDB_TABLE_FNAME_LEN);
|
topicObj.uid = mndGenerateUid(pCreate->name, strlen(pCreate->name));
|
||||||
topicObj.dbUid = pDb->uid;
|
topicObj.dbUid = pDb->uid;
|
||||||
topicObj.version = 1;
|
topicObj.version = 1;
|
||||||
topicObj.sql = strdup(pCreate->sql);
|
topicObj.sql = strdup(pCreate->sql);
|
||||||
|
|
|
@ -930,4 +930,6 @@ void mndTransPullup(SMnode *pMnode) {
|
||||||
mndTransExecute(pMnode, pTrans);
|
mndTransExecute(pMnode, pTrans);
|
||||||
sdbRelease(pMnode->pSdb, pTrans);
|
sdbRelease(pMnode->pSdb, pTrans);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sdbWriteFile(pMnode->pSdb);
|
||||||
}
|
}
|
||||||
|
|
|
@ -178,7 +178,7 @@ static int32_t mndVgroupActionUpdate(SSdb *pSdb, SVgObj *pOld, SVgObj *pNew) {
|
||||||
SVgObj *mndAcquireVgroup(SMnode *pMnode, int32_t vgId) {
|
SVgObj *mndAcquireVgroup(SMnode *pMnode, int32_t vgId) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
SVgObj *pVgroup = sdbAcquire(pSdb, SDB_VGROUP, &vgId);
|
SVgObj *pVgroup = sdbAcquire(pSdb, SDB_VGROUP, &vgId);
|
||||||
if (pVgroup == NULL) {
|
if (pVgroup == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
|
||||||
terrno = TSDB_CODE_MND_VGROUP_NOT_EXIST;
|
terrno = TSDB_CODE_MND_VGROUP_NOT_EXIST;
|
||||||
}
|
}
|
||||||
return pVgroup;
|
return pVgroup;
|
||||||
|
|
|
@ -64,11 +64,7 @@ SSdb *sdbInit(SSdbOpt *pOption) {
|
||||||
void sdbCleanup(SSdb *pSdb) {
|
void sdbCleanup(SSdb *pSdb) {
|
||||||
mDebug("start to cleanup sdb");
|
mDebug("start to cleanup sdb");
|
||||||
|
|
||||||
if (pSdb->curVer > pSdb->lastCommitVer) {
|
|
||||||
mDebug("write sdb file for current ver:%" PRId64 " larger than last commit ver:%" PRId64, pSdb->curVer,
|
|
||||||
pSdb->lastCommitVer);
|
|
||||||
sdbWriteFile(pSdb);
|
sdbWriteFile(pSdb);
|
||||||
}
|
|
||||||
|
|
||||||
if (pSdb->currDir != NULL) {
|
if (pSdb->currDir != NULL) {
|
||||||
tfree(pSdb->currDir);
|
tfree(pSdb->currDir);
|
||||||
|
|
|
@ -221,7 +221,7 @@ PARSE_SDB_DATA_ERROR:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t sdbWriteFile(SSdb *pSdb) {
|
static int32_t sdbWriteFileImp(SSdb *pSdb) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
char tmpfile[PATH_MAX] = {0};
|
char tmpfile[PATH_MAX] = {0};
|
||||||
|
@ -229,7 +229,8 @@ int32_t sdbWriteFile(SSdb *pSdb) {
|
||||||
char curfile[PATH_MAX] = {0};
|
char curfile[PATH_MAX] = {0};
|
||||||
snprintf(curfile, sizeof(curfile), "%s%ssdb.data", pSdb->currDir, TD_DIRSEP);
|
snprintf(curfile, sizeof(curfile), "%s%ssdb.data", pSdb->currDir, TD_DIRSEP);
|
||||||
|
|
||||||
mDebug("start to write file:%s", curfile);
|
mDebug("start to write file:%s, current ver:%" PRId64 ", commit ver:%" PRId64, curfile, pSdb->curVer,
|
||||||
|
pSdb->lastCommitVer);
|
||||||
|
|
||||||
FileFd fd = taosOpenFileCreateWriteTrunc(tmpfile);
|
FileFd fd = taosOpenFileCreateWriteTrunc(tmpfile);
|
||||||
if (fd <= 0) {
|
if (fd <= 0) {
|
||||||
|
@ -323,12 +324,20 @@ int32_t sdbWriteFile(SSdb *pSdb) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t sdbWriteFile(SSdb *pSdb) {
|
||||||
|
if (pSdb->curVer == pSdb->lastCommitVer) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sdbWriteFileImp(pSdb);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t sdbDeploy(SSdb *pSdb) {
|
int32_t sdbDeploy(SSdb *pSdb) {
|
||||||
if (sdbRunDeployFp(pSdb) != 0) {
|
if (sdbRunDeployFp(pSdb) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sdbWriteFile(pSdb) != 0) {
|
if (sdbWriteFileImp(pSdb) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -318,8 +318,8 @@ int tqRegisterContext(STqGroup*, void* ahandle);
|
||||||
int tqSendLaunchQuery(STqMsgItem*, int64_t offset);
|
int tqSendLaunchQuery(STqMsgItem*, int64_t offset);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg** ppRsp);
|
int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg);
|
||||||
int32_t tqProcessSetConnReq(STQ* pTq, char* msg, SRpcMsg** ppRsp);
|
int32_t tqProcessSetConnReq(STQ* pTq, char* msg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ extern "C" {
|
||||||
typedef struct SVnode SVnode;
|
typedef struct SVnode SVnode;
|
||||||
typedef struct SDnode SDnode;
|
typedef struct SDnode SDnode;
|
||||||
typedef int32_t (*PutReqToVQueryQFp)(SDnode *pDnode, struct SRpcMsg *pReq);
|
typedef int32_t (*PutReqToVQueryQFp)(SDnode *pDnode, struct SRpcMsg *pReq);
|
||||||
|
typedef int32_t (*SendReqToDnodeFp)(SDnode *pDnode, struct SEpSet *epSet, struct SRpcMsg *rpcMsg);
|
||||||
|
|
||||||
typedef struct STqCfg {
|
typedef struct STqCfg {
|
||||||
// TODO
|
// TODO
|
||||||
|
@ -64,6 +65,7 @@ typedef struct {
|
||||||
const char *charset;
|
const char *charset;
|
||||||
uint16_t nthreads; // number of commit threads. 0 for no threads and a schedule queue should be given (TODO)
|
uint16_t nthreads; // number of commit threads. 0 for no threads and a schedule queue should be given (TODO)
|
||||||
PutReqToVQueryQFp putReqToVQueryQFp;
|
PutReqToVQueryQFp putReqToVQueryQFp;
|
||||||
|
SendReqToDnodeFp sendReqToDnodeFp;
|
||||||
} SVnodeOpt;
|
} SVnodeOpt;
|
||||||
|
|
||||||
typedef struct STqReadHandle {
|
typedef struct STqReadHandle {
|
||||||
|
@ -159,20 +161,18 @@ int vnodeProcessSyncReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp);
|
||||||
*
|
*
|
||||||
* @param pVnode The vnode object.
|
* @param pVnode The vnode object.
|
||||||
* @param pMsg The request message
|
* @param pMsg The request message
|
||||||
* @param pRsp The response message
|
|
||||||
* @return int 0 for success, -1 for failure
|
* @return int 0 for success, -1 for failure
|
||||||
*/
|
*/
|
||||||
int vnodeProcessQueryReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp);
|
int vnodeProcessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Process a fetch message.
|
* @brief Process a fetch message.
|
||||||
*
|
*
|
||||||
* @param pVnode The vnode object.
|
* @param pVnode The vnode object.
|
||||||
* @param pMsg The request message
|
* @param pMsg The request message
|
||||||
* @param pRsp The response message
|
|
||||||
* @return int 0 for success, -1 for failure
|
* @return int 0 for success, -1 for failure
|
||||||
*/
|
*/
|
||||||
int vnodeProcessFetchReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp);
|
int vnodeProcessFetchMsg(SVnode *pVnode, SRpcMsg *pMsg);
|
||||||
|
|
||||||
/* ------------------------ SVnodeCfg ------------------------ */
|
/* ------------------------ SVnodeCfg ------------------------ */
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -55,6 +55,7 @@ typedef struct SVnodeMgr {
|
||||||
// For vnode Mgmt
|
// For vnode Mgmt
|
||||||
SDnode* pDnode;
|
SDnode* pDnode;
|
||||||
PutReqToVQueryQFp putReqToVQueryQFp;
|
PutReqToVQueryQFp putReqToVQueryQFp;
|
||||||
|
SendReqToDnodeFp sendReqToDnodeFp;
|
||||||
} SVnodeMgr;
|
} SVnodeMgr;
|
||||||
|
|
||||||
extern SVnodeMgr vnodeMgr;
|
extern SVnodeMgr vnodeMgr;
|
||||||
|
@ -85,6 +86,7 @@ struct SVnode {
|
||||||
int vnodeScheduleTask(SVnodeTask* task);
|
int vnodeScheduleTask(SVnodeTask* task);
|
||||||
|
|
||||||
int32_t vnodePutReqToVQueryQ(SVnode* pVnode, struct SRpcMsg* pReq);
|
int32_t vnodePutReqToVQueryQ(SVnode* pVnode, struct SRpcMsg* pReq);
|
||||||
|
void vnodeSendReqToDnode(SVnode* pVnode, struct SEpSet* epSet, struct SRpcMsg* pReq);
|
||||||
|
|
||||||
// For Log
|
// For Log
|
||||||
extern int32_t vDebugFlag;
|
extern int32_t vDebugFlag;
|
||||||
|
|
|
@ -667,7 +667,7 @@ int tqItemSSize() {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg** ppRsp) {
|
int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
SMqConsumeReq* pReq = pMsg->pCont;
|
SMqConsumeReq* pReq = pMsg->pCont;
|
||||||
SRpcMsg rpcMsg;
|
SRpcMsg rpcMsg;
|
||||||
int64_t reqId = pReq->reqId;
|
int64_t reqId = pReq->reqId;
|
||||||
|
@ -679,6 +679,7 @@ int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg** ppRsp) {
|
||||||
int rspLen = 0;
|
int rspLen = 0;
|
||||||
|
|
||||||
STqConsumerHandle* pConsumer = tqHandleGet(pTq->tqMeta, consumerId);
|
STqConsumerHandle* pConsumer = tqHandleGet(pTq->tqMeta, consumerId);
|
||||||
|
ASSERT(pConsumer);
|
||||||
int sz = taosArrayGetSize(pConsumer->topics);
|
int sz = taosArrayGetSize(pConsumer->topics);
|
||||||
|
|
||||||
for (int i = 0; i < sz; i++) {
|
for (int i = 0; i < sz; i++) {
|
||||||
|
@ -735,23 +736,6 @@ int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg** ppRsp) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (pDataBlock != NULL) {
|
if (pDataBlock != NULL) {
|
||||||
SMqTbData tbData = {
|
|
||||||
.uid = pDataBlock->info.uid,
|
|
||||||
.numOfCols = pDataBlock->info.numOfCols,
|
|
||||||
.numOfRows = pDataBlock->info.rows,
|
|
||||||
};
|
|
||||||
for (int i = 0; i < pDataBlock->info.numOfCols; i++) {
|
|
||||||
SColumnInfoData* pColData = taosArrayGet(pDataBlock->pDataBlock, i);
|
|
||||||
int32_t sz = pColData->info.bytes * pDataBlock->info.rows;
|
|
||||||
SMqColData colData = {
|
|
||||||
.bytes = pColData->info.bytes,
|
|
||||||
.colId = pColData->info.colId,
|
|
||||||
.type = pColData->info.type,
|
|
||||||
};
|
|
||||||
memcpy(colData.data, pColData->pData, colData.bytes * pDataBlock->info.rows);
|
|
||||||
memcpy(&tbData.colData[i], &colData, sz);
|
|
||||||
}
|
|
||||||
/*pDataBlock->info.*/
|
|
||||||
taosArrayPush(pRes, pDataBlock);
|
taosArrayPush(pRes, pDataBlock);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
|
@ -773,17 +757,17 @@ int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg** ppRsp) {
|
||||||
if (pTopic->buffer.lastOffset == -1 || pReq->offset > pTopic->buffer.lastOffset) {
|
if (pTopic->buffer.lastOffset == -1 || pReq->offset > pTopic->buffer.lastOffset) {
|
||||||
pTopic->buffer.lastOffset = pReq->offset;
|
pTopic->buffer.lastOffset = pReq->offset;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// put output into rsp
|
// put output into rsp
|
||||||
SMqConsumeRsp rsp = {
|
SMqConsumeRsp rsp = {
|
||||||
.consumerId = consumerId,
|
.consumerId = consumerId,
|
||||||
.numOfTopics = 1
|
.numOfTopics = 1
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqProcessSetConnReq(STQ* pTq, char* msg, SRpcMsg** ppRsp) {
|
int32_t tqProcessSetConnReq(STQ* pTq, char* msg) {
|
||||||
SMqSetCVgReq req;
|
SMqSetCVgReq req;
|
||||||
tDecodeSMqSetCVgReq(msg, &req);
|
tDecodeSMqSetCVgReq(msg, &req);
|
||||||
STqConsumerHandle* pConsumer = calloc(sizeof(STqConsumerHandle), 1);
|
STqConsumerHandle* pConsumer = calloc(sizeof(STqConsumerHandle), 1);
|
||||||
|
@ -792,6 +776,8 @@ int32_t tqProcessSetConnReq(STQ* pTq, char* msg, SRpcMsg** ppRsp) {
|
||||||
}
|
}
|
||||||
strcpy(pConsumer->cgroup, req.cgroup);
|
strcpy(pConsumer->cgroup, req.cgroup);
|
||||||
pConsumer->topics = taosArrayInit(0, sizeof(STqTopicHandle));
|
pConsumer->topics = taosArrayInit(0, sizeof(STqTopicHandle));
|
||||||
|
pConsumer->consumerId = req.newConsumerId;
|
||||||
|
pConsumer->epoch = 0;
|
||||||
|
|
||||||
STqTopicHandle* pTopic = calloc(sizeof(STqTopicHandle), 1);
|
STqTopicHandle* pTopic = calloc(sizeof(STqTopicHandle), 1);
|
||||||
if (pTopic == NULL) {
|
if (pTopic == NULL) {
|
||||||
|
@ -802,6 +788,8 @@ int32_t tqProcessSetConnReq(STQ* pTq, char* msg, SRpcMsg** ppRsp) {
|
||||||
pTopic->sql = strdup(req.sql);
|
pTopic->sql = strdup(req.sql);
|
||||||
pTopic->logicalPlan = strdup(req.logicalPlan);
|
pTopic->logicalPlan = strdup(req.logicalPlan);
|
||||||
pTopic->physicalPlan = strdup(req.physicalPlan);
|
pTopic->physicalPlan = strdup(req.physicalPlan);
|
||||||
|
pTopic->committedOffset = -1;
|
||||||
|
pTopic->currentOffset = -1;
|
||||||
|
|
||||||
pTopic->buffer.firstOffset = -1;
|
pTopic->buffer.firstOffset = -1;
|
||||||
pTopic->buffer.lastOffset = -1;
|
pTopic->buffer.lastOffset = -1;
|
||||||
|
@ -811,9 +799,11 @@ int32_t tqProcessSetConnReq(STQ* pTq, char* msg, SRpcMsg** ppRsp) {
|
||||||
for (int i = 0; i < TQ_BUFFER_SIZE; i++) {
|
for (int i = 0; i < TQ_BUFFER_SIZE; i++) {
|
||||||
pTopic->buffer.output[i].status = 0;
|
pTopic->buffer.output[i].status = 0;
|
||||||
STqReadHandle* pReadHandle = tqInitSubmitMsgScanner(pTq->pMeta);
|
STqReadHandle* pReadHandle = tqInitSubmitMsgScanner(pTq->pMeta);
|
||||||
pTopic->buffer.output[i].task = qCreateStreamExecTaskInfo(&req.qmsg, pReadHandle);
|
pTopic->buffer.output[i].task = qCreateStreamExecTaskInfo(req.qmsg, pReadHandle);
|
||||||
}
|
}
|
||||||
taosArrayPush(pConsumer->topics, pTopic);
|
taosArrayPush(pConsumer->topics, pTopic);
|
||||||
|
tqHandleMovePut(pTq->tqMeta, req.newConsumerId, pConsumer);
|
||||||
|
tqHandleCommit(pTq->tqMeta, req.newConsumerId);
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
terrno = TSDB_CODE_SUCCESS;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -832,14 +822,29 @@ STqReadHandle* tqInitSubmitMsgScanner(SMeta* pMeta) {
|
||||||
|
|
||||||
void tqReadHandleSetMsg(STqReadHandle* pReadHandle, SSubmitMsg* pMsg, int64_t ver) {
|
void tqReadHandleSetMsg(STqReadHandle* pReadHandle, SSubmitMsg* pMsg, int64_t ver) {
|
||||||
pReadHandle->pMsg = pMsg;
|
pReadHandle->pMsg = pMsg;
|
||||||
|
pMsg->length = htonl(pMsg->length);
|
||||||
|
pMsg->numOfBlocks = htonl(pMsg->numOfBlocks);
|
||||||
tInitSubmitMsgIter(pMsg, &pReadHandle->msgIter);
|
tInitSubmitMsgIter(pMsg, &pReadHandle->msgIter);
|
||||||
pReadHandle->ver = ver;
|
pReadHandle->ver = ver;
|
||||||
memset(&pReadHandle->blkIter, 0, sizeof(SSubmitBlkIter));
|
memset(&pReadHandle->blkIter, 0, sizeof(SSubmitBlkIter));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tqNextDataBlock(STqReadHandle* pHandle) {
|
bool tqNextDataBlock(STqReadHandle* pHandle) {
|
||||||
while (tGetSubmitMsgNext(&pHandle->msgIter, &pHandle->pBlock) >= 0) {
|
while (1) {
|
||||||
if (pHandle->tbUid == pHandle->pBlock->uid) return true;
|
if (tGetSubmitMsgNext(&pHandle->msgIter, &pHandle->pBlock) < 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (pHandle->pBlock == NULL) return false;
|
||||||
|
|
||||||
|
pHandle->pBlock->uid = htobe64(pHandle->pBlock->uid);
|
||||||
|
if (pHandle->tbUid == pHandle->pBlock->uid){
|
||||||
|
pHandle->pBlock->tid = htonl(pHandle->pBlock->tid);
|
||||||
|
pHandle->pBlock->sversion = htonl(pHandle->pBlock->sversion);
|
||||||
|
pHandle->pBlock->dataLen = htonl(pHandle->pBlock->dataLen);
|
||||||
|
pHandle->pBlock->schemaLen = htonl(pHandle->pBlock->schemaLen);
|
||||||
|
pHandle->pBlock->numOfRows = htons(pHandle->pBlock->numOfRows);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -855,8 +860,18 @@ int tqRetrieveDataBlockInfo(STqReadHandle* pHandle, SDataBlockInfo* pBlockInfo)
|
||||||
|
|
||||||
SArray* tqRetrieveDataBlock(STqReadHandle* pHandle) {
|
SArray* tqRetrieveDataBlock(STqReadHandle* pHandle) {
|
||||||
int32_t sversion = pHandle->pBlock->sversion;
|
int32_t sversion = pHandle->pBlock->sversion;
|
||||||
SSchemaWrapper* pSchemaWrapper = metaGetTableSchema(pHandle->pMeta, pHandle->pBlock->uid, sversion, true);
|
//TODO : change sversion
|
||||||
STSchema* pTschema = metaGetTbTSchema(pHandle->pMeta, pHandle->pBlock->uid, sversion);
|
STSchema* pTschema = metaGetTbTSchema(pHandle->pMeta, pHandle->pBlock->uid, 0);
|
||||||
|
|
||||||
|
tb_uid_t quid;
|
||||||
|
STbCfg* pTbCfg = metaGetTbInfoByUid(pHandle->pMeta, pHandle->pBlock->uid);
|
||||||
|
if (pTbCfg->type == META_CHILD_TABLE) {
|
||||||
|
quid = pTbCfg->ctbCfg.suid;
|
||||||
|
} else {
|
||||||
|
quid = pHandle->pBlock->uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
SSchemaWrapper* pSchemaWrapper = metaGetTableSchema(pHandle->pMeta, quid, 0, true);
|
||||||
SArray* pArray = taosArrayInit(pSchemaWrapper->nCols, sizeof(SColumnInfoData));
|
SArray* pArray = taosArrayInit(pSchemaWrapper->nCols, sizeof(SColumnInfoData));
|
||||||
if (pArray == NULL) {
|
if (pArray == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -26,6 +26,7 @@ int vnodeInit(const SVnodeOpt *pOption) {
|
||||||
|
|
||||||
vnodeMgr.stop = false;
|
vnodeMgr.stop = false;
|
||||||
vnodeMgr.putReqToVQueryQFp = pOption->putReqToVQueryQFp;
|
vnodeMgr.putReqToVQueryQFp = pOption->putReqToVQueryQFp;
|
||||||
|
vnodeMgr.sendReqToDnodeFp = pOption->sendReqToDnodeFp;
|
||||||
|
|
||||||
// Start commit handers
|
// Start commit handers
|
||||||
if (pOption->nthreads > 0) {
|
if (pOption->nthreads > 0) {
|
||||||
|
@ -96,6 +97,10 @@ int32_t vnodePutReqToVQueryQ(SVnode* pVnode, struct SRpcMsg* pReq) {
|
||||||
return (*vnodeMgr.putReqToVQueryQFp)(pVnode->pDnode, pReq);
|
return (*vnodeMgr.putReqToVQueryQFp)(pVnode->pDnode, pReq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vnodeSendReqToDnode(SVnode* pVnode, struct SEpSet* epSet, struct SRpcMsg* pReq) {
|
||||||
|
(*vnodeMgr.sendReqToDnodeFp)(pVnode->pDnode, epSet, pReq);
|
||||||
|
}
|
||||||
|
|
||||||
/* ------------------------ STATIC METHODS ------------------------ */
|
/* ------------------------ STATIC METHODS ------------------------ */
|
||||||
static void* loop(void* arg) {
|
static void* loop(void* arg) {
|
||||||
setThreadName("vnode-commit");
|
setThreadName("vnode-commit");
|
||||||
|
|
|
@ -17,14 +17,14 @@
|
||||||
#include "vnd.h"
|
#include "vnd.h"
|
||||||
|
|
||||||
static int32_t vnodeGetTableList(SVnode *pVnode, SRpcMsg *pMsg);
|
static int32_t vnodeGetTableList(SVnode *pVnode, SRpcMsg *pMsg);
|
||||||
static int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp);
|
static int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg);
|
||||||
|
|
||||||
int vnodeQueryOpen(SVnode *pVnode) {
|
int vnodeQueryOpen(SVnode *pVnode) {
|
||||||
return qWorkerInit(NODE_TYPE_VNODE, pVnode->vgId, NULL, (void **)&pVnode->pQuery, pVnode,
|
return qWorkerInit(NODE_TYPE_VNODE, pVnode->vgId, NULL, (void **)&pVnode->pQuery, pVnode,
|
||||||
(putReqToQueryQFp)vnodePutReqToVQueryQ);
|
(putReqToQueryQFp)vnodePutReqToVQueryQ, (sendReqToDnodeFp)vnodeSendReqToDnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
int vnodeProcessQueryReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
int vnodeProcessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
vTrace("message in query queue is processing");
|
vTrace("message in query queue is processing");
|
||||||
|
|
||||||
switch (pMsg->msgType) {
|
switch (pMsg->msgType) {
|
||||||
|
@ -38,11 +38,13 @@ int vnodeProcessQueryReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int vnodeProcessFetchReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
int vnodeProcessFetchMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
vTrace("message in fetch queue is processing");
|
vTrace("message in fetch queue is processing");
|
||||||
switch (pMsg->msgType) {
|
switch (pMsg->msgType) {
|
||||||
case TDMT_VND_FETCH:
|
case TDMT_VND_FETCH:
|
||||||
return qWorkerProcessFetchMsg(pVnode, pVnode->pQuery, pMsg);
|
return qWorkerProcessFetchMsg(pVnode, pVnode->pQuery, pMsg);
|
||||||
|
case TDMT_VND_FETCH_RSP:
|
||||||
|
return qWorkerProcessFetchRsp(pVnode, pVnode->pQuery, pMsg);
|
||||||
case TDMT_VND_RES_READY:
|
case TDMT_VND_RES_READY:
|
||||||
return qWorkerProcessReadyMsg(pVnode, pVnode->pQuery, pMsg);
|
return qWorkerProcessReadyMsg(pVnode, pVnode->pQuery, pMsg);
|
||||||
case TDMT_VND_TASKS_STATUS:
|
case TDMT_VND_TASKS_STATUS:
|
||||||
|
@ -57,16 +59,16 @@ int vnodeProcessFetchReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
return vnodeGetTableList(pVnode, pMsg);
|
return vnodeGetTableList(pVnode, pMsg);
|
||||||
// return qWorkerProcessShowFetchMsg(pVnode->pMeta, pVnode->pQuery, pMsg);
|
// return qWorkerProcessShowFetchMsg(pVnode->pMeta, pVnode->pQuery, pMsg);
|
||||||
case TDMT_VND_TABLE_META:
|
case TDMT_VND_TABLE_META:
|
||||||
return vnodeGetTableMeta(pVnode, pMsg, pRsp);
|
return vnodeGetTableMeta(pVnode, pMsg);
|
||||||
case TDMT_VND_CONSUME:
|
case TDMT_VND_CONSUME:
|
||||||
return tqProcessConsumeReq(pVnode->pTq, pMsg, pRsp);
|
return tqProcessConsumeReq(pVnode->pTq, pMsg);
|
||||||
default:
|
default:
|
||||||
vError("unknown msg type:%d in fetch queue", pMsg->msgType);
|
vError("unknown msg type:%d in fetch queue", pMsg->msgType);
|
||||||
return TSDB_CODE_VND_APP_ERROR;
|
return TSDB_CODE_VND_APP_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
static int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
STableInfoReq * pReq = (STableInfoReq *)(pMsg->pCont);
|
STableInfoReq * pReq = (STableInfoReq *)(pMsg->pCont);
|
||||||
STbCfg * pTbCfg = NULL;
|
STbCfg * pTbCfg = NULL;
|
||||||
STbCfg * pStbCfg = NULL;
|
STbCfg * pStbCfg = NULL;
|
||||||
|
|
|
@ -115,7 +115,7 @@ int vnodeApplyWMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TDMT_VND_MQ_SET_CONN: {
|
case TDMT_VND_MQ_SET_CONN: {
|
||||||
if (tqProcessSetConnReq(pVnode->pTq, POINTER_SHIFT(ptr, sizeof(SMsgHead)), NULL) < 0) {
|
if (tqProcessSetConnReq(pVnode->pTq, POINTER_SHIFT(ptr, sizeof(SMsgHead))) < 0) {
|
||||||
// TODO: handle error
|
// TODO: handle error
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
|
@ -83,8 +83,9 @@ int32_t qCreateExecTask(void* readHandle, int32_t vgId, uint64_t taskId, SSubpla
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
if (handle) {
|
||||||
code = dsCreateDataSinker(pSubplan->pDataSink, handle);
|
code = dsCreateDataSinker(pSubplan->pDataSink, handle);
|
||||||
|
}
|
||||||
|
|
||||||
_error:
|
_error:
|
||||||
// if failed to add ref for all tables in this query, abort current query
|
// if failed to add ref for all tables in this query, abort current query
|
||||||
|
|
|
@ -5115,7 +5115,7 @@ static void destroySendMsgInfo(SMsgSendInfo* pMsgBody) {
|
||||||
tfree(pMsgBody);
|
tfree(pMsgBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
void processRspMsg(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
|
void qProcessFetchRsp(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
|
||||||
SMsgSendInfo *pSendInfo = (SMsgSendInfo *) pMsg->ahandle;
|
SMsgSendInfo *pSendInfo = (SMsgSendInfo *) pMsg->ahandle;
|
||||||
assert(pMsg->ahandle != NULL);
|
assert(pMsg->ahandle != NULL);
|
||||||
|
|
||||||
|
@ -5291,13 +5291,14 @@ SOperatorInfo* createExchangeOperatorInfo(const SArray* pSources, const SArray*
|
||||||
pOperator->exec = doLoadRemoteData;
|
pOperator->exec = doLoadRemoteData;
|
||||||
pOperator->pTaskInfo = pTaskInfo;
|
pOperator->pTaskInfo = pTaskInfo;
|
||||||
|
|
||||||
|
#if 1
|
||||||
{ // todo refactor
|
{ // todo refactor
|
||||||
SRpcInit rpcInit;
|
SRpcInit rpcInit;
|
||||||
memset(&rpcInit, 0, sizeof(rpcInit));
|
memset(&rpcInit, 0, sizeof(rpcInit));
|
||||||
rpcInit.localPort = 0;
|
rpcInit.localPort = 0;
|
||||||
rpcInit.label = "EX";
|
rpcInit.label = "EX";
|
||||||
rpcInit.numOfThreads = 1;
|
rpcInit.numOfThreads = 1;
|
||||||
rpcInit.cfp = processRspMsg;
|
rpcInit.cfp = qProcessFetchRsp;
|
||||||
rpcInit.sessions = tsMaxConnections;
|
rpcInit.sessions = tsMaxConnections;
|
||||||
rpcInit.connType = TAOS_CONN_CLIENT;
|
rpcInit.connType = TAOS_CONN_CLIENT;
|
||||||
rpcInit.user = (char *)"root";
|
rpcInit.user = (char *)"root";
|
||||||
|
@ -5311,7 +5312,7 @@ SOperatorInfo* createExchangeOperatorInfo(const SArray* pSources, const SArray*
|
||||||
return NULL; // todo
|
return NULL; // todo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return pOperator;
|
return pOperator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -137,6 +137,7 @@ typedef struct SQWorkerMgmt {
|
||||||
SHashObj *ctxHash; //key: queryId+taskId, value: SQWTaskCtx
|
SHashObj *ctxHash; //key: queryId+taskId, value: SQWTaskCtx
|
||||||
void *nodeObj;
|
void *nodeObj;
|
||||||
putReqToQueryQFp putToQueueFp;
|
putReqToQueryQFp putToQueueFp;
|
||||||
|
sendReqToDnodeFp sendReqFp;
|
||||||
} SQWorkerMgmt;
|
} SQWorkerMgmt;
|
||||||
|
|
||||||
#define QW_FPARAMS_DEF SQWorkerMgmt *mgmt, uint64_t sId, uint64_t qId, uint64_t tId
|
#define QW_FPARAMS_DEF SQWorkerMgmt *mgmt, uint64_t sId, uint64_t qId, uint64_t tId
|
||||||
|
|
|
@ -1313,8 +1313,9 @@ _return:
|
||||||
QW_RET(code);
|
QW_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qWorkerInit(int8_t nodeType, int32_t nodeId, SQWorkerCfg *cfg, void **qWorkerMgmt, void *nodeObj, putReqToQueryQFp fp) {
|
int32_t qWorkerInit(int8_t nodeType, int32_t nodeId, SQWorkerCfg *cfg, void **qWorkerMgmt, void *nodeObj,
|
||||||
if (NULL == qWorkerMgmt || NULL == nodeObj || NULL == fp) {
|
putReqToQueryQFp fp1, sendReqToDnodeFp fp2) {
|
||||||
|
if (NULL == qWorkerMgmt || NULL == nodeObj || NULL == fp1 || NULL == fp2) {
|
||||||
qError("invalid param to init qworker");
|
qError("invalid param to init qworker");
|
||||||
QW_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
QW_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
@ -1361,7 +1362,8 @@ int32_t qWorkerInit(int8_t nodeType, int32_t nodeId, SQWorkerCfg *cfg, void **qW
|
||||||
mgmt->nodeType = nodeType;
|
mgmt->nodeType = nodeType;
|
||||||
mgmt->nodeId = nodeId;
|
mgmt->nodeId = nodeId;
|
||||||
mgmt->nodeObj = nodeObj;
|
mgmt->nodeObj = nodeObj;
|
||||||
mgmt->putToQueueFp = fp;
|
mgmt->putToQueueFp = fp1;
|
||||||
|
mgmt->sendReqFp = fp2;
|
||||||
|
|
||||||
*qWorkerMgmt = mgmt;
|
*qWorkerMgmt = mgmt;
|
||||||
|
|
||||||
|
|
|
@ -421,6 +421,11 @@ int32_t qWorkerProcessFetchMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t qWorkerProcessFetchRsp(void *node, void *qWorkerMgmt, SRpcMsg *pMsg) {
|
||||||
|
qProcessFetchRsp(NULL, pMsg, NULL);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t qWorkerProcessCancelMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg) {
|
int32_t qWorkerProcessCancelMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg) {
|
||||||
if (NULL == node || NULL == qWorkerMgmt || NULL == pMsg) {
|
if (NULL == node || NULL == qWorkerMgmt || NULL == pMsg) {
|
||||||
return TSDB_CODE_QRY_INVALID_INPUT;
|
return TSDB_CODE_QRY_INVALID_INPUT;
|
||||||
|
|
|
@ -1081,7 +1081,7 @@ TEST(rcTest, shortExecshortDelay) {
|
||||||
qwtTestStop = false;
|
qwtTestStop = false;
|
||||||
qwtTestQuitThreadNum = 0;
|
qwtTestQuitThreadNum = 0;
|
||||||
|
|
||||||
code = qWorkerInit(NODE_TYPE_VNODE, 1, NULL, &mgmt, mockPointer, qwtPutReqToQueue);
|
code = qWorkerInit(NODE_TYPE_VNODE, 1, NULL, &mgmt, mockPointer, qwtPutReqToQueue, NULL);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
qwtTestMaxExecTaskUsec = 0;
|
qwtTestMaxExecTaskUsec = 0;
|
||||||
|
@ -1162,7 +1162,7 @@ TEST(rcTest, longExecshortDelay) {
|
||||||
qwtTestStop = false;
|
qwtTestStop = false;
|
||||||
qwtTestQuitThreadNum = 0;
|
qwtTestQuitThreadNum = 0;
|
||||||
|
|
||||||
code = qWorkerInit(NODE_TYPE_VNODE, 1, NULL, &mgmt, mockPointer, qwtPutReqToQueue);
|
code = qWorkerInit(NODE_TYPE_VNODE, 1, NULL, &mgmt, mockPointer, qwtPutReqToQueue, NULL);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
qwtTestMaxExecTaskUsec = 1000000;
|
qwtTestMaxExecTaskUsec = 1000000;
|
||||||
|
@ -1245,7 +1245,7 @@ TEST(rcTest, shortExeclongDelay) {
|
||||||
qwtTestStop = false;
|
qwtTestStop = false;
|
||||||
qwtTestQuitThreadNum = 0;
|
qwtTestQuitThreadNum = 0;
|
||||||
|
|
||||||
code = qWorkerInit(NODE_TYPE_VNODE, 1, NULL, &mgmt, mockPointer, qwtPutReqToQueue);
|
code = qWorkerInit(NODE_TYPE_VNODE, 1, NULL, &mgmt, mockPointer, qwtPutReqToQueue, NULL);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
qwtTestMaxExecTaskUsec = 0;
|
qwtTestMaxExecTaskUsec = 0;
|
||||||
|
|
|
@ -1468,13 +1468,14 @@ int32_t schedulerConvertDagToTaskList(SQueryDag* pDag, SArray **pTasks) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t msgSize = sizeof(SSubQueryMsg) + msgLen;
|
int32_t msgSize = sizeof(SSubQueryMsg) + msgLen;
|
||||||
msg = calloc(1, msgSize);
|
|
||||||
if (NULL == msg) {
|
if (NULL == msg) {
|
||||||
qError("calloc %d failed", msgSize);
|
qError("calloc %d failed", msgSize);
|
||||||
SCH_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
SCH_ERR_JRET(TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSubQueryMsg *pMsg = (SSubQueryMsg*) msg;
|
SSubQueryMsg* pMsg = calloc(1, msgSize);
|
||||||
|
/*SSubQueryMsg *pMsg = (SSubQueryMsg*) msg;*/
|
||||||
|
memcpy(pMsg->msg, msg, msgLen);
|
||||||
|
|
||||||
pMsg->header.vgId = tInfo.addr.nodeId;
|
pMsg->header.vgId = tInfo.addr.nodeId;
|
||||||
|
|
||||||
|
@ -1483,7 +1484,7 @@ int32_t schedulerConvertDagToTaskList(SQueryDag* pDag, SArray **pTasks) {
|
||||||
pMsg->taskId = schGenUUID();
|
pMsg->taskId = schGenUUID();
|
||||||
pMsg->taskType = TASK_TYPE_PERSISTENT;
|
pMsg->taskType = TASK_TYPE_PERSISTENT;
|
||||||
pMsg->contentLen = msgLen;
|
pMsg->contentLen = msgLen;
|
||||||
memcpy(pMsg->msg, msg, msgLen);
|
/*memcpy(pMsg->msg, ((SSubQueryMsg*)msg)->msg, msgLen);*/
|
||||||
|
|
||||||
tInfo.msg = pMsg;
|
tInfo.msg = pMsg;
|
||||||
|
|
||||||
|
|
|
@ -202,6 +202,8 @@ bool transDecompressMsg(char* msg, int32_t len, int32_t* flen);
|
||||||
void transConnCtxDestroy(STransConnCtx* ctx);
|
void transConnCtxDestroy(STransConnCtx* ctx);
|
||||||
|
|
||||||
void transFreeMsg(void* msg);
|
void transFreeMsg(void* msg);
|
||||||
|
|
||||||
|
//
|
||||||
typedef struct SConnBuffer {
|
typedef struct SConnBuffer {
|
||||||
char* buf;
|
char* buf;
|
||||||
int len;
|
int len;
|
||||||
|
@ -209,4 +211,9 @@ typedef struct SConnBuffer {
|
||||||
int left;
|
int left;
|
||||||
} SConnBuffer;
|
} SConnBuffer;
|
||||||
|
|
||||||
|
int transInitBuffer(SConnBuffer* buf);
|
||||||
|
int transClearBuffer(SConnBuffer* buf);
|
||||||
|
int transDestroyBuffer(SConnBuffer* buf);
|
||||||
|
int transAllocBuffer(SConnBuffer* connBuf, uv_buf_t* uvBuf);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -30,7 +30,8 @@ void* rpcOpen(const SRpcInit* pInit) {
|
||||||
tstrncpy(pRpc->label, pInit->label, strlen(pInit->label));
|
tstrncpy(pRpc->label, pInit->label, strlen(pInit->label));
|
||||||
}
|
}
|
||||||
pRpc->cfp = pInit->cfp;
|
pRpc->cfp = pInit->cfp;
|
||||||
pRpc->numOfThreads = pInit->numOfThreads > TSDB_MAX_RPC_THREADS ? TSDB_MAX_RPC_THREADS : pInit->numOfThreads;
|
// pRpc->numOfThreads = pInit->numOfThreads > TSDB_MAX_RPC_THREADS ? TSDB_MAX_RPC_THREADS : pInit->numOfThreads;
|
||||||
|
pRpc->numOfThreads = pInit->numOfThreads;
|
||||||
pRpc->connType = pInit->connType;
|
pRpc->connType = pInit->connType;
|
||||||
pRpc->idleTime = pInit->idleTime;
|
pRpc->idleTime = pInit->idleTime;
|
||||||
pRpc->tcphandle = (*taosInitHandle[pRpc->connType])(0, pInit->localPort, pRpc->label, pRpc->numOfThreads, NULL, pRpc);
|
pRpc->tcphandle = (*taosInitHandle[pRpc->connType])(0, pInit->localPort, pRpc->label, pRpc->numOfThreads, NULL, pRpc);
|
||||||
|
@ -55,7 +56,13 @@ void* rpcMallocCont(int contLen) {
|
||||||
}
|
}
|
||||||
return start + sizeof(STransMsgHead);
|
return start + sizeof(STransMsgHead);
|
||||||
}
|
}
|
||||||
void rpcFreeCont(void* cont) { return; }
|
void rpcFreeCont(void* cont) {
|
||||||
|
// impl
|
||||||
|
if (cont == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
free((char*)cont - TRANS_MSG_OVERHEAD);
|
||||||
|
}
|
||||||
void* rpcReallocCont(void* ptr, int contLen) { return NULL; }
|
void* rpcReallocCont(void* ptr, int contLen) { return NULL; }
|
||||||
|
|
||||||
void rpcSendRedirectRsp(void* pConn, const SEpSet* pEpSet) {}
|
void rpcSendRedirectRsp(void* pConn, const SEpSet* pEpSet) {}
|
||||||
|
|
|
@ -31,6 +31,7 @@ typedef struct SCliConn {
|
||||||
char secured;
|
char secured;
|
||||||
uint64_t expireTime;
|
uint64_t expireTime;
|
||||||
int8_t notifyCount; // timers already notify to client
|
int8_t notifyCount; // timers already notify to client
|
||||||
|
int32_t ref;
|
||||||
} SCliConn;
|
} SCliConn;
|
||||||
|
|
||||||
typedef struct SCliMsg {
|
typedef struct SCliMsg {
|
||||||
|
@ -94,8 +95,10 @@ static void clientHandleExcept(SCliConn* conn);
|
||||||
// handle req from app
|
// handle req from app
|
||||||
static void clientHandleReq(SCliMsg* pMsg, SCliThrdObj* pThrd);
|
static void clientHandleReq(SCliMsg* pMsg, SCliThrdObj* pThrd);
|
||||||
|
|
||||||
static void clientMsgDestroy(SCliMsg* pMsg);
|
static void destroyUserdata(SRpcMsg* userdata);
|
||||||
static void destroyTransConnCtx(STransConnCtx* ctx);
|
|
||||||
|
static void destroyCmsg(SCliMsg* cmsg);
|
||||||
|
static void transDestroyConnCtx(STransConnCtx* ctx);
|
||||||
// thread obj
|
// thread obj
|
||||||
static SCliThrdObj* createThrdObj();
|
static SCliThrdObj* createThrdObj();
|
||||||
static void destroyThrdObj(SCliThrdObj* pThrd);
|
static void destroyThrdObj(SCliThrdObj* pThrd);
|
||||||
|
@ -103,7 +106,8 @@ static void destroyThrdObj(SCliThrdObj* pThrd);
|
||||||
static void* clientThread(void* arg);
|
static void* clientThread(void* arg);
|
||||||
|
|
||||||
static void clientHandleResp(SCliConn* conn) {
|
static void clientHandleResp(SCliConn* conn) {
|
||||||
STransConnCtx* pCtx = ((SCliMsg*)conn->data)->ctx;
|
SCliMsg* pMsg = conn->data;
|
||||||
|
STransConnCtx* pCtx = pMsg->ctx;
|
||||||
SRpcInfo* pRpc = pCtx->pTransInst;
|
SRpcInfo* pRpc = pCtx->pTransInst;
|
||||||
|
|
||||||
STransMsgHead* pHead = (STransMsgHead*)(conn->readBuf.buf);
|
STransMsgHead* pHead = (STransMsgHead*)(conn->readBuf.buf);
|
||||||
|
@ -112,41 +116,53 @@ static void clientHandleResp(SCliConn* conn) {
|
||||||
|
|
||||||
SRpcMsg rpcMsg;
|
SRpcMsg rpcMsg;
|
||||||
rpcMsg.contLen = transContLenFromMsg(pHead->msgLen);
|
rpcMsg.contLen = transContLenFromMsg(pHead->msgLen);
|
||||||
rpcMsg.pCont = transContFromHead(pHead);
|
rpcMsg.pCont = transContFromHead((char*)pHead);
|
||||||
rpcMsg.code = pHead->code;
|
rpcMsg.code = pHead->code;
|
||||||
rpcMsg.msgType = pHead->msgType;
|
rpcMsg.msgType = pHead->msgType;
|
||||||
rpcMsg.ahandle = pCtx->ahandle;
|
rpcMsg.ahandle = pCtx->ahandle;
|
||||||
|
|
||||||
|
tDebug("conn %p handle resp", conn);
|
||||||
(pRpc->cfp)(NULL, &rpcMsg, NULL);
|
(pRpc->cfp)(NULL, &rpcMsg, NULL);
|
||||||
conn->notifyCount += 1;
|
conn->notifyCount += 1;
|
||||||
|
|
||||||
|
// buf's mem alread translated to rpcMsg.pCont
|
||||||
|
transClearBuffer(&conn->readBuf);
|
||||||
|
|
||||||
|
uv_read_start((uv_stream_t*)conn->stream, clientAllocBufferCb, clientReadCb);
|
||||||
|
|
||||||
SCliThrdObj* pThrd = conn->hostThrd;
|
SCliThrdObj* pThrd = conn->hostThrd;
|
||||||
tfree(conn->data);
|
|
||||||
addConnToPool(pThrd->pool, pCtx->ip, pCtx->port, conn);
|
addConnToPool(pThrd->pool, pCtx->ip, pCtx->port, conn);
|
||||||
|
|
||||||
|
destroyCmsg(pMsg);
|
||||||
|
conn->data = NULL;
|
||||||
// start thread's timer of conn pool if not active
|
// start thread's timer of conn pool if not active
|
||||||
if (!uv_is_active((uv_handle_t*)pThrd->pTimer) && pRpc->idleTime > 0) {
|
if (!uv_is_active((uv_handle_t*)pThrd->pTimer) && pRpc->idleTime > 0) {
|
||||||
uv_timer_start((uv_timer_t*)pThrd->pTimer, clientTimeoutCb, CONN_PERSIST_TIME(pRpc->idleTime) / 2, 0);
|
uv_timer_start((uv_timer_t*)pThrd->pTimer, clientTimeoutCb, CONN_PERSIST_TIME(pRpc->idleTime) / 2, 0);
|
||||||
}
|
}
|
||||||
destroyTransConnCtx(pCtx);
|
|
||||||
}
|
}
|
||||||
static void clientHandleExcept(SCliConn* pConn) {
|
static void clientHandleExcept(SCliConn* pConn) {
|
||||||
|
if (pConn->data == NULL) {
|
||||||
|
// handle conn except in conn pool
|
||||||
|
clientConnDestroy(pConn, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tDebug("conn %p start to destroy", pConn);
|
||||||
SCliMsg* pMsg = pConn->data;
|
SCliMsg* pMsg = pConn->data;
|
||||||
|
|
||||||
STransConnCtx* pCtx = pMsg->ctx;
|
destroyUserdata(&pMsg->msg);
|
||||||
SRpcInfo* pRpc = pCtx->pTransInst;
|
|
||||||
|
|
||||||
transFreeMsg((pMsg->msg.pCont));
|
STransConnCtx* pCtx = pMsg->ctx;
|
||||||
pMsg->msg.pCont = NULL;
|
|
||||||
|
|
||||||
SRpcMsg rpcMsg = {0};
|
SRpcMsg rpcMsg = {0};
|
||||||
rpcMsg.ahandle = pCtx->ahandle;
|
rpcMsg.ahandle = pCtx->ahandle;
|
||||||
rpcMsg.code = -1;
|
rpcMsg.code = -1;
|
||||||
// SRpcInfo* pRpc = pMsg->ctx->pRpc;
|
// SRpcInfo* pRpc = pMsg->ctx->pRpc;
|
||||||
(pRpc->cfp)(NULL, &rpcMsg, NULL);
|
(pCtx->pTransInst->cfp)(NULL, &rpcMsg, NULL);
|
||||||
tfree(pConn->data);
|
|
||||||
pConn->notifyCount += 1;
|
pConn->notifyCount += 1;
|
||||||
destroyTransConnCtx(pCtx);
|
|
||||||
|
destroyCmsg(pMsg);
|
||||||
|
pConn->data = NULL;
|
||||||
|
// transDestroyConnCtx(pCtx);
|
||||||
clientConnDestroy(pConn, true);
|
clientConnDestroy(pConn, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,14 +229,20 @@ static SCliConn* getConnFromPool(void* pool, char* ip, uint32_t port) {
|
||||||
}
|
}
|
||||||
queue* h = QUEUE_HEAD(&plist->conn);
|
queue* h = QUEUE_HEAD(&plist->conn);
|
||||||
QUEUE_REMOVE(h);
|
QUEUE_REMOVE(h);
|
||||||
return QUEUE_DATA(h, SCliConn, conn);
|
|
||||||
|
SCliConn* conn = QUEUE_DATA(h, SCliConn, conn);
|
||||||
|
QUEUE_INIT(&conn->conn);
|
||||||
|
return conn;
|
||||||
}
|
}
|
||||||
static void addConnToPool(void* pool, char* ip, uint32_t port, SCliConn* conn) {
|
static void addConnToPool(void* pool, char* ip, uint32_t port, SCliConn* conn) {
|
||||||
char key[128] = {0};
|
char key[128] = {0};
|
||||||
|
|
||||||
tstrncpy(key, ip, strlen(ip));
|
tstrncpy(key, ip, strlen(ip));
|
||||||
tstrncpy(key + strlen(key), (char*)(&port), sizeof(port));
|
tstrncpy(key + strlen(key), (char*)(&port), sizeof(port));
|
||||||
|
tDebug("conn %p added to conn pool, read buf cap: %d", conn, conn->readBuf.cap);
|
||||||
|
|
||||||
SRpcInfo* pRpc = ((SCliThrdObj*)conn->hostThrd)->pTransInst;
|
SRpcInfo* pRpc = ((SCliThrdObj*)conn->hostThrd)->pTransInst;
|
||||||
|
|
||||||
conn->expireTime = taosGetTimestampMs() + CONN_PERSIST_TIME(pRpc->idleTime);
|
conn->expireTime = taosGetTimestampMs() + CONN_PERSIST_TIME(pRpc->idleTime);
|
||||||
SConnList* plist = taosHashGet((SHashObj*)pool, key, strlen(key));
|
SConnList* plist = taosHashGet((SHashObj*)pool, key, strlen(key));
|
||||||
conn->notifyCount = 0;
|
conn->notifyCount = 0;
|
||||||
|
@ -237,40 +259,18 @@ static bool clientReadComplete(SConnBuffer* data) {
|
||||||
if (msgLen > data->len) {
|
if (msgLen > data->len) {
|
||||||
data->left = msgLen - data->len;
|
data->left = msgLen - data->len;
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else if (msgLen == data->len) {
|
||||||
|
data->left = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void clientAllocReadBufferCb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) {
|
static void clientAllocBufferCb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) {
|
||||||
// impl later
|
|
||||||
static const int CAPACITY = 512;
|
|
||||||
|
|
||||||
SCliConn* conn = handle->data;
|
SCliConn* conn = handle->data;
|
||||||
SConnBuffer* pBuf = &conn->readBuf;
|
SConnBuffer* pBuf = &conn->readBuf;
|
||||||
if (pBuf->cap == 0) {
|
transAllocBuffer(pBuf, buf);
|
||||||
pBuf->buf = (char*)calloc(1, CAPACITY * sizeof(char));
|
|
||||||
pBuf->len = 0;
|
|
||||||
pBuf->cap = CAPACITY;
|
|
||||||
pBuf->left = -1;
|
|
||||||
|
|
||||||
buf->base = pBuf->buf;
|
|
||||||
buf->len = CAPACITY;
|
|
||||||
} else {
|
|
||||||
if (pBuf->len >= pBuf->cap) {
|
|
||||||
if (pBuf->left == -1) {
|
|
||||||
pBuf->cap *= 2;
|
|
||||||
pBuf->buf = realloc(pBuf->buf, pBuf->cap);
|
|
||||||
} else if (pBuf->len + pBuf->left > pBuf->cap) {
|
|
||||||
pBuf->cap = pBuf->len + pBuf->left;
|
|
||||||
pBuf->buf = realloc(pBuf->buf, pBuf->cap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buf->base = pBuf->buf + pBuf->len;
|
|
||||||
buf->len = pBuf->cap - pBuf->len;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
static void clientReadCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) {
|
static void clientReadCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) {
|
||||||
// impl later
|
// impl later
|
||||||
|
@ -279,6 +279,7 @@ static void clientReadCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf
|
||||||
if (nread > 0) {
|
if (nread > 0) {
|
||||||
pBuf->len += nread;
|
pBuf->len += nread;
|
||||||
if (clientReadComplete(pBuf)) {
|
if (clientReadComplete(pBuf)) {
|
||||||
|
uv_read_stop((uv_stream_t*)conn->stream);
|
||||||
tDebug("conn %p read complete", conn);
|
tDebug("conn %p read complete", conn);
|
||||||
clientHandleResp(conn);
|
clientHandleResp(conn);
|
||||||
} else {
|
} else {
|
||||||
|
@ -288,10 +289,12 @@ static void clientReadCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf
|
||||||
}
|
}
|
||||||
assert(nread <= 0);
|
assert(nread <= 0);
|
||||||
if (nread == 0) {
|
if (nread == 0) {
|
||||||
tError("conn %p closed", conn);
|
// ref http://docs.libuv.org/en/v1.x/stream.html?highlight=uv_read_start#c.uv_read_cb
|
||||||
|
// nread might be 0, which does not indicate an error or EOF. This is equivalent to EAGAIN or EWOULDBLOCK under
|
||||||
|
// read(2).
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (nread < 0) {
|
if (nread < 0 || nread == UV_EOF) {
|
||||||
tError("conn %p read error: %s", conn, uv_err_name(nread));
|
tError("conn %p read error: %s", conn, uv_err_name(nread));
|
||||||
clientHandleExcept(conn);
|
clientHandleExcept(conn);
|
||||||
}
|
}
|
||||||
|
@ -300,43 +303,47 @@ static void clientReadCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clientConnDestroy(SCliConn* conn, bool clear) {
|
static void clientConnDestroy(SCliConn* conn, bool clear) {
|
||||||
tDebug("conn %p destroy", conn);
|
//
|
||||||
|
conn->ref--;
|
||||||
|
if (conn->ref == 0) {
|
||||||
|
tDebug("conn %p remove from conn pool", conn);
|
||||||
|
QUEUE_REMOVE(&conn->conn);
|
||||||
|
tDebug("conn %p remove from conn pool successfully", conn);
|
||||||
if (clear) {
|
if (clear) {
|
||||||
uv_close((uv_handle_t*)conn->stream, NULL);
|
uv_close((uv_handle_t*)conn->stream, clientDestroy);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
free(conn->stream);
|
|
||||||
free(conn->readBuf.buf);
|
|
||||||
free(conn->writeReq);
|
|
||||||
free(conn);
|
|
||||||
}
|
}
|
||||||
static void clientDestroy(uv_handle_t* handle) {
|
static void clientDestroy(uv_handle_t* handle) {
|
||||||
SCliConn* conn = handle->data;
|
SCliConn* conn = handle->data;
|
||||||
// QUEUE_REMOVE(&conn->conn);
|
// transDestroyBuffer(&conn->readBuf);
|
||||||
clientConnDestroy(conn, false);
|
|
||||||
|
free(conn->stream);
|
||||||
|
free(conn->writeReq);
|
||||||
|
tDebug("conn %p destroy successfully", conn);
|
||||||
|
free(conn);
|
||||||
|
|
||||||
|
// clientConnDestroy(conn, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clientWriteCb(uv_write_t* req, int status) {
|
static void clientWriteCb(uv_write_t* req, int status) {
|
||||||
SCliConn* pConn = req->data;
|
SCliConn* pConn = req->data;
|
||||||
|
|
||||||
SCliMsg* pMsg = pConn->data;
|
|
||||||
transFreeMsg((pMsg->msg.pCont));
|
|
||||||
pMsg->msg.pCont = NULL;
|
|
||||||
|
|
||||||
if (status == 0) {
|
if (status == 0) {
|
||||||
tDebug("conn %p data already was written out", pConn);
|
tDebug("conn %p data already was written out", pConn);
|
||||||
|
SCliMsg* pMsg = pConn->data;
|
||||||
|
if (pMsg == NULL) {
|
||||||
|
destroy
|
||||||
|
// handle
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
destroyUserdata(&pMsg->msg);
|
||||||
} else {
|
} else {
|
||||||
tError("conn %p failed to write: %s", pConn, uv_err_name(status));
|
tError("conn %p failed to write: %s", pConn, uv_err_name(status));
|
||||||
clientHandleExcept(pConn);
|
clientHandleExcept(pConn);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SCliThrdObj* pThrd = pConn->hostThrd;
|
SCliThrdObj* pThrd = pConn->hostThrd;
|
||||||
// if (pConn->stream == NULL) {
|
uv_read_start((uv_stream_t*)pConn->stream, clientAllocBufferCb, clientReadCb);
|
||||||
// pConn->stream = (uv_stream_t*)malloc(sizeof(uv_tcp_t));
|
|
||||||
// uv_tcp_init(pThrd->loop, (uv_tcp_t*)pConn->stream);
|
|
||||||
// pConn->stream->data = pConn;
|
|
||||||
//}
|
|
||||||
uv_read_start((uv_stream_t*)pConn->stream, clientAllocReadBufferCb, clientReadCb);
|
|
||||||
// impl later
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clientWrite(SCliConn* pConn) {
|
static void clientWrite(SCliConn* pConn) {
|
||||||
|
@ -381,14 +388,11 @@ static void clientHandleReq(SCliMsg* pMsg, SCliThrdObj* pThrd) {
|
||||||
tDebug("conn %p get from conn pool", conn);
|
tDebug("conn %p get from conn pool", conn);
|
||||||
conn->data = pMsg;
|
conn->data = pMsg;
|
||||||
conn->writeReq->data = conn;
|
conn->writeReq->data = conn;
|
||||||
|
transDestroyBuffer(&conn->readBuf);
|
||||||
conn->readBuf.len = 0;
|
|
||||||
memset(conn->readBuf.buf, 0, conn->readBuf.cap);
|
|
||||||
conn->readBuf.left = -1;
|
|
||||||
clientWrite(conn);
|
clientWrite(conn);
|
||||||
} else {
|
} else {
|
||||||
SCliConn* conn = calloc(1, sizeof(SCliConn));
|
SCliConn* conn = calloc(1, sizeof(SCliConn));
|
||||||
|
conn->ref++;
|
||||||
// read/write stream handle
|
// read/write stream handle
|
||||||
conn->stream = (uv_stream_t*)malloc(sizeof(uv_tcp_t));
|
conn->stream = (uv_stream_t*)malloc(sizeof(uv_tcp_t));
|
||||||
uv_tcp_init(pThrd->loop, (uv_tcp_t*)(conn->stream));
|
uv_tcp_init(pThrd->loop, (uv_tcp_t*)(conn->stream));
|
||||||
|
@ -397,6 +401,7 @@ static void clientHandleReq(SCliMsg* pMsg, SCliThrdObj* pThrd) {
|
||||||
// write req handle
|
// write req handle
|
||||||
conn->writeReq = malloc(sizeof(uv_write_t));
|
conn->writeReq = malloc(sizeof(uv_write_t));
|
||||||
conn->writeReq->data = conn;
|
conn->writeReq->data = conn;
|
||||||
|
|
||||||
QUEUE_INIT(&conn->conn);
|
QUEUE_INIT(&conn->conn);
|
||||||
|
|
||||||
conn->connReq.data = conn;
|
conn->connReq.data = conn;
|
||||||
|
@ -459,8 +464,20 @@ void* taosInitClient(uint32_t ip, uint32_t port, char* label, int numOfThreads,
|
||||||
}
|
}
|
||||||
return cli;
|
return cli;
|
||||||
}
|
}
|
||||||
static void clientMsgDestroy(SCliMsg* pMsg) {
|
|
||||||
// impl later
|
static void destroyUserdata(SRpcMsg* userdata) {
|
||||||
|
if (userdata->pCont == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
transFreeMsg(userdata->pCont);
|
||||||
|
userdata->pCont = NULL;
|
||||||
|
}
|
||||||
|
static void destroyCmsg(SCliMsg* pMsg) {
|
||||||
|
if (pMsg == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
transDestroyConnCtx(pMsg->ctx);
|
||||||
|
destroyUserdata(&pMsg->msg);
|
||||||
free(pMsg);
|
free(pMsg);
|
||||||
}
|
}
|
||||||
static SCliThrdObj* createThrdObj() {
|
static SCliThrdObj* createThrdObj() {
|
||||||
|
@ -493,7 +510,7 @@ static void destroyThrdObj(SCliThrdObj* pThrd) {
|
||||||
free(pThrd);
|
free(pThrd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void destroyTransConnCtx(STransConnCtx* ctx) {
|
static void transDestroyConnCtx(STransConnCtx* ctx) {
|
||||||
if (ctx != NULL) {
|
if (ctx != NULL) {
|
||||||
free(ctx->ip);
|
free(ctx->ip);
|
||||||
}
|
}
|
||||||
|
|
|
@ -198,4 +198,51 @@ void transFreeMsg(void* msg) {
|
||||||
}
|
}
|
||||||
free((char*)msg - sizeof(STransMsgHead));
|
free((char*)msg - sizeof(STransMsgHead));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int transInitBuffer(SConnBuffer* buf) {
|
||||||
|
transClearBuffer(buf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int transClearBuffer(SConnBuffer* buf) {
|
||||||
|
memset(buf, 0, sizeof(*buf));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int transAllocBuffer(SConnBuffer* connBuf, uv_buf_t* uvBuf) {
|
||||||
|
/*
|
||||||
|
* formate of data buffer:
|
||||||
|
* |<--------------------------data from socket------------------------------->|
|
||||||
|
* |<------STransMsgHead------->|<-------------------other data--------------->|
|
||||||
|
*/
|
||||||
|
static const int CAPACITY = 1024;
|
||||||
|
|
||||||
|
SConnBuffer* p = connBuf;
|
||||||
|
if (p->cap == 0) {
|
||||||
|
p->buf = (char*)calloc(CAPACITY, sizeof(char));
|
||||||
|
p->len = 0;
|
||||||
|
p->cap = CAPACITY;
|
||||||
|
p->left = -1;
|
||||||
|
|
||||||
|
uvBuf->base = p->buf;
|
||||||
|
uvBuf->len = CAPACITY;
|
||||||
|
} else {
|
||||||
|
if (p->len >= p->cap) {
|
||||||
|
if (p->left == -1) {
|
||||||
|
p->cap *= 2;
|
||||||
|
p->buf = realloc(p->buf, p->cap);
|
||||||
|
} else if (p->len + p->left > p->cap) {
|
||||||
|
p->cap = p->len + p->left;
|
||||||
|
p->buf = realloc(p->buf, p->len + p->left);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uvBuf->base = p->buf + p->len;
|
||||||
|
uvBuf->len = p->cap - p->len;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int transDestroyBuffer(SConnBuffer* buf) {
|
||||||
|
if (buf->cap > 0) {
|
||||||
|
tfree(buf->buf);
|
||||||
|
}
|
||||||
|
transClearBuffer(buf);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
#include "transComm.h"
|
#include "transComm.h"
|
||||||
|
|
||||||
typedef struct SConn {
|
typedef struct SSrvConn {
|
||||||
uv_tcp_t* pTcp;
|
uv_tcp_t* pTcp;
|
||||||
uv_write_t* pWriter;
|
uv_write_t* pWriter;
|
||||||
uv_timer_t* pTimer;
|
uv_timer_t* pTimer;
|
||||||
|
@ -26,13 +26,14 @@ typedef struct SConn {
|
||||||
queue queue;
|
queue queue;
|
||||||
int ref;
|
int ref;
|
||||||
int persist; // persist connection or not
|
int persist; // persist connection or not
|
||||||
SConnBuffer connBuf; // read buf,
|
SConnBuffer readBuf; // read buf,
|
||||||
int inType;
|
int inType;
|
||||||
void* pTransInst; // rpc init
|
void* pTransInst; // rpc init
|
||||||
void* ahandle; //
|
void* ahandle; //
|
||||||
void* hostThrd;
|
void* hostThrd;
|
||||||
|
void* pSrvMsg;
|
||||||
|
|
||||||
SRpcMsg sendMsg;
|
// SRpcMsg sendMsg;
|
||||||
// del later
|
// del later
|
||||||
char secured;
|
char secured;
|
||||||
int spi;
|
int spi;
|
||||||
|
@ -40,7 +41,13 @@ typedef struct SConn {
|
||||||
char user[TSDB_UNI_LEN]; // user ID for the link
|
char user[TSDB_UNI_LEN]; // user ID for the link
|
||||||
char secret[TSDB_PASSWORD_LEN];
|
char secret[TSDB_PASSWORD_LEN];
|
||||||
char ckey[TSDB_PASSWORD_LEN]; // ciphering key
|
char ckey[TSDB_PASSWORD_LEN]; // ciphering key
|
||||||
} SConn;
|
} SSrvConn;
|
||||||
|
|
||||||
|
typedef struct SSrvMsg {
|
||||||
|
SSrvConn* pConn;
|
||||||
|
SRpcMsg msg;
|
||||||
|
queue q;
|
||||||
|
} SSrvMsg;
|
||||||
|
|
||||||
typedef struct SWorkThrdObj {
|
typedef struct SWorkThrdObj {
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
|
@ -48,8 +55,8 @@ typedef struct SWorkThrdObj {
|
||||||
int fd;
|
int fd;
|
||||||
uv_loop_t* loop;
|
uv_loop_t* loop;
|
||||||
uv_async_t* workerAsync; //
|
uv_async_t* workerAsync; //
|
||||||
queue conn;
|
queue msg;
|
||||||
pthread_mutex_t connMtx;
|
pthread_mutex_t msgMtx;
|
||||||
void* pTransInst;
|
void* pTransInst;
|
||||||
} SWorkThrdObj;
|
} SWorkThrdObj;
|
||||||
|
|
||||||
|
@ -68,9 +75,9 @@ typedef struct SServerObj {
|
||||||
static const char* notify = "a";
|
static const char* notify = "a";
|
||||||
|
|
||||||
// refactor later
|
// refactor later
|
||||||
static int transAddAuthPart(SConn* pConn, char* msg, int msgLen);
|
static int transAddAuthPart(SSrvConn* pConn, char* msg, int msgLen);
|
||||||
|
|
||||||
static int uvAuthMsg(SConn* pConn, char* msg, int msgLen);
|
static int uvAuthMsg(SSrvConn* pConn, char* msg, int msgLen);
|
||||||
|
|
||||||
static void uvAllocConnBufferCb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf);
|
static void uvAllocConnBufferCb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf);
|
||||||
static void uvAllocReadBufferCb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf);
|
static void uvAllocReadBufferCb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf);
|
||||||
|
@ -82,12 +89,13 @@ static void uvOnAcceptCb(uv_stream_t* stream, int status);
|
||||||
static void uvOnConnectionCb(uv_stream_t* q, ssize_t nread, const uv_buf_t* buf);
|
static void uvOnConnectionCb(uv_stream_t* q, ssize_t nread, const uv_buf_t* buf);
|
||||||
static void uvWorkerAsyncCb(uv_async_t* handle);
|
static void uvWorkerAsyncCb(uv_async_t* handle);
|
||||||
|
|
||||||
static void uvPrepareSendData(SConn* conn, uv_buf_t* wb);
|
static void uvPrepareSendData(SSrvMsg* msg, uv_buf_t* wb);
|
||||||
|
static void uvStartSendResp(SSrvMsg* msg);
|
||||||
|
static void destroySmsg(SSrvMsg* smsg);
|
||||||
// check whether already read complete packet
|
// check whether already read complete packet
|
||||||
static bool readComplete(SConnBuffer* buf);
|
static bool readComplete(SConnBuffer* buf);
|
||||||
static SConn* createConn();
|
static SSrvConn* createConn();
|
||||||
static void destroyConn(SConn* conn, bool clear /*clear handle or not*/);
|
static void destroyConn(SSrvConn* conn, bool clear /*clear handle or not*/);
|
||||||
|
|
||||||
static void uvDestroyConn(uv_handle_t* handle);
|
static void uvDestroyConn(uv_handle_t* handle);
|
||||||
|
|
||||||
|
@ -105,31 +113,9 @@ void uvAllocReadBufferCb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* b
|
||||||
* |<--------------------------data from socket------------------------------->|
|
* |<--------------------------data from socket------------------------------->|
|
||||||
* |<------STransMsgHead------->|<-------------------other data--------------->|
|
* |<------STransMsgHead------->|<-------------------other data--------------->|
|
||||||
*/
|
*/
|
||||||
static const int CAPACITY = 1024;
|
SSrvConn* conn = handle->data;
|
||||||
|
SConnBuffer* pBuf = &conn->readBuf;
|
||||||
SConn* conn = handle->data;
|
transAllocBuffer(pBuf, buf);
|
||||||
SConnBuffer* pBuf = &conn->connBuf;
|
|
||||||
if (pBuf->cap == 0) {
|
|
||||||
pBuf->buf = (char*)calloc(CAPACITY, sizeof(char));
|
|
||||||
pBuf->len = 0;
|
|
||||||
pBuf->cap = CAPACITY;
|
|
||||||
pBuf->left = -1;
|
|
||||||
|
|
||||||
buf->base = pBuf->buf;
|
|
||||||
buf->len = CAPACITY;
|
|
||||||
} else {
|
|
||||||
if (pBuf->len >= pBuf->cap) {
|
|
||||||
if (pBuf->left == -1) {
|
|
||||||
pBuf->cap *= 2;
|
|
||||||
pBuf->buf = realloc(pBuf->buf, pBuf->cap);
|
|
||||||
} else if (pBuf->len + pBuf->left > pBuf->cap) {
|
|
||||||
pBuf->cap = pBuf->len + pBuf->left;
|
|
||||||
pBuf->buf = realloc(pBuf->buf, pBuf->len + pBuf->left);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buf->base = pBuf->buf + pBuf->len;
|
|
||||||
buf->len = pBuf->cap - pBuf->len;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// check data read from socket completely or not
|
// check data read from socket completely or not
|
||||||
|
@ -159,7 +145,7 @@ static bool readComplete(SConnBuffer* data) {
|
||||||
// // impl later
|
// // impl later
|
||||||
// STransMsgHead* pHead = (STransMsgHead*)pRecv->msg;
|
// STransMsgHead* pHead = (STransMsgHead*)pRecv->msg;
|
||||||
// SRpcInfo* pRpc = (SRpcInfo*)pRecv->shandle;
|
// SRpcInfo* pRpc = (SRpcInfo*)pRecv->shandle;
|
||||||
// SConn* pConn = pRecv->thandle;
|
// SSrvConn* pConn = pRecv->thandle;
|
||||||
// tDump(pRecv->msg, pRecv->msgLen);
|
// tDump(pRecv->msg, pRecv->msgLen);
|
||||||
// terrno = 0;
|
// terrno = 0;
|
||||||
// // SRpcReqContext* pContest;
|
// // SRpcReqContext* pContest;
|
||||||
|
@ -167,7 +153,7 @@ static bool readComplete(SConnBuffer* data) {
|
||||||
// // do auth and check
|
// // do auth and check
|
||||||
//}
|
//}
|
||||||
|
|
||||||
static int uvAuthMsg(SConn* pConn, char* msg, int len) {
|
static int uvAuthMsg(SSrvConn* pConn, char* msg, int len) {
|
||||||
STransMsgHead* pHead = (STransMsgHead*)msg;
|
STransMsgHead* pHead = (STransMsgHead*)msg;
|
||||||
|
|
||||||
int code = 0;
|
int code = 0;
|
||||||
|
@ -222,14 +208,14 @@ static int uvAuthMsg(SConn* pConn, char* msg, int len) {
|
||||||
|
|
||||||
// refers specifically to query or insert timeout
|
// refers specifically to query or insert timeout
|
||||||
static void uvHandleActivityTimeout(uv_timer_t* handle) {
|
static void uvHandleActivityTimeout(uv_timer_t* handle) {
|
||||||
SConn* conn = handle->data;
|
SSrvConn* conn = handle->data;
|
||||||
tDebug("%p timeout since no activity", conn);
|
tDebug("%p timeout since no activity", conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void uvHandleReq(SConn* pConn) {
|
static void uvHandleReq(SSrvConn* pConn) {
|
||||||
SRecvInfo info;
|
SRecvInfo info;
|
||||||
SRecvInfo* p = &info;
|
SRecvInfo* p = &info;
|
||||||
SConnBuffer* pBuf = &pConn->connBuf;
|
SConnBuffer* pBuf = &pConn->readBuf;
|
||||||
p->msg = pBuf->buf;
|
p->msg = pBuf->buf;
|
||||||
p->msgLen = pBuf->len;
|
p->msgLen = pBuf->len;
|
||||||
p->ip = 0;
|
p->ip = 0;
|
||||||
|
@ -255,7 +241,6 @@ static void uvHandleReq(SConn* pConn) {
|
||||||
pHead->code = htonl(pHead->code);
|
pHead->code = htonl(pHead->code);
|
||||||
|
|
||||||
int32_t dlen = 0;
|
int32_t dlen = 0;
|
||||||
SRpcMsg rpcMsg;
|
|
||||||
if (transDecompressMsg(NULL, 0, NULL)) {
|
if (transDecompressMsg(NULL, 0, NULL)) {
|
||||||
// add compress later
|
// add compress later
|
||||||
// pHead = rpcDecompressRpcMsg(pHead);
|
// pHead = rpcDecompressRpcMsg(pHead);
|
||||||
|
@ -264,6 +249,8 @@ static void uvHandleReq(SConn* pConn) {
|
||||||
// impl later
|
// impl later
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SRpcMsg rpcMsg;
|
||||||
rpcMsg.contLen = transContLenFromMsg(pHead->msgLen);
|
rpcMsg.contLen = transContLenFromMsg(pHead->msgLen);
|
||||||
rpcMsg.pCont = pHead->content;
|
rpcMsg.pCont = pHead->content;
|
||||||
rpcMsg.msgType = pHead->msgType;
|
rpcMsg.msgType = pHead->msgType;
|
||||||
|
@ -271,6 +258,7 @@ static void uvHandleReq(SConn* pConn) {
|
||||||
rpcMsg.ahandle = NULL;
|
rpcMsg.ahandle = NULL;
|
||||||
rpcMsg.handle = pConn;
|
rpcMsg.handle = pConn;
|
||||||
|
|
||||||
|
transClearBuffer(&pConn->readBuf);
|
||||||
pConn->ref++;
|
pConn->ref++;
|
||||||
(*(pRpc->cfp))(pRpc->parent, &rpcMsg, NULL);
|
(*(pRpc->cfp))(pRpc->parent, &rpcMsg, NULL);
|
||||||
// uv_timer_start(pConn->pTimer, uvHandleActivityTimeout, pRpc->idleTime * 10000, 0);
|
// uv_timer_start(pConn->pTimer, uvHandleActivityTimeout, pRpc->idleTime * 10000, 0);
|
||||||
|
@ -280,8 +268,8 @@ static void uvHandleReq(SConn* pConn) {
|
||||||
|
|
||||||
void uvOnReadCb(uv_stream_t* cli, ssize_t nread, const uv_buf_t* buf) {
|
void uvOnReadCb(uv_stream_t* cli, ssize_t nread, const uv_buf_t* buf) {
|
||||||
// opt
|
// opt
|
||||||
SConn* conn = cli->data;
|
SSrvConn* conn = cli->data;
|
||||||
SConnBuffer* pBuf = &conn->connBuf;
|
SConnBuffer* pBuf = &conn->readBuf;
|
||||||
if (nread > 0) {
|
if (nread > 0) {
|
||||||
pBuf->len += nread;
|
pBuf->len += nread;
|
||||||
tDebug("conn %p read summroy, total read: %d, current read: %d", conn, pBuf->len, (int)nread);
|
tDebug("conn %p read summroy, total read: %d, current read: %d", conn, pBuf->len, (int)nread);
|
||||||
|
@ -294,11 +282,12 @@ void uvOnReadCb(uv_stream_t* cli, ssize_t nread, const uv_buf_t* buf) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (nread == 0) {
|
if (nread == 0) {
|
||||||
tDebug("conn %p except read", conn);
|
|
||||||
// destroyConn(conn, true);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (nread != UV_EOF) {
|
if (nread < 0 || nread != UV_EOF) {
|
||||||
|
if (conn->ref > 1) {
|
||||||
|
conn->ref++; // ref > 1 signed that write is in progress
|
||||||
|
}
|
||||||
tDebug("conn %p read error: %s", conn, uv_err_name(nread));
|
tDebug("conn %p read error: %s", conn, uv_err_name(nread));
|
||||||
destroyConn(conn, true);
|
destroyConn(conn, true);
|
||||||
}
|
}
|
||||||
|
@ -310,25 +299,23 @@ void uvAllocConnBufferCb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* b
|
||||||
|
|
||||||
void uvOnTimeoutCb(uv_timer_t* handle) {
|
void uvOnTimeoutCb(uv_timer_t* handle) {
|
||||||
// opt
|
// opt
|
||||||
SConn* pConn = handle->data;
|
SSrvConn* pConn = handle->data;
|
||||||
tDebug("conn %p time out", pConn);
|
tDebug("conn %p time out", pConn);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uvOnWriteCb(uv_write_t* req, int status) {
|
void uvOnWriteCb(uv_write_t* req, int status) {
|
||||||
SConn* conn = req->data;
|
SSrvConn* conn = req->data;
|
||||||
|
|
||||||
SConnBuffer* buf = &conn->connBuf;
|
SSrvMsg* smsg = conn->pSrvMsg;
|
||||||
buf->len = 0;
|
destroySmsg(smsg);
|
||||||
memset(buf->buf, 0, buf->cap);
|
conn->pSrvMsg = NULL;
|
||||||
buf->left = -1;
|
|
||||||
|
|
||||||
SRpcMsg* pMsg = &conn->sendMsg;
|
|
||||||
transFreeMsg(pMsg->pCont);
|
|
||||||
|
|
||||||
|
transClearBuffer(&conn->readBuf);
|
||||||
if (status == 0) {
|
if (status == 0) {
|
||||||
tDebug("conn %p data already was written on stream", conn);
|
tDebug("conn %p data already was written on stream", conn);
|
||||||
} else {
|
} else {
|
||||||
tDebug("conn %p failed to write data, %s", conn, uv_err_name(status));
|
tDebug("conn %p failed to write data, %s", conn, uv_err_name(status));
|
||||||
|
//
|
||||||
destroyConn(conn, true);
|
destroyConn(conn, true);
|
||||||
}
|
}
|
||||||
// opt
|
// opt
|
||||||
|
@ -341,16 +328,16 @@ static void uvOnPipeWriteCb(uv_write_t* req, int status) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void uvPrepareSendData(SConn* conn, uv_buf_t* wb) {
|
static void uvPrepareSendData(SSrvMsg* smsg, uv_buf_t* wb) {
|
||||||
// impl later;
|
// impl later;
|
||||||
tDebug("conn %p prepare to send resp", conn);
|
tDebug("conn %p prepare to send resp", smsg->pConn);
|
||||||
SRpcMsg* pMsg = &conn->sendMsg;
|
SRpcMsg* pMsg = &smsg->msg;
|
||||||
if (pMsg->pCont == 0) {
|
if (pMsg->pCont == 0) {
|
||||||
pMsg->pCont = (void*)rpcMallocCont(0);
|
pMsg->pCont = (void*)rpcMallocCont(0);
|
||||||
pMsg->contLen = 0;
|
pMsg->contLen = 0;
|
||||||
}
|
}
|
||||||
STransMsgHead* pHead = transHeadFromCont(pMsg->pCont);
|
STransMsgHead* pHead = transHeadFromCont(pMsg->pCont);
|
||||||
pHead->msgType = conn->inType + 1;
|
pHead->msgType = smsg->pConn->inType + 1;
|
||||||
// add more info
|
// add more info
|
||||||
char* msg = (char*)pHead;
|
char* msg = (char*)pHead;
|
||||||
int32_t len = transMsgLenFromCont(pMsg->contLen);
|
int32_t len = transMsgLenFromCont(pMsg->contLen);
|
||||||
|
@ -361,28 +348,53 @@ static void uvPrepareSendData(SConn* conn, uv_buf_t* wb) {
|
||||||
wb->base = msg;
|
wb->base = msg;
|
||||||
wb->len = len;
|
wb->len = len;
|
||||||
}
|
}
|
||||||
|
static void uvStartSendResp(SSrvMsg* smsg) {
|
||||||
|
// impl
|
||||||
|
uv_buf_t wb;
|
||||||
|
uvPrepareSendData(smsg, &wb);
|
||||||
|
|
||||||
|
SSrvConn* pConn = smsg->pConn;
|
||||||
|
uv_timer_stop(pConn->pTimer);
|
||||||
|
|
||||||
|
pConn->pSrvMsg = smsg;
|
||||||
|
// conn->pWriter->data = smsg;
|
||||||
|
uv_write(pConn->pWriter, (uv_stream_t*)pConn->pTcp, &wb, 1, uvOnWriteCb);
|
||||||
|
|
||||||
|
// SRpcMsg* rpcMsg = smsg->msg;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
static void destroySmsg(SSrvMsg* smsg) {
|
||||||
|
if (smsg == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
transFreeMsg(smsg->msg.pCont);
|
||||||
|
free(smsg);
|
||||||
|
}
|
||||||
void uvWorkerAsyncCb(uv_async_t* handle) {
|
void uvWorkerAsyncCb(uv_async_t* handle) {
|
||||||
SWorkThrdObj* pThrd = handle->data;
|
SWorkThrdObj* pThrd = handle->data;
|
||||||
SConn* conn = NULL;
|
SSrvConn* conn = NULL;
|
||||||
queue wq;
|
queue wq;
|
||||||
// batch process to avoid to lock/unlock frequently
|
// batch process to avoid to lock/unlock frequently
|
||||||
pthread_mutex_lock(&pThrd->connMtx);
|
pthread_mutex_lock(&pThrd->msgMtx);
|
||||||
QUEUE_MOVE(&pThrd->conn, &wq);
|
QUEUE_MOVE(&pThrd->msg, &wq);
|
||||||
pthread_mutex_unlock(&pThrd->connMtx);
|
pthread_mutex_unlock(&pThrd->msgMtx);
|
||||||
|
|
||||||
while (!QUEUE_IS_EMPTY(&wq)) {
|
while (!QUEUE_IS_EMPTY(&wq)) {
|
||||||
queue* head = QUEUE_HEAD(&wq);
|
queue* head = QUEUE_HEAD(&wq);
|
||||||
QUEUE_REMOVE(head);
|
QUEUE_REMOVE(head);
|
||||||
SConn* conn = QUEUE_DATA(head, SConn, queue);
|
|
||||||
if (conn == NULL) {
|
|
||||||
tError("except occurred, do nothing");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
uv_buf_t wb;
|
|
||||||
uvPrepareSendData(conn, &wb);
|
|
||||||
uv_timer_stop(conn->pTimer);
|
|
||||||
|
|
||||||
uv_write(conn->pWriter, (uv_stream_t*)conn->pTcp, &wb, 1, uvOnWriteCb);
|
SSrvMsg* msg = QUEUE_DATA(head, SSrvMsg, q);
|
||||||
|
if (msg == NULL) {
|
||||||
|
tError("except occurred, continue");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
uvStartSendResp(msg);
|
||||||
|
// uv_buf_t wb;
|
||||||
|
// uvPrepareSendData(msg, &wb);
|
||||||
|
// uv_timer_stop(conn->pTimer);
|
||||||
|
|
||||||
|
// uv_write(conn->pWriter, (uv_stream_t*)conn->pTcp, &wb, 1, uvOnWriteCb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -435,7 +447,7 @@ void uvOnConnectionCb(uv_stream_t* q, ssize_t nread, const uv_buf_t* buf) {
|
||||||
uv_handle_type pending = uv_pipe_pending_type(pipe);
|
uv_handle_type pending = uv_pipe_pending_type(pipe);
|
||||||
assert(pending == UV_TCP);
|
assert(pending == UV_TCP);
|
||||||
|
|
||||||
SConn* pConn = createConn();
|
SSrvConn* pConn = createConn();
|
||||||
|
|
||||||
pConn->pTransInst = pThrd->pTransInst;
|
pConn->pTransInst = pThrd->pTransInst;
|
||||||
/* init conn timer*/
|
/* init conn timer*/
|
||||||
|
@ -484,8 +496,8 @@ static bool addHandleToWorkloop(void* arg) {
|
||||||
|
|
||||||
pThrd->pipe->data = pThrd;
|
pThrd->pipe->data = pThrd;
|
||||||
|
|
||||||
QUEUE_INIT(&pThrd->conn);
|
QUEUE_INIT(&pThrd->msg);
|
||||||
pthread_mutex_init(&pThrd->connMtx, NULL);
|
pthread_mutex_init(&pThrd->msgMtx, NULL);
|
||||||
|
|
||||||
pThrd->workerAsync = malloc(sizeof(uv_async_t));
|
pThrd->workerAsync = malloc(sizeof(uv_async_t));
|
||||||
uv_async_init(pThrd->loop, pThrd->workerAsync, uvWorkerAsyncCb);
|
uv_async_init(pThrd->loop, pThrd->workerAsync, uvWorkerAsyncCb);
|
||||||
|
@ -523,34 +535,43 @@ void* workerThread(void* arg) {
|
||||||
uv_run(pThrd->loop, UV_RUN_DEFAULT);
|
uv_run(pThrd->loop, UV_RUN_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static SConn* createConn() {
|
static SSrvConn* createConn() {
|
||||||
SConn* pConn = (SConn*)calloc(1, sizeof(SConn));
|
SSrvConn* pConn = (SSrvConn*)calloc(1, sizeof(SSrvConn));
|
||||||
|
tDebug("conn %p created", pConn);
|
||||||
++pConn->ref;
|
++pConn->ref;
|
||||||
return pConn;
|
return pConn;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void destroyConn(SConn* conn, bool clear) {
|
static void destroyConn(SSrvConn* conn, bool clear) {
|
||||||
if (conn == NULL) {
|
if (conn == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (--conn->ref == 0) {
|
// SRpcMsg* pMsg = &conn->sendMsg;
|
||||||
|
// transFreeMsg(pMsg->pCont);
|
||||||
|
// pMsg->pCont = NULL;
|
||||||
|
|
||||||
|
tDebug("conn %p try to destroy", conn);
|
||||||
|
if (--conn->ref > 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
transDestroyBuffer(&conn->readBuf);
|
||||||
|
destroySmsg(conn->pSrvMsg);
|
||||||
|
conn->pSrvMsg = NULL;
|
||||||
|
|
||||||
if (clear) {
|
if (clear) {
|
||||||
uv_close((uv_handle_t*)conn->pTcp, NULL);
|
uv_close((uv_handle_t*)conn->pTcp, uvDestroyConn);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
static void uvDestroyConn(uv_handle_t* handle) {
|
||||||
|
SSrvConn* conn = handle->data;
|
||||||
|
tDebug("conn %p destroy", conn);
|
||||||
uv_timer_stop(conn->pTimer);
|
uv_timer_stop(conn->pTimer);
|
||||||
free(conn->pTimer);
|
free(conn->pTimer);
|
||||||
free(conn->pTcp);
|
// free(conn->pTcp);
|
||||||
free(conn->connBuf.buf);
|
|
||||||
free(conn->pWriter);
|
free(conn->pWriter);
|
||||||
free(conn);
|
free(conn);
|
||||||
}
|
}
|
||||||
static void uvDestroyConn(uv_handle_t* handle) {
|
static int transAddAuthPart(SSrvConn* pConn, char* msg, int msgLen) {
|
||||||
SConn* conn = handle->data;
|
|
||||||
destroyConn(conn, false);
|
|
||||||
}
|
|
||||||
static int transAddAuthPart(SConn* pConn, char* msg, int msgLen) {
|
|
||||||
STransMsgHead* pHead = (STransMsgHead*)msg;
|
STransMsgHead* pHead = (STransMsgHead*)msg;
|
||||||
|
|
||||||
if (pConn->spi && pConn->secured == 0) {
|
if (pConn->spi && pConn->secured == 0) {
|
||||||
|
@ -632,6 +653,7 @@ void destroyWorkThrd(SWorkThrdObj* pThrd) {
|
||||||
pthread_join(pThrd->thread, NULL);
|
pthread_join(pThrd->thread, NULL);
|
||||||
// free(srv->pipe[i]);
|
// free(srv->pipe[i]);
|
||||||
free(pThrd->loop);
|
free(pThrd->loop);
|
||||||
|
pthread_mutex_destroy(&pThrd->msgMtx);
|
||||||
free(pThrd);
|
free(pThrd);
|
||||||
}
|
}
|
||||||
void taosCloseServer(void* arg) {
|
void taosCloseServer(void* arg) {
|
||||||
|
@ -648,17 +670,20 @@ void taosCloseServer(void* arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void rpcSendResponse(const SRpcMsg* pMsg) {
|
void rpcSendResponse(const SRpcMsg* pMsg) {
|
||||||
SConn* pConn = pMsg->handle;
|
SSrvConn* pConn = pMsg->handle;
|
||||||
SWorkThrdObj* pThrd = pConn->hostThrd;
|
SWorkThrdObj* pThrd = pConn->hostThrd;
|
||||||
|
|
||||||
// opt later
|
SSrvMsg* srvMsg = calloc(1, sizeof(SSrvMsg));
|
||||||
pConn->sendMsg = *pMsg;
|
srvMsg->pConn = pConn;
|
||||||
pthread_mutex_lock(&pThrd->connMtx);
|
srvMsg->msg = *pMsg;
|
||||||
QUEUE_PUSH(&pThrd->conn, &pConn->queue);
|
|
||||||
pthread_mutex_unlock(&pThrd->connMtx);
|
pthread_mutex_lock(&pThrd->msgMtx);
|
||||||
|
QUEUE_PUSH(&pThrd->msg, &srvMsg->q);
|
||||||
|
pthread_mutex_unlock(&pThrd->msgMtx);
|
||||||
|
|
||||||
tDebug("conn %p start to send resp", pConn);
|
tDebug("conn %p start to send resp", pConn);
|
||||||
|
|
||||||
uv_async_send(pConn->pWorkerAsync);
|
uv_async_send(pThrd->workerAsync);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -65,6 +65,7 @@ static void *sendRequest(void *param) {
|
||||||
// tsem_wait(&pInfo->rspSem);
|
// tsem_wait(&pInfo->rspSem);
|
||||||
tsem_wait(&pInfo->rspSem);
|
tsem_wait(&pInfo->rspSem);
|
||||||
tDebug("recv response succefully");
|
tDebug("recv response succefully");
|
||||||
|
|
||||||
// usleep(100000000);
|
// usleep(100000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -165,6 +165,7 @@ int main(int argc, char *argv[]) {
|
||||||
tError("failed to start RPC server");
|
tError("failed to start RPC server");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
// sleep(5);
|
||||||
|
|
||||||
tInfo("RPC server is running, ctrl-c to exit");
|
tInfo("RPC server is running, ctrl-c to exit");
|
||||||
|
|
||||||
|
@ -172,7 +173,6 @@ int main(int argc, char *argv[]) {
|
||||||
dataFd = open(dataName, O_APPEND | O_CREAT | O_WRONLY, S_IRWXU | S_IRWXG | S_IRWXO);
|
dataFd = open(dataName, O_APPEND | O_CREAT | O_WRONLY, S_IRWXU | S_IRWXG | S_IRWXO);
|
||||||
if (dataFd < 0) tInfo("failed to open data file, reason:%s", strerror(errno));
|
if (dataFd < 0) tInfo("failed to open data file, reason:%s", strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
qhandle = taosOpenQueue();
|
qhandle = taosOpenQueue();
|
||||||
qset = taosOpenQset();
|
qset = taosOpenQset();
|
||||||
taosAddIntoQset(qset, qhandle, NULL);
|
taosAddIntoQset(qset, qhandle, NULL);
|
||||||
|
|
|
@ -11,6 +11,7 @@ target_link_libraries(
|
||||||
PUBLIC cjson
|
PUBLIC cjson
|
||||||
PUBLIC os
|
PUBLIC os
|
||||||
PUBLIC util
|
PUBLIC util
|
||||||
|
PUBLIC common
|
||||||
)
|
)
|
||||||
|
|
||||||
if(${BUILD_TEST})
|
if(${BUILD_TEST})
|
||||||
|
|
|
@ -257,7 +257,7 @@ static int walWriteIndex(SWal *pWal, int64_t ver, int64_t offset) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t walWrite(SWal *pWal, int64_t index, uint8_t msgType, const void *body, int32_t bodyLen) {
|
int64_t walWrite(SWal *pWal, int64_t index, tmsg_t msgType, const void *body, int32_t bodyLen) {
|
||||||
if (pWal == NULL) return -1;
|
if (pWal == NULL) return -1;
|
||||||
int code = 0;
|
int code = 0;
|
||||||
|
|
||||||
|
|
|
@ -13,29 +13,30 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "os.h"
|
#define _DEFAULT_SOURCE
|
||||||
|
|
||||||
#include "taoserror.h"
|
|
||||||
#include "tqueue.h"
|
#include "tqueue.h"
|
||||||
|
#include "taoserror.h"
|
||||||
#include "ulog.h"
|
#include "ulog.h"
|
||||||
|
|
||||||
typedef struct STaosQnode STaosQnode;
|
typedef struct STaosQnode STaosQnode;
|
||||||
|
|
||||||
typedef struct STaosQnode {
|
typedef struct STaosQnode {
|
||||||
STaosQnode *next;
|
STaosQnode *next;
|
||||||
|
STaosQueue *queue;
|
||||||
char item[];
|
char item[];
|
||||||
} STaosQnode;
|
} STaosQnode;
|
||||||
|
|
||||||
typedef struct STaosQueue {
|
typedef struct STaosQueue {
|
||||||
int32_t itemSize;
|
int32_t itemSize;
|
||||||
int32_t numOfItems;
|
int32_t numOfItems;
|
||||||
|
int32_t threadId;
|
||||||
STaosQnode * head;
|
STaosQnode * head;
|
||||||
STaosQnode * tail;
|
STaosQnode * tail;
|
||||||
STaosQueue * next; // for queue set
|
STaosQueue * next; // for queue set
|
||||||
STaosQset * qset; // for queue set
|
STaosQset * qset; // for queue set
|
||||||
void * ahandle; // for queue set
|
void * ahandle; // for queue set
|
||||||
FProcessItem itemFp;
|
FItem itemFp;
|
||||||
FProcessItems itemsFp;
|
FItems itemsFp;
|
||||||
pthread_mutex_t mutex;
|
pthread_mutex_t mutex;
|
||||||
} STaosQueue;
|
} STaosQueue;
|
||||||
|
|
||||||
|
@ -56,19 +57,23 @@ typedef struct STaosQall {
|
||||||
} STaosQall;
|
} STaosQall;
|
||||||
|
|
||||||
STaosQueue *taosOpenQueue() {
|
STaosQueue *taosOpenQueue() {
|
||||||
STaosQueue *queue = calloc(sizeof(STaosQueue), 1);
|
STaosQueue *queue = calloc(1, sizeof(STaosQueue));
|
||||||
if (queue == NULL) {
|
if (queue == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_init(&queue->mutex, NULL);
|
if (pthread_mutex_init(&queue->mutex, NULL) != 0) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
uTrace("queue:%p is opened", queue);
|
queue->threadId = -1;
|
||||||
|
uDebug("queue:%p is opened", queue);
|
||||||
return queue;
|
return queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosSetQueueFp(STaosQueue *queue, FProcessItem itemFp, FProcessItems itemsFp) {
|
void taosSetQueueFp(STaosQueue *queue, FItem itemFp, FItems itemsFp) {
|
||||||
if (queue == NULL) return;
|
if (queue == NULL) return;
|
||||||
queue->itemFp = itemFp;
|
queue->itemFp = itemFp;
|
||||||
queue->itemsFp = itemsFp;
|
queue->itemsFp = itemsFp;
|
||||||
|
@ -85,7 +90,9 @@ void taosCloseQueue(STaosQueue *queue) {
|
||||||
qset = queue->qset;
|
qset = queue->qset;
|
||||||
pthread_mutex_unlock(&queue->mutex);
|
pthread_mutex_unlock(&queue->mutex);
|
||||||
|
|
||||||
if (queue->qset) taosRemoveFromQset(qset, queue);
|
if (queue->qset) {
|
||||||
|
taosRemoveFromQset(qset, queue);
|
||||||
|
}
|
||||||
|
|
||||||
while (pNode) {
|
while (pNode) {
|
||||||
pTemp = pNode;
|
pTemp = pNode;
|
||||||
|
@ -96,7 +103,7 @@ void taosCloseQueue(STaosQueue *queue) {
|
||||||
pthread_mutex_destroy(&queue->mutex);
|
pthread_mutex_destroy(&queue->mutex);
|
||||||
free(queue);
|
free(queue);
|
||||||
|
|
||||||
uTrace("queue:%p is closed", queue);
|
uDebug("queue:%p is closed", queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taosQueueEmpty(STaosQueue *queue) {
|
bool taosQueueEmpty(STaosQueue *queue) {
|
||||||
|
@ -120,19 +127,23 @@ int32_t taosQueueSize(STaosQueue *queue) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void *taosAllocateQitem(int32_t size) {
|
void *taosAllocateQitem(int32_t size) {
|
||||||
STaosQnode *pNode = (STaosQnode *)calloc(sizeof(STaosQnode) + size, 1);
|
STaosQnode *pNode = calloc(1, sizeof(STaosQnode) + size);
|
||||||
|
|
||||||
|
if (pNode == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (pNode == NULL) return NULL;
|
|
||||||
uTrace("item:%p, node:%p is allocated", pNode->item, pNode);
|
uTrace("item:%p, node:%p is allocated", pNode->item, pNode);
|
||||||
return (void *)pNode->item;
|
return (void *)pNode->item;
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosFreeQitem(void *param) {
|
void taosFreeQitem(void *pItem) {
|
||||||
if (param == NULL) return;
|
if (pItem == NULL) return;
|
||||||
|
|
||||||
char *temp = (char *)param;
|
char *temp = pItem;
|
||||||
temp -= sizeof(STaosQnode);
|
temp -= sizeof(STaosQnode);
|
||||||
uTrace("item:%p, node:%p is freed", param, temp);
|
uTrace("item:%p, node:%p is freed", pItem, temp);
|
||||||
free(temp);
|
free(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,7 +186,7 @@ int32_t taosReadQitem(STaosQueue *queue, void **ppItem) {
|
||||||
queue->numOfItems--;
|
queue->numOfItems--;
|
||||||
if (queue->qset) atomic_sub_fetch_32(&queue->qset->numOfItems, 1);
|
if (queue->qset) atomic_sub_fetch_32(&queue->qset->numOfItems, 1);
|
||||||
code = 1;
|
code = 1;
|
||||||
uDebug("item:%p is read out from queue:%p, items:%d", *ppItem, queue, queue->numOfItems);
|
uTrace("item:%p is read out from queue:%p, items:%d", *ppItem, queue, queue->numOfItems);
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock(&queue->mutex);
|
pthread_mutex_unlock(&queue->mutex);
|
||||||
|
@ -183,7 +194,7 @@ int32_t taosReadQitem(STaosQueue *queue, void **ppItem) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
STaosQall *taosAllocateQall() { return calloc(sizeof(STaosQall), 1); }
|
STaosQall *taosAllocateQall() { return calloc(1, sizeof(STaosQall)); }
|
||||||
|
|
||||||
void taosFreeQall(STaosQall *qall) { free(qall); }
|
void taosFreeQall(STaosQall *qall) { free(qall); }
|
||||||
|
|
||||||
|
@ -238,7 +249,7 @@ int32_t taosGetQitem(STaosQall *qall, void **ppItem) {
|
||||||
void taosResetQitems(STaosQall *qall) { qall->current = qall->start; }
|
void taosResetQitems(STaosQall *qall) { qall->current = qall->start; }
|
||||||
|
|
||||||
STaosQset *taosOpenQset() {
|
STaosQset *taosOpenQset() {
|
||||||
STaosQset *qset = (STaosQset *)calloc(sizeof(STaosQset), 1);
|
STaosQset *qset = calloc(sizeof(STaosQset), 1);
|
||||||
if (qset == NULL) {
|
if (qset == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -247,7 +258,7 @@ STaosQset *taosOpenQset() {
|
||||||
pthread_mutex_init(&qset->mutex, NULL);
|
pthread_mutex_init(&qset->mutex, NULL);
|
||||||
tsem_init(&qset->sem, 0, 0);
|
tsem_init(&qset->sem, 0, 0);
|
||||||
|
|
||||||
uTrace("qset:%p is opened", qset);
|
uDebug("qset:%p is opened", qset);
|
||||||
return qset;
|
return qset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,7 +279,7 @@ void taosCloseQset(STaosQset *qset) {
|
||||||
pthread_mutex_destroy(&qset->mutex);
|
pthread_mutex_destroy(&qset->mutex);
|
||||||
tsem_destroy(&qset->sem);
|
tsem_destroy(&qset->sem);
|
||||||
free(qset);
|
free(qset);
|
||||||
uTrace("qset:%p is closed", qset);
|
uDebug("qset:%p is closed", qset);
|
||||||
}
|
}
|
||||||
|
|
||||||
// tsem_post 'qset->sem', so that reader threads waiting for it
|
// tsem_post 'qset->sem', so that reader threads waiting for it
|
||||||
|
@ -338,12 +349,12 @@ void taosRemoveFromQset(STaosQset *qset, STaosQueue *queue) {
|
||||||
|
|
||||||
pthread_mutex_unlock(&qset->mutex);
|
pthread_mutex_unlock(&qset->mutex);
|
||||||
|
|
||||||
uTrace("queue:%p is removed from qset:%p", queue, qset);
|
uDebug("queue:%p is removed from qset:%p", queue, qset);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosGetQueueNumber(STaosQset *qset) { return qset->numOfQueues; }
|
int32_t taosGetQueueNumber(STaosQset *qset) { return qset->numOfQueues; }
|
||||||
|
|
||||||
int32_t taosReadQitemFromQset(STaosQset *qset, void **ppItem, void **ahandle, FProcessItem *itemFp) {
|
int32_t taosReadQitemFromQset(STaosQset *qset, void **ppItem, void **ahandle, FItem *itemFp) {
|
||||||
STaosQnode *pNode = NULL;
|
STaosQnode *pNode = NULL;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
@ -365,6 +376,7 @@ int32_t taosReadQitemFromQset(STaosQset *qset, void **ppItem, void **ahandle, FP
|
||||||
*ppItem = pNode->item;
|
*ppItem = pNode->item;
|
||||||
if (ahandle) *ahandle = queue->ahandle;
|
if (ahandle) *ahandle = queue->ahandle;
|
||||||
if (itemFp) *itemFp = queue->itemFp;
|
if (itemFp) *itemFp = queue->itemFp;
|
||||||
|
|
||||||
queue->head = pNode->next;
|
queue->head = pNode->next;
|
||||||
if (queue->head == NULL) queue->tail = NULL;
|
if (queue->head == NULL) queue->tail = NULL;
|
||||||
queue->numOfItems--;
|
queue->numOfItems--;
|
||||||
|
@ -382,7 +394,7 @@ int32_t taosReadQitemFromQset(STaosQset *qset, void **ppItem, void **ahandle, FP
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosReadAllQitemsFromQset(STaosQset *qset, STaosQall *qall, void **ahandle, FProcessItems *itemsFp) {
|
int32_t taosReadAllQitemsFromQset(STaosQset *qset, STaosQall *qall, void **ahandle, FItems *itemsFp) {
|
||||||
STaosQueue *queue;
|
STaosQueue *queue;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
@ -411,7 +423,9 @@ int32_t taosReadAllQitemsFromQset(STaosQset *qset, STaosQall *qall, void **ahand
|
||||||
queue->tail = NULL;
|
queue->tail = NULL;
|
||||||
queue->numOfItems = 0;
|
queue->numOfItems = 0;
|
||||||
atomic_sub_fetch_32(&qset->numOfItems, qall->numOfItems);
|
atomic_sub_fetch_32(&qset->numOfItems, qall->numOfItems);
|
||||||
for (int32_t j = 1; j < qall->numOfItems; ++j) tsem_wait(&qset->sem);
|
for (int32_t j = 1; j < qall->numOfItems; ++j) {
|
||||||
|
tsem_wait(&qset->sem);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock(&queue->mutex);
|
pthread_mutex_unlock(&queue->mutex);
|
||||||
|
@ -423,6 +437,65 @@ int32_t taosReadAllQitemsFromQset(STaosQset *qset, STaosQall *qall, void **ahand
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t taosReadQitemFromQsetByThread(STaosQset *qset, void **ppItem, void **ahandle, FItem *itemFp, int32_t threadId) {
|
||||||
|
STaosQnode *pNode = NULL;
|
||||||
|
int32_t code = -1;
|
||||||
|
|
||||||
|
tsem_wait(&qset->sem);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&qset->mutex);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < qset->numOfQueues; ++i) {
|
||||||
|
if (qset->current == NULL) qset->current = qset->head;
|
||||||
|
STaosQueue *queue = qset->current;
|
||||||
|
if (queue) qset->current = queue->next;
|
||||||
|
if (queue == NULL) break;
|
||||||
|
if (queue->head == NULL) continue;
|
||||||
|
if (queue->threadId != -1 && queue->threadId != threadId) {
|
||||||
|
code = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_mutex_lock(&queue->mutex);
|
||||||
|
|
||||||
|
if (queue->head) {
|
||||||
|
pNode = queue->head;
|
||||||
|
pNode->queue = queue;
|
||||||
|
queue->threadId = threadId;
|
||||||
|
*ppItem = pNode->item;
|
||||||
|
|
||||||
|
if (ahandle) *ahandle = queue->ahandle;
|
||||||
|
if (itemFp) *itemFp = queue->itemFp;
|
||||||
|
|
||||||
|
queue->head = pNode->next;
|
||||||
|
if (queue->head == NULL) queue->tail = NULL;
|
||||||
|
queue->numOfItems--;
|
||||||
|
atomic_sub_fetch_32(&qset->numOfItems, 1);
|
||||||
|
code = 1;
|
||||||
|
uTrace("item:%p is read out from queue:%p, items:%d", *ppItem, queue, queue->numOfItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&queue->mutex);
|
||||||
|
if (pNode) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&qset->mutex);
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
void taosResetQsetThread(STaosQset *qset, void *pItem) {
|
||||||
|
if (pItem == NULL) return;
|
||||||
|
STaosQnode *pNode = (STaosQnode *)((char *)pItem - sizeof(STaosQnode));
|
||||||
|
|
||||||
|
pthread_mutex_lock(&qset->mutex);
|
||||||
|
pNode->queue->threadId = -1;
|
||||||
|
for (int32_t i = 0; i < pNode->queue->numOfItems; ++i) {
|
||||||
|
tsem_post(&qset->sem);
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&qset->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t taosGetQueueItemsNumber(STaosQueue *queue) {
|
int32_t taosGetQueueItemsNumber(STaosQueue *queue) {
|
||||||
if (!queue) return 0;
|
if (!queue) return 0;
|
||||||
|
|
||||||
|
|
|
@ -14,38 +14,46 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "os.h"
|
|
||||||
#include "ulog.h"
|
|
||||||
#include "tqueue.h"
|
|
||||||
#include "tworker.h"
|
#include "tworker.h"
|
||||||
|
#include "taoserror.h"
|
||||||
|
#include "ulog.h"
|
||||||
|
|
||||||
typedef void *(*ThreadFp)(void *param);
|
typedef void *(*ThreadFp)(void *param);
|
||||||
|
|
||||||
int32_t tWorkerInit(SWorkerPool *pool) {
|
int32_t tQWorkerInit(SQWorkerPool *pool) {
|
||||||
pool->qset = taosOpenQset();
|
pool->qset = taosOpenQset();
|
||||||
pool->workers = calloc(sizeof(SWorker), pool->max);
|
pool->workers = calloc(sizeof(SQWorker), pool->max);
|
||||||
pthread_mutex_init(&pool->mutex, NULL);
|
if (pool->workers == NULL) {
|
||||||
for (int i = 0; i < pool->max; ++i) {
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
SWorker *worker = pool->workers + i;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pthread_mutex_init(&pool->mutex, NULL)) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pool->max; ++i) {
|
||||||
|
SQWorker *worker = pool->workers + i;
|
||||||
worker->id = i;
|
worker->id = i;
|
||||||
worker->pool = pool;
|
worker->pool = pool;
|
||||||
}
|
}
|
||||||
|
|
||||||
uInfo("worker:%s is initialized, min:%d max:%d", pool->name, pool->min, pool->max);
|
uDebug("worker:%s is initialized, min:%d max:%d", pool->name, pool->min, pool->max);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tWorkerCleanup(SWorkerPool *pool) {
|
void tQWorkerCleanup(SQWorkerPool *pool) {
|
||||||
for (int i = 0; i < pool->max; ++i) {
|
for (int32_t i = 0; i < pool->max; ++i) {
|
||||||
SWorker *worker = pool->workers + i;
|
SQWorker *worker = pool->workers + i;
|
||||||
if (worker == NULL) continue;
|
if (worker == NULL) continue;
|
||||||
if (taosCheckPthreadValid(worker->thread)) {
|
if (taosCheckPthreadValid(worker->thread)) {
|
||||||
taosQsetThreadResume(pool->qset);
|
taosQsetThreadResume(pool->qset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < pool->max; ++i) {
|
for (int32_t i = 0; i < pool->max; ++i) {
|
||||||
SWorker *worker = pool->workers + i;
|
SQWorker *worker = pool->workers + i;
|
||||||
if (worker == NULL) continue;
|
if (worker == NULL) continue;
|
||||||
if (taosCheckPthreadValid(worker->thread)) {
|
if (taosCheckPthreadValid(worker->thread)) {
|
||||||
pthread_join(worker->thread, NULL);
|
pthread_join(worker->thread, NULL);
|
||||||
|
@ -56,12 +64,12 @@ void tWorkerCleanup(SWorkerPool *pool) {
|
||||||
taosCloseQset(pool->qset);
|
taosCloseQset(pool->qset);
|
||||||
pthread_mutex_destroy(&pool->mutex);
|
pthread_mutex_destroy(&pool->mutex);
|
||||||
|
|
||||||
uInfo("worker:%s is closed", pool->name);
|
uDebug("worker:%s is closed", pool->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *tWorkerThreadFp(SWorker *worker) {
|
static void *tQWorkerThreadFp(SQWorker *worker) {
|
||||||
SWorkerPool *pool = worker->pool;
|
SQWorkerPool *pool = worker->pool;
|
||||||
FProcessItem fp = NULL;
|
FItem fp = NULL;
|
||||||
|
|
||||||
void * msg = NULL;
|
void * msg = NULL;
|
||||||
void * ahandle = NULL;
|
void * ahandle = NULL;
|
||||||
|
@ -77,7 +85,7 @@ static void *tWorkerThreadFp(SWorker *worker) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fp) {
|
if (fp != NULL) {
|
||||||
(*fp)(ahandle, msg);
|
(*fp)(ahandle, msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,11 +93,12 @@ static void *tWorkerThreadFp(SWorker *worker) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
STaosQueue *tWorkerAllocQueue(SWorkerPool *pool, void *ahandle, FProcessItem fp) {
|
STaosQueue *tWorkerAllocQueue(SQWorkerPool *pool, void *ahandle, FItem fp, ThreadFp threadFp) {
|
||||||
pthread_mutex_lock(&pool->mutex);
|
pthread_mutex_lock(&pool->mutex);
|
||||||
STaosQueue *queue = taosOpenQueue();
|
STaosQueue *queue = taosOpenQueue();
|
||||||
if (queue == NULL) {
|
if (queue == NULL) {
|
||||||
pthread_mutex_unlock(&pool->mutex);
|
pthread_mutex_unlock(&pool->mutex);
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,14 +108,18 @@ STaosQueue *tWorkerAllocQueue(SWorkerPool *pool, void *ahandle, FProcessItem fp)
|
||||||
// spawn a thread to process queue
|
// spawn a thread to process queue
|
||||||
if (pool->num < pool->max) {
|
if (pool->num < pool->max) {
|
||||||
do {
|
do {
|
||||||
SWorker *worker = pool->workers + pool->num;
|
SQWorker *worker = pool->workers + pool->num;
|
||||||
|
|
||||||
pthread_attr_t thAttr;
|
pthread_attr_t thAttr;
|
||||||
pthread_attr_init(&thAttr);
|
pthread_attr_init(&thAttr);
|
||||||
pthread_attr_setdetachstate(&thAttr, PTHREAD_CREATE_JOINABLE);
|
pthread_attr_setdetachstate(&thAttr, PTHREAD_CREATE_JOINABLE);
|
||||||
|
|
||||||
if (pthread_create(&worker->thread, &thAttr, (ThreadFp)tWorkerThreadFp, worker) != 0) {
|
if (pthread_create(&worker->thread, &thAttr, threadFp, worker) != 0) {
|
||||||
uError("worker:%s:%d failed to create thread to process since %s", pool->name, worker->id, strerror(errno));
|
uError("worker:%s:%d failed to create thread to process since %s", pool->name, worker->id, strerror(errno));
|
||||||
|
taosCloseQueue(queue);
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
queue = NULL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_attr_destroy(&thAttr);
|
pthread_attr_destroy(&thAttr);
|
||||||
|
@ -121,19 +134,73 @@ STaosQueue *tWorkerAllocQueue(SWorkerPool *pool, void *ahandle, FProcessItem fp)
|
||||||
return queue;
|
return queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tWorkerFreeQueue(SWorkerPool *pool, STaosQueue *queue) {
|
STaosQueue *tQWorkerAllocQueue(SQWorkerPool *pool, void *ahandle, FItem fp) {
|
||||||
|
return tWorkerAllocQueue(pool, ahandle, fp, (ThreadFp)tQWorkerThreadFp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tQWorkerFreeQueue(SQWorkerPool *pool, STaosQueue *queue) {
|
||||||
taosCloseQueue(queue);
|
taosCloseQueue(queue);
|
||||||
uDebug("worker:%s, queue:%p is freed", pool->name, queue);
|
uDebug("worker:%s, queue:%p is freed", pool->name, queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tMWorkerInit(SMWorkerPool *pool) {
|
int32_t tFWorkerInit(SFWorkerPool *pool) { return tQWorkerInit((SQWorkerPool *)pool); }
|
||||||
pool->nextId = 0;
|
|
||||||
pool->workers = calloc(sizeof(SMWorker), pool->max);
|
void tFWorkerCleanup(SFWorkerPool *pool) { tQWorkerCleanup(pool); }
|
||||||
if (pool->workers == NULL) return -1;
|
|
||||||
|
static void *tFWorkerThreadFp(SQWorker *worker) {
|
||||||
|
SQWorkerPool *pool = worker->pool;
|
||||||
|
|
||||||
|
FItem fp = NULL;
|
||||||
|
void * msg = NULL;
|
||||||
|
void * ahandle = NULL;
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
taosBlockSIGPIPE();
|
||||||
|
setThreadName(pool->name);
|
||||||
|
uDebug("worker:%s:%d is running", pool->name, worker->id);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
code = taosReadQitemFromQsetByThread(pool->qset, (void **)&msg, &ahandle, &fp, worker->id);
|
||||||
|
|
||||||
|
if (code < 0) {
|
||||||
|
uDebug("worker:%s:%d qset:%p, got no message and exiting", pool->name, worker->id, pool->qset);
|
||||||
|
break;
|
||||||
|
} else if (code == 0) {
|
||||||
|
// uTrace("worker:%s:%d qset:%p, got no message and continue", pool->name, worker->id, pool->qset);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fp != NULL) {
|
||||||
|
(*fp)(ahandle, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosResetQsetThread(pool->qset, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STaosQueue *tFWorkerAllocQueue(SQWorkerPool *pool, void *ahandle, FItem fp) {
|
||||||
|
return tWorkerAllocQueue(pool, ahandle, fp, (ThreadFp)tFWorkerThreadFp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tFWorkerFreeQueue(SFWorkerPool *pool, STaosQueue *queue) { tQWorkerFreeQueue(pool, queue); }
|
||||||
|
|
||||||
|
int32_t tWWorkerInit(SWWorkerPool *pool) {
|
||||||
|
pool->nextId = 0;
|
||||||
|
pool->workers = calloc(sizeof(SWWorker), pool->max);
|
||||||
|
if (pool->workers == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pthread_mutex_init(&pool->mutex, NULL) != 0) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
pthread_mutex_init(&pool->mutex, NULL);
|
|
||||||
for (int32_t i = 0; i < pool->max; ++i) {
|
for (int32_t i = 0; i < pool->max; ++i) {
|
||||||
SMWorker *worker = pool->workers + i;
|
SWWorker *worker = pool->workers + i;
|
||||||
worker->id = i;
|
worker->id = i;
|
||||||
worker->qall = NULL;
|
worker->qall = NULL;
|
||||||
worker->qset = NULL;
|
worker->qset = NULL;
|
||||||
|
@ -144,16 +211,18 @@ int32_t tMWorkerInit(SMWorkerPool *pool) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tMWorkerCleanup(SMWorkerPool *pool) {
|
void tWWorkerCleanup(SWWorkerPool *pool) {
|
||||||
for (int32_t i = 0; i < pool->max; ++i) {
|
for (int32_t i = 0; i < pool->max; ++i) {
|
||||||
SMWorker *worker = pool->workers + i;
|
SWWorker *worker = pool->workers + i;
|
||||||
if (taosCheckPthreadValid(worker->thread)) {
|
if (taosCheckPthreadValid(worker->thread)) {
|
||||||
if (worker->qset) taosQsetThreadResume(worker->qset);
|
if (worker->qset) {
|
||||||
|
taosQsetThreadResume(worker->qset);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < pool->max; ++i) {
|
for (int32_t i = 0; i < pool->max; ++i) {
|
||||||
SMWorker *worker = pool->workers + i;
|
SWWorker *worker = pool->workers + i;
|
||||||
if (taosCheckPthreadValid(worker->thread)) {
|
if (taosCheckPthreadValid(worker->thread)) {
|
||||||
pthread_join(worker->thread, NULL);
|
pthread_join(worker->thread, NULL);
|
||||||
taosFreeQall(worker->qall);
|
taosFreeQall(worker->qall);
|
||||||
|
@ -167,9 +236,9 @@ void tMWorkerCleanup(SMWorkerPool *pool) {
|
||||||
uInfo("worker:%s is closed", pool->name);
|
uInfo("worker:%s is closed", pool->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *tWriteWorkerThreadFp(SMWorker *worker) {
|
static void *tWWorkerThreadFp(SWWorker *worker) {
|
||||||
SMWorkerPool *pool = worker->pool;
|
SWWorkerPool *pool = worker->pool;
|
||||||
FProcessItems fp = NULL;
|
FItems fp = NULL;
|
||||||
|
|
||||||
void * msg = NULL;
|
void * msg = NULL;
|
||||||
void * ahandle = NULL;
|
void * ahandle = NULL;
|
||||||
|
@ -187,7 +256,7 @@ static void *tWriteWorkerThreadFp(SMWorker *worker) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fp) {
|
if (fp != NULL) {
|
||||||
(*fp)(ahandle, worker->qall, numOfMsgs);
|
(*fp)(ahandle, worker->qall, numOfMsgs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -195,13 +264,14 @@ static void *tWriteWorkerThreadFp(SMWorker *worker) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
STaosQueue *tMWorkerAllocQueue(SMWorkerPool *pool, void *ahandle, FProcessItems fp) {
|
STaosQueue *tWWorkerAllocQueue(SWWorkerPool *pool, void *ahandle, FItems fp) {
|
||||||
pthread_mutex_lock(&pool->mutex);
|
pthread_mutex_lock(&pool->mutex);
|
||||||
SMWorker *worker = pool->workers + pool->nextId;
|
SWWorker *worker = pool->workers + pool->nextId;
|
||||||
|
|
||||||
STaosQueue *queue = taosOpenQueue();
|
STaosQueue *queue = taosOpenQueue();
|
||||||
if (queue == NULL) {
|
if (queue == NULL) {
|
||||||
pthread_mutex_unlock(&pool->mutex);
|
pthread_mutex_unlock(&pool->mutex);
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,17 +291,19 @@ STaosQueue *tMWorkerAllocQueue(SMWorkerPool *pool, void *ahandle, FProcessItems
|
||||||
taosCloseQset(worker->qset);
|
taosCloseQset(worker->qset);
|
||||||
taosCloseQueue(queue);
|
taosCloseQueue(queue);
|
||||||
pthread_mutex_unlock(&pool->mutex);
|
pthread_mutex_unlock(&pool->mutex);
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
pthread_attr_t thAttr;
|
pthread_attr_t thAttr;
|
||||||
pthread_attr_init(&thAttr);
|
pthread_attr_init(&thAttr);
|
||||||
pthread_attr_setdetachstate(&thAttr, PTHREAD_CREATE_JOINABLE);
|
pthread_attr_setdetachstate(&thAttr, PTHREAD_CREATE_JOINABLE);
|
||||||
|
|
||||||
if (pthread_create(&worker->thread, &thAttr, (ThreadFp)tWriteWorkerThreadFp, worker) != 0) {
|
if (pthread_create(&worker->thread, &thAttr, (ThreadFp)tWWorkerThreadFp, worker) != 0) {
|
||||||
uError("worker:%s:%d failed to create thread to process since %s", pool->name, worker->id, strerror(errno));
|
uError("worker:%s:%d failed to create thread to process since %s", pool->name, worker->id, strerror(errno));
|
||||||
taosFreeQall(worker->qall);
|
taosFreeQall(worker->qall);
|
||||||
taosCloseQset(worker->qset);
|
taosCloseQset(worker->qset);
|
||||||
taosCloseQueue(queue);
|
taosCloseQueue(queue);
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
queue = NULL;
|
queue = NULL;
|
||||||
} else {
|
} else {
|
||||||
uDebug("worker:%s:%d is launched, max:%d", pool->name, worker->id, pool->max);
|
uDebug("worker:%s:%d is launched, max:%d", pool->name, worker->id, pool->max);
|
||||||
|
@ -250,7 +322,7 @@ STaosQueue *tMWorkerAllocQueue(SMWorkerPool *pool, void *ahandle, FProcessItems
|
||||||
return queue;
|
return queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tMWorkerFreeQueue(SMWorkerPool *pool, STaosQueue *queue) {
|
void tWWorkerFreeQueue(SWWorkerPool *pool, STaosQueue *queue) {
|
||||||
taosCloseQueue(queue);
|
taosCloseQueue(queue);
|
||||||
uDebug("worker:%s, queue:%p is freed", pool->name, queue);
|
uDebug("worker:%s, queue:%p is freed", pool->name, queue);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,12 +13,12 @@ IF (HEADER_GTEST_INCLUDE_DIR AND (LIB_GTEST_STATIC_DIR OR LIB_GTEST_SHARED_DIR))
|
||||||
|
|
||||||
LIST(REMOVE_ITEM SOURCE_LIST ${CMAKE_CURRENT_SOURCE_DIR}/trefTest.c)
|
LIST(REMOVE_ITEM SOURCE_LIST ${CMAKE_CURRENT_SOURCE_DIR}/trefTest.c)
|
||||||
ADD_EXECUTABLE(utilTest ${SOURCE_LIST})
|
ADD_EXECUTABLE(utilTest ${SOURCE_LIST})
|
||||||
TARGET_LINK_LIBRARIES(utilTest util common os gtest pthread gcov)
|
TARGET_LINK_LIBRARIES(utilTest util common os gtest pthread)
|
||||||
|
|
||||||
LIST(REMOVE_ITEM SOURCE_LIST ${CMAKE_CURRENT_SOURCE_DIR}/cacheTest.cpp)
|
LIST(REMOVE_ITEM SOURCE_LIST ${CMAKE_CURRENT_SOURCE_DIR}/cacheTest.cpp)
|
||||||
LIST(APPEND SOURCE_LIST ${CMAKE_CURRENT_SOURCE_DIR}/hashTest.cpp)
|
LIST(APPEND SOURCE_LIST ${CMAKE_CURRENT_SOURCE_DIR}/hashTest.cpp)
|
||||||
ADD_EXECUTABLE(hashTest ${SOURCE_LIST})
|
ADD_EXECUTABLE(hashTest ${SOURCE_LIST})
|
||||||
TARGET_LINK_LIBRARIES(hashTest util common os gtest pthread gcov)
|
TARGET_LINK_LIBRARIES(hashTest util common os gtest pthread)
|
||||||
|
|
||||||
LIST(APPEND BIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/trefTest.c)
|
LIST(APPEND BIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/trefTest.c)
|
||||||
ADD_EXECUTABLE(trefTest ${BIN_SRC})
|
ADD_EXECUTABLE(trefTest ${BIN_SRC})
|
||||||
|
|
|
@ -178,9 +178,9 @@ if $rows != 3 then
|
||||||
endi
|
endi
|
||||||
|
|
||||||
sql select * from st
|
sql select * from st
|
||||||
#if $rows != 15 then
|
if $rows != 15 then
|
||||||
# return -1
|
return -1
|
||||||
#endi
|
endi
|
||||||
|
|
||||||
print =============== drop dnode
|
print =============== drop dnode
|
||||||
sql drop dnode 2;
|
sql drop dnode 2;
|
||||||
|
|
|
@ -139,9 +139,9 @@ endi
|
||||||
|
|
||||||
print =============== query data frpm st
|
print =============== query data frpm st
|
||||||
sql select * from st
|
sql select * from st
|
||||||
#if $rows != 21 then
|
if $rows != 21 then
|
||||||
# return -1
|
return -1
|
||||||
#endi
|
endi
|
||||||
|
|
||||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
system sh/exec.sh -n dnode1 -s start
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
@ -200,8 +200,8 @@ endi
|
||||||
|
|
||||||
print =============== query data frpm st
|
print =============== query data frpm st
|
||||||
sql select * from st
|
sql select * from st
|
||||||
#if $rows != 21 then
|
if $rows != 21 then
|
||||||
# return -1
|
return -1
|
||||||
#endi
|
endi
|
||||||
|
|
||||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
Loading…
Reference in New Issue