commit
7b8e19da56
|
@ -1033,6 +1033,13 @@ typedef struct {
|
||||||
uint64_t taskId;
|
uint64_t taskId;
|
||||||
} SSinkDataReq;
|
} SSinkDataReq;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SMsgHead header;
|
||||||
|
uint64_t sId;
|
||||||
|
uint64_t queryId;
|
||||||
|
uint64_t taskId;
|
||||||
|
} SQueryContinueReq;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SMsgHead header;
|
SMsgHead header;
|
||||||
|
|
|
@ -170,6 +170,8 @@ enum {
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_DROP_TOPIC, "vnode-drop-topic", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_DROP_TOPIC, "vnode-drop-topic", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_SHOW_TABLES, "vnode-show-tables", SVShowTablesReq, SVShowTablesRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_SHOW_TABLES, "vnode-show-tables", SVShowTablesReq, SVShowTablesRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_SHOW_TABLES_FETCH, "vnode-show-tables-fetch", SVShowTablesFetchReq, SVShowTablesFetchRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_SHOW_TABLES_FETCH, "vnode-show-tables-fetch", SVShowTablesFetchReq, SVShowTablesFetchRsp)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_VND_QUERY_CONTINUE, "vnode-query-continue", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_VND_SCHEDULE_DATA_SINK, "vnode-schedule-data-sink", NULL, NULL)
|
||||||
|
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_SUBSCRIBE, "vnode-subscribe", SMVSubscribeReq, SMVSubscribeRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_SUBSCRIBE, "vnode-subscribe", SMVSubscribeReq, SMVSubscribeRsp)
|
||||||
|
|
||||||
|
|
|
@ -22,9 +22,18 @@ extern "C" {
|
||||||
|
|
||||||
#include "trpc.h"
|
#include "trpc.h"
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
NODE_TYPE_VNODE = 1,
|
||||||
|
NODE_TYPE_QNODE,
|
||||||
|
NODE_TYPE_SNODE,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct SQWorkerCfg {
|
typedef struct SQWorkerCfg {
|
||||||
uint32_t maxSchedulerNum;
|
uint32_t maxSchedulerNum;
|
||||||
uint32_t maxResCacheNum;
|
uint32_t maxTaskNum;
|
||||||
uint32_t maxSchTaskNum;
|
uint32_t maxSchTaskNum;
|
||||||
} SQWorkerCfg;
|
} SQWorkerCfg;
|
||||||
|
|
||||||
|
@ -39,11 +48,17 @@ typedef struct {
|
||||||
uint64_t numOfErrors;
|
uint64_t numOfErrors;
|
||||||
} SQWorkerStat;
|
} SQWorkerStat;
|
||||||
|
|
||||||
|
typedef int32_t (*putReqToQueryQFp)(void *, struct SRpcMsg *);
|
||||||
|
|
||||||
int32_t qWorkerInit(SQWorkerCfg *cfg, void **qWorkerMgmt);
|
|
||||||
|
int32_t qWorkerInit(int8_t nodeType, int32_t nodeId, SQWorkerCfg *cfg, void **qWorkerMgmt, void *nodeObj, putReqToQueryQFp fp);
|
||||||
|
|
||||||
int32_t qWorkerProcessQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
int32_t qWorkerProcessQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
||||||
|
int32_t qWorkerProcessQueryContinueMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
||||||
|
int32_t qWorkerProcessDataSinkMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
||||||
int32_t qWorkerProcessReadyMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
int32_t qWorkerProcessReadyMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
||||||
int32_t qWorkerProcessStatusMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
int32_t qWorkerProcessStatusMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg);
|
||||||
|
|
|
@ -22,6 +22,7 @@ extern "C" {
|
||||||
#include "qworker.h"
|
#include "qworker.h"
|
||||||
#include "vnode.h"
|
#include "vnode.h"
|
||||||
|
|
||||||
|
|
||||||
typedef struct SQWorkerMgmt SQHandle;
|
typedef struct SQWorkerMgmt SQHandle;
|
||||||
|
|
||||||
int vnodeQueryOpen(SVnode *pVnode);
|
int vnodeQueryOpen(SVnode *pVnode);
|
||||||
|
|
|
@ -19,11 +19,22 @@
|
||||||
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, SRpcMsg **pRsp);
|
||||||
|
|
||||||
int vnodeQueryOpen(SVnode *pVnode) { return qWorkerInit(NULL, &pVnode->pQuery); }
|
int vnodeQueryOpen(SVnode *pVnode) { return qWorkerInit(NODE_TYPE_VNODE, pVnode->vgId, NULL, &pVnode->pQuery, pVnode, vnodePutReqToVQueryQ); }
|
||||||
|
|
||||||
int vnodeProcessQueryReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
int vnodeProcessQueryReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
vTrace("query message is processed");
|
vTrace("query message is processing");
|
||||||
return qWorkerProcessQueryMsg(pVnode->pTsdb, pVnode->pQuery, pMsg);
|
|
||||||
|
switch (pMsg->msgType) {
|
||||||
|
case TDMT_VND_QUERY:
|
||||||
|
return qWorkerProcessQueryMsg(pVnode->pTsdb, pVnode->pQuery, pMsg);
|
||||||
|
case TDMT_VND_QUERY_CONTINUE:
|
||||||
|
return qWorkerProcessQueryContinueMsg(pVnode->pTsdb, pVnode->pQuery, pMsg);
|
||||||
|
case TDMT_VND_SCHEDULE_DATA_SINK:
|
||||||
|
return qWorkerProcessDataSinkMsg(pVnode->pTsdb, pVnode->pQuery, pMsg);
|
||||||
|
default:
|
||||||
|
vError("unknown msg type:%d in query queue", pMsg->msgType);
|
||||||
|
return TSDB_CODE_VND_APP_ERROR;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int vnodeProcessFetchReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
int vnodeProcessFetchReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
|
||||||
|
|
|
@ -178,7 +178,9 @@ int32_t qExecTask(qTaskInfo_t tinfo, DataSinkHandle* handle) {
|
||||||
publishOperatorProfEvent(pTaskInfo->pRoot, QUERY_PROF_BEFORE_OPERATOR_EXEC);
|
publishOperatorProfEvent(pTaskInfo->pRoot, QUERY_PROF_BEFORE_OPERATOR_EXEC);
|
||||||
int64_t st = 0;
|
int64_t st = 0;
|
||||||
|
|
||||||
*handle = pTaskInfo->dsHandle;
|
if (handle) {
|
||||||
|
*handle = pTaskInfo->dsHandle;
|
||||||
|
}
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
st = taosGetTimestampUs();
|
st = taosGetTimestampUs();
|
||||||
|
|
|
@ -23,7 +23,7 @@ extern "C" {
|
||||||
#include "tlockfree.h"
|
#include "tlockfree.h"
|
||||||
|
|
||||||
#define QWORKER_DEFAULT_SCHEDULER_NUMBER 10000
|
#define QWORKER_DEFAULT_SCHEDULER_NUMBER 10000
|
||||||
#define QWORKER_DEFAULT_RES_CACHE_NUMBER 10000
|
#define QWORKER_DEFAULT_TASK_NUMBER 10000
|
||||||
#define QWORKER_DEFAULT_SCH_TASK_NUMBER 10000
|
#define QWORKER_DEFAULT_SCH_TASK_NUMBER 10000
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -57,7 +57,6 @@ enum {
|
||||||
QW_ADD_ACQUIRE,
|
QW_ADD_ACQUIRE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef struct SQWTaskStatus {
|
typedef struct SQWTaskStatus {
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
int32_t code;
|
int32_t code;
|
||||||
|
@ -67,12 +66,15 @@ typedef struct SQWTaskStatus {
|
||||||
bool drop;
|
bool drop;
|
||||||
} SQWTaskStatus;
|
} SQWTaskStatus;
|
||||||
|
|
||||||
typedef struct SQWorkerTaskHandlesCache {
|
typedef struct SQWTaskCtx {
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
|
int8_t sinkScheduled;
|
||||||
|
int8_t queryScheduled;
|
||||||
|
|
||||||
bool needRsp;
|
bool needRsp;
|
||||||
qTaskInfo_t taskHandle;
|
qTaskInfo_t taskHandle;
|
||||||
DataSinkHandle sinkHandle;
|
DataSinkHandle sinkHandle;
|
||||||
} SQWorkerTaskHandlesCache;
|
} SQWTaskCtx;
|
||||||
|
|
||||||
typedef struct SQWSchStatus {
|
typedef struct SQWSchStatus {
|
||||||
int32_t lastAccessTs; // timestamp in second
|
int32_t lastAccessTs; // timestamp in second
|
||||||
|
@ -82,11 +84,15 @@ typedef struct SQWSchStatus {
|
||||||
|
|
||||||
// Qnode/Vnode level task management
|
// Qnode/Vnode level task management
|
||||||
typedef struct SQWorkerMgmt {
|
typedef struct SQWorkerMgmt {
|
||||||
SQWorkerCfg cfg;
|
SQWorkerCfg cfg;
|
||||||
SRWLatch schLock;
|
int8_t nodeType;
|
||||||
SRWLatch resLock;
|
int32_t nodeId;
|
||||||
SHashObj *schHash; //key: schedulerId, value: SQWSchStatus
|
SRWLatch schLock;
|
||||||
SHashObj *resHash; //key: queryId+taskId, value: SQWorkerResCache
|
SRWLatch ctxLock;
|
||||||
|
SHashObj *schHash; //key: schedulerId, value: SQWSchStatus
|
||||||
|
SHashObj *ctxHash; //key: queryId+taskId, value: SQWTaskCtx
|
||||||
|
void *nodeObj;
|
||||||
|
putReqToQueryQFp putToQueueFp;
|
||||||
} SQWorkerMgmt;
|
} SQWorkerMgmt;
|
||||||
|
|
||||||
#define QW_GOT_RES_DATA(data) (true)
|
#define QW_GOT_RES_DATA(data) (true)
|
||||||
|
@ -94,41 +100,69 @@ typedef struct SQWorkerMgmt {
|
||||||
|
|
||||||
#define QW_TASK_NOT_EXIST(code) (TSDB_CODE_QRY_SCH_NOT_EXIST == (code) || TSDB_CODE_QRY_TASK_NOT_EXIST == (code))
|
#define QW_TASK_NOT_EXIST(code) (TSDB_CODE_QRY_SCH_NOT_EXIST == (code) || TSDB_CODE_QRY_TASK_NOT_EXIST == (code))
|
||||||
#define QW_TASK_ALREADY_EXIST(code) (TSDB_CODE_QRY_TASK_ALREADY_EXIST == (code))
|
#define QW_TASK_ALREADY_EXIST(code) (TSDB_CODE_QRY_TASK_ALREADY_EXIST == (code))
|
||||||
#define QW_TASK_READY_RESP(status) (status == JOB_TASK_STATUS_SUCCEED || status == JOB_TASK_STATUS_FAILED || status == JOB_TASK_STATUS_CANCELLED || status == JOB_TASK_STATUS_PARTIAL_SUCCEED)
|
#define QW_TASK_READY(status) (status == JOB_TASK_STATUS_SUCCEED || status == JOB_TASK_STATUS_FAILED || status == JOB_TASK_STATUS_CANCELLED || status == JOB_TASK_STATUS_PARTIAL_SUCCEED)
|
||||||
#define QW_SET_QTID(id, qid, tid) do { *(uint64_t *)(id) = (qid); *(uint64_t *)((char *)(id) + sizeof(qid)) = (tid); } while (0)
|
#define QW_SET_QTID(id, qId, tId) do { *(uint64_t *)(id) = (qId); *(uint64_t *)((char *)(id) + sizeof(qId)) = (tId); } while (0)
|
||||||
#define QW_GET_QTID(id, qid, tid) do { (qid) = *(uint64_t *)(id); (tid) = *(uint64_t *)((char *)(id) + sizeof(qid)); } while (0)
|
#define QW_GET_QTID(id, qId, tId) do { (qId) = *(uint64_t *)(id); (tId) = *(uint64_t *)((char *)(id) + sizeof(qId)); } while (0)
|
||||||
|
#define QW_IDS() sId, qId, tId
|
||||||
|
|
||||||
#define QW_ERR_RET(c) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { terrno = _code; return _code; } } while (0)
|
#define QW_ERR_RET(c) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { terrno = _code; return _code; } } while (0)
|
||||||
#define QW_RET(c) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { terrno = _code; } return _code; } while (0)
|
#define QW_RET(c) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { terrno = _code; } return _code; } while (0)
|
||||||
#define QW_ERR_LRET(c,...) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { qError(__VA_ARGS__); terrno = _code; return _code; } } while (0)
|
|
||||||
#define QW_ERR_JRET(c) do { code = c; if (code != TSDB_CODE_SUCCESS) { terrno = code; goto _return; } } while (0)
|
#define QW_ERR_JRET(c) do { code = c; if (code != TSDB_CODE_SUCCESS) { terrno = code; goto _return; } } while (0)
|
||||||
|
|
||||||
|
#define QW_ELOG(param, ...) qError("QW:%p " param, mgmt, __VA_ARGS__)
|
||||||
|
#define QW_DLOG(param, ...) qDebug("QW:%p " param, mgmt, __VA_ARGS__)
|
||||||
|
|
||||||
|
#define QW_SCH_ELOG(param, ...) qError("QW:%p SID:%"PRIx64" " param, mgmt, sId, __VA_ARGS__)
|
||||||
|
#define QW_SCH_DLOG(param, ...) qDebug("QW:%p SID:%"PRIx64" " param, mgmt, sId, __VA_ARGS__)
|
||||||
|
|
||||||
|
#define QW_TASK_ELOG(param, ...) qError("QW:%p QID:%"PRIx64",TID:%"PRIx64" " param, mgmt, qId, tId, __VA_ARGS__)
|
||||||
|
#define QW_TASK_WLOG(param, ...) qWarn("QW:%p QID:%"PRIx64",TID:%"PRIx64" " param, mgmt, qId, tId, __VA_ARGS__)
|
||||||
|
#define QW_TASK_DLOG(param, ...) qDebug("QW:%p QID:%"PRIx64",TID:%"PRIx64" " param, mgmt, qId, tId, __VA_ARGS__)
|
||||||
|
|
||||||
|
#define QW_SCH_TASK_ELOG(param, ...) qError("QW:%p SID:%"PRIx64",QID:%"PRIx64",TID:%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__)
|
||||||
|
#define QW_SCH_TASK_WLOG(param, ...) qWarn("QW:%p SID:%"PRIx64",QID:%"PRIx64",TID:%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__)
|
||||||
|
#define QW_SCH_TASK_DLOG(param, ...) qDebug("QW:%p SID:%"PRIx64",QID:%"PRIx64",TID:%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__)
|
||||||
|
|
||||||
|
|
||||||
|
#define TD_RWLATCH_WRITE_FLAG_COPY 0x40000000
|
||||||
|
|
||||||
#define QW_LOCK(type, _lock) do { \
|
#define QW_LOCK(type, _lock) do { \
|
||||||
if (QW_READ == (type)) { \
|
if (QW_READ == (type)) { \
|
||||||
if ((*(_lock)) < 0) assert(0); \
|
assert(atomic_load_32((_lock)) >= 0); \
|
||||||
taosRLockLatch(_lock); \
|
qDebug("QW RLOCK%p:%d, %s:%d B", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \
|
||||||
qDebug("QW RLOCK%p, %s:%d", (_lock), __FILE__, __LINE__); \
|
taosRLockLatch(_lock); \
|
||||||
|
qDebug("QW RLOCK%p:%d, %s:%d E", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \
|
||||||
|
assert(atomic_load_32((_lock)) > 0); \
|
||||||
} else { \
|
} else { \
|
||||||
if ((*(_lock)) < 0) assert(0); \
|
assert(atomic_load_32((_lock)) >= 0); \
|
||||||
|
qDebug("QW WLOCK%p:%d, %s:%d B", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \
|
||||||
taosWLockLatch(_lock); \
|
taosWLockLatch(_lock); \
|
||||||
qDebug("QW WLOCK%p, %s:%d", (_lock), __FILE__, __LINE__); \
|
qDebug("QW WLOCK%p:%d, %s:%d E", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \
|
||||||
|
assert(atomic_load_32((_lock)) == TD_RWLATCH_WRITE_FLAG_COPY); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define QW_UNLOCK(type, _lock) do { \
|
#define QW_UNLOCK(type, _lock) do { \
|
||||||
if (QW_READ == (type)) { \
|
if (QW_READ == (type)) { \
|
||||||
if ((*(_lock)) <= 0) assert(0); \
|
assert(atomic_load_32((_lock)) > 0); \
|
||||||
|
qDebug("QW RULOCK%p:%d, %s:%d B", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \
|
||||||
taosRUnLockLatch(_lock); \
|
taosRUnLockLatch(_lock); \
|
||||||
qDebug("QW RULOCK%p, %s:%d", (_lock), __FILE__, __LINE__); \
|
qDebug("QW RULOCK%p:%d, %s:%d E", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \
|
||||||
|
assert(atomic_load_32((_lock)) >= 0); \
|
||||||
} else { \
|
} else { \
|
||||||
if ((*(_lock)) <= 0) assert(0); \
|
assert(atomic_load_32((_lock)) == TD_RWLATCH_WRITE_FLAG_COPY); \
|
||||||
|
qDebug("QW WULOCK%p:%d, %s:%d B", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \
|
||||||
taosWUnLockLatch(_lock); \
|
taosWUnLockLatch(_lock); \
|
||||||
qDebug("QW WULOCK%p, %s:%d", (_lock), __FILE__, __LINE__); \
|
qDebug("QW WULOCK%p:%d, %s:%d E", (_lock), atomic_load_32(_lock), __FILE__, __LINE__); \
|
||||||
|
assert(atomic_load_32((_lock)) >= 0); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
static int32_t qwAcquireScheduler(int32_t rwType, SQWorkerMgmt *mgmt, uint64_t sId, SQWSchStatus **sch, int32_t nOpt);
|
|
||||||
|
|
||||||
|
int32_t qwAcquireScheduler(int32_t rwType, SQWorkerMgmt *mgmt, uint64_t sId, SQWSchStatus **sch);
|
||||||
|
int32_t qwAcquireAddScheduler(int32_t rwType, SQWorkerMgmt *mgmt, uint64_t sId, SQWSchStatus **sch);
|
||||||
|
int32_t qwAcquireTask(SQWorkerMgmt *mgmt, int32_t rwType, SQWSchStatus *sch, uint64_t qId, uint64_t tId, SQWTaskStatus **task);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -42,6 +42,11 @@ int32_t qwtStringToPlan(const char* str, SSubplan** subplan) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t qwtPutReqToQueue(void *node, struct SRpcMsg *pMsg) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void qwtRpcSendResponse(const SRpcMsg *pRsp) {
|
void qwtRpcSendResponse(const SRpcMsg *pRsp) {
|
||||||
if (TDMT_VND_TASKS_STATUS_RSP == pRsp->msgType) {
|
if (TDMT_VND_TASKS_STATUS_RSP == pRsp->msgType) {
|
||||||
SSchedulerStatusRsp *rsp = (SSchedulerStatusRsp *)pRsp->pCont;
|
SSchedulerStatusRsp *rsp = (SSchedulerStatusRsp *)pRsp->pCont;
|
||||||
|
@ -258,7 +263,7 @@ TEST(seqTest, normalCase) {
|
||||||
stubSetStringToPlan();
|
stubSetStringToPlan();
|
||||||
stubSetRpcSendResponse();
|
stubSetRpcSendResponse();
|
||||||
|
|
||||||
code = qWorkerInit(NULL, &mgmt);
|
code = qWorkerInit(NODE_TYPE_VNODE, 1, NULL, &mgmt, mockPointer, qwtPutReqToQueue);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
statusMsg.sId = htobe64(1);
|
statusMsg.sId = htobe64(1);
|
||||||
|
@ -328,7 +333,7 @@ TEST(seqTest, cancelFirst) {
|
||||||
stubSetStringToPlan();
|
stubSetStringToPlan();
|
||||||
stubSetRpcSendResponse();
|
stubSetRpcSendResponse();
|
||||||
|
|
||||||
code = qWorkerInit(NULL, &mgmt);
|
code = qWorkerInit(NODE_TYPE_VNODE, 1, NULL, &mgmt, mockPointer, qwtPutReqToQueue);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
statusMsg.sId = htobe64(1);
|
statusMsg.sId = htobe64(1);
|
||||||
|
@ -402,7 +407,7 @@ TEST(seqTest, randCase) {
|
||||||
|
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
|
|
||||||
code = qWorkerInit(NULL, &mgmt);
|
code = qWorkerInit(NODE_TYPE_VNODE, 1, NULL, &mgmt, mockPointer, qwtPutReqToQueue);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
int32_t t = 0;
|
int32_t t = 0;
|
||||||
|
@ -446,7 +451,7 @@ TEST(seqTest, multithreadRand) {
|
||||||
|
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
|
|
||||||
code = qWorkerInit(NULL, &mgmt);
|
code = qWorkerInit(NODE_TYPE_VNODE, 1, NULL, &mgmt, mockPointer, qwtPutReqToQueue);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
pthread_attr_t thattr;
|
pthread_attr_t thattr;
|
||||||
|
|
|
@ -36,11 +36,31 @@ enum {
|
||||||
SCH_WRITE,
|
SCH_WRITE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct SSchApiStat {
|
||||||
|
|
||||||
|
} SSchApiStat;
|
||||||
|
|
||||||
|
typedef struct SSchRuntimeStat {
|
||||||
|
|
||||||
|
} SSchRuntimeStat;
|
||||||
|
|
||||||
|
typedef struct SSchJobStat {
|
||||||
|
|
||||||
|
} SSchJobStat;
|
||||||
|
|
||||||
|
typedef struct SSchedulerStat {
|
||||||
|
SSchApiStat api;
|
||||||
|
SSchRuntimeStat runtime;
|
||||||
|
SSchJobStat job;
|
||||||
|
} SSchedulerStat;
|
||||||
|
|
||||||
|
|
||||||
typedef struct SSchedulerMgmt {
|
typedef struct SSchedulerMgmt {
|
||||||
uint64_t taskId; // sequential taksId
|
uint64_t taskId; // sequential taksId
|
||||||
uint64_t sId; // schedulerId
|
uint64_t sId; // schedulerId
|
||||||
SSchedulerCfg cfg;
|
SSchedulerCfg cfg;
|
||||||
SHashObj *jobs; // key: queryId, value: SQueryJob*
|
SHashObj *jobs; // key: queryId, value: SQueryJob*
|
||||||
|
SSchedulerStat stat;
|
||||||
} SSchedulerMgmt;
|
} SSchedulerMgmt;
|
||||||
|
|
||||||
typedef struct SSchCallbackParam {
|
typedef struct SSchCallbackParam {
|
||||||
|
|
|
@ -1460,35 +1460,38 @@ void scheduleFreeJob(void *job) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SSchJob *pJob = job;
|
SSchJob *pJob = job;
|
||||||
|
uint64_t queryId = pJob->queryId;
|
||||||
|
|
||||||
if (0 != taosHashRemove(schMgmt.jobs, &pJob->queryId, sizeof(pJob->queryId))) {
|
if (SCH_GET_JOB_STATUS(pJob) > 0) {
|
||||||
SCH_JOB_ELOG("taosHashRemove job from list failed, may already freed, pJob:%p", pJob);
|
if (0 != taosHashRemove(schMgmt.jobs, &pJob->queryId, sizeof(pJob->queryId))) {
|
||||||
return;
|
SCH_JOB_ELOG("taosHashRemove job from list failed, may already freed, pJob:%p", pJob);
|
||||||
}
|
return;
|
||||||
|
|
||||||
schCheckAndUpdateJobStatus(pJob, JOB_TASK_STATUS_DROPPING);
|
|
||||||
|
|
||||||
SCH_JOB_DLOG("job removed from list, no further ref, ref:%d", atomic_load_32(&pJob->ref));
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
int32_t ref = atomic_load_32(&pJob->ref);
|
|
||||||
if (0 == ref) {
|
|
||||||
break;
|
|
||||||
} else if (ref > 0) {
|
|
||||||
usleep(1);
|
|
||||||
} else {
|
|
||||||
assert(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
schCheckAndUpdateJobStatus(pJob, JOB_TASK_STATUS_DROPPING);
|
||||||
|
|
||||||
|
SCH_JOB_DLOG("job removed from list, no further ref, ref:%d", atomic_load_32(&pJob->ref));
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
int32_t ref = atomic_load_32(&pJob->ref);
|
||||||
|
if (0 == ref) {
|
||||||
|
break;
|
||||||
|
} else if (ref > 0) {
|
||||||
|
usleep(1);
|
||||||
|
} else {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SCH_JOB_DLOG("job no ref now, status:%d", SCH_GET_JOB_STATUS(pJob));
|
||||||
|
|
||||||
|
if (pJob->status == JOB_TASK_STATUS_EXECUTING) {
|
||||||
|
schCancelJob(pJob);
|
||||||
|
}
|
||||||
|
|
||||||
|
schDropJobAllTasks(pJob);
|
||||||
}
|
}
|
||||||
|
|
||||||
SCH_JOB_DLOG("job no ref now, status:%d", SCH_GET_JOB_STATUS(pJob));
|
|
||||||
|
|
||||||
if (pJob->status == JOB_TASK_STATUS_EXECUTING) {
|
|
||||||
schCancelJob(pJob);
|
|
||||||
}
|
|
||||||
|
|
||||||
schDropJobAllTasks(pJob);
|
|
||||||
|
|
||||||
pJob->subPlans = NULL; // it is a reference to pDag->pSubplans
|
pJob->subPlans = NULL; // it is a reference to pDag->pSubplans
|
||||||
|
|
||||||
int32_t numOfLevels = taosArrayGetSize(pJob->levels);
|
int32_t numOfLevels = taosArrayGetSize(pJob->levels);
|
||||||
|
@ -1513,6 +1516,8 @@ void scheduleFreeJob(void *job) {
|
||||||
tfree(pJob->res);
|
tfree(pJob->res);
|
||||||
|
|
||||||
tfree(pJob);
|
tfree(pJob);
|
||||||
|
|
||||||
|
qDebug("QID:%"PRIx64" job freed", queryId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void schedulerDestroy(void) {
|
void schedulerDestroy(void) {
|
||||||
|
|
|
@ -79,6 +79,7 @@ void schtBuildQueryDag(SQueryDag *dag) {
|
||||||
scanPlan->level = 1;
|
scanPlan->level = 1;
|
||||||
scanPlan->pParents = taosArrayInit(1, POINTER_BYTES);
|
scanPlan->pParents = taosArrayInit(1, POINTER_BYTES);
|
||||||
scanPlan->pNode = (SPhyNode*)calloc(1, sizeof(SPhyNode));
|
scanPlan->pNode = (SPhyNode*)calloc(1, sizeof(SPhyNode));
|
||||||
|
scanPlan->msgType = TDMT_VND_QUERY;
|
||||||
|
|
||||||
mergePlan->id.queryId = qId;
|
mergePlan->id.queryId = qId;
|
||||||
mergePlan->id.templateId = 0x4444444444;
|
mergePlan->id.templateId = 0x4444444444;
|
||||||
|
@ -89,6 +90,7 @@ void schtBuildQueryDag(SQueryDag *dag) {
|
||||||
mergePlan->pChildren = taosArrayInit(1, POINTER_BYTES);
|
mergePlan->pChildren = taosArrayInit(1, POINTER_BYTES);
|
||||||
mergePlan->pParents = NULL;
|
mergePlan->pParents = NULL;
|
||||||
mergePlan->pNode = (SPhyNode*)calloc(1, sizeof(SPhyNode));
|
mergePlan->pNode = (SPhyNode*)calloc(1, sizeof(SPhyNode));
|
||||||
|
mergePlan->msgType = TDMT_VND_QUERY;
|
||||||
|
|
||||||
SSubplan *mergePointer = (SSubplan *)taosArrayPush(merge, &mergePlan);
|
SSubplan *mergePointer = (SSubplan *)taosArrayPush(merge, &mergePlan);
|
||||||
SSubplan *scanPointer = (SSubplan *)taosArrayPush(scan, &scanPlan);
|
SSubplan *scanPointer = (SSubplan *)taosArrayPush(scan, &scanPlan);
|
||||||
|
@ -163,6 +165,11 @@ void schtExecNode(SSubplan* subplan, uint64_t templateId, SQueryNodeAddr* ep) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void schtRpcSendRequest(void *shandle, const SEpSet *pEpSet, SRpcMsg *pMsg, int64_t *pRid) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void schtSetPlanToString() {
|
void schtSetPlanToString() {
|
||||||
static Stub stub;
|
static Stub stub;
|
||||||
|
@ -190,6 +197,20 @@ void schtSetExecNode() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void schtSetRpcSendRequest() {
|
||||||
|
static Stub stub;
|
||||||
|
stub.set(rpcSendRequest, schtRpcSendRequest);
|
||||||
|
{
|
||||||
|
AddrAny any("libtransport.so");
|
||||||
|
std::map<std::string,void*> result;
|
||||||
|
any.get_global_func_addr_dynsym("^rpcSendRequest$", result);
|
||||||
|
for (const auto& f : result) {
|
||||||
|
stub.set(f.second, schtRpcSendRequest);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void *schtSendRsp(void *param) {
|
void *schtSendRsp(void *param) {
|
||||||
SSchJob *job = NULL;
|
SSchJob *job = NULL;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
Loading…
Reference in New Issue