Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
9db65e7a
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1193
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
9db65e7a
编写于
1月 26, 2022
作者:
L
Liu Jicong
浏览文件
操作
浏览文件
下载
差异文件
merge from 3.0
上级
c6230453
cd1e59a9
变更
51
隐藏空白更改
内联
并排
Showing
51 changed file
with
1002 addition
and
1230 deletion
+1002
-1230
2.0/src/query/src/queryMain.c
2.0/src/query/src/queryMain.c
+2
-2
include/libs/executor/executor.h
include/libs/executor/executor.h
+4
-1
include/libs/qworker/qworker.h
include/libs/qworker/qworker.h
+5
-2
include/os/os.h
include/os/os.h
+1
-0
include/os/osDef.h
include/os/osDef.h
+2
-1
include/util/tqueue.h
include/util/tqueue.h
+10
-6
include/util/tworker.h
include/util/tworker.h
+34
-30
source/client/test/clientTests.cpp
source/client/test/clientTests.cpp
+2
-0
source/dnode/mgmt/impl/inc/dndEnv.h
source/dnode/mgmt/impl/inc/dndEnv.h
+6
-6
source/dnode/mgmt/impl/src/dndEnv.c
source/dnode/mgmt/impl/src/dndEnv.c
+1
-0
source/dnode/mgmt/impl/src/dndMgmt.c
source/dnode/mgmt/impl/src/dndMgmt.c
+3
-1
source/dnode/mgmt/impl/src/dndTransport.c
source/dnode/mgmt/impl/src/dndTransport.c
+24
-23
source/dnode/mgmt/impl/src/dndVnodes.c
source/dnode/mgmt/impl/src/dndVnodes.c
+36
-42
source/dnode/mgmt/impl/src/dndWorker.c
source/dnode/mgmt/impl/src/dndWorker.c
+10
-10
source/dnode/mnode/impl/src/mndTrans.c
source/dnode/mnode/impl/src/mndTrans.c
+3
-1
source/dnode/mnode/sdb/src/sdb.c
source/dnode/mnode/sdb/src/sdb.c
+1
-5
source/dnode/mnode/sdb/src/sdbFile.c
source/dnode/mnode/sdb/src/sdbFile.c
+12
-3
source/dnode/vnode/inc/tq.h
source/dnode/vnode/inc/tq.h
+2
-2
source/dnode/vnode/inc/tsdb.h
source/dnode/vnode/inc/tsdb.h
+2
-4
source/dnode/vnode/inc/vnode.h
source/dnode/vnode/inc/vnode.h
+4
-4
source/dnode/vnode/src/inc/vnd.h
source/dnode/vnode/src/inc/vnd.h
+2
-0
source/dnode/vnode/src/tq/tq.c
source/dnode/vnode/src/tq/tq.c
+3
-3
source/dnode/vnode/src/tsdb/tsdbRead.c
source/dnode/vnode/src/tsdb/tsdbRead.c
+105
-157
source/dnode/vnode/src/vnd/vnodeMgr.c
source/dnode/vnode/src/vnd/vnodeMgr.c
+7
-0
source/dnode/vnode/src/vnd/vnodeQuery.c
source/dnode/vnode/src/vnd/vnodeQuery.c
+26
-17
source/dnode/vnode/src/vnd/vnodeWrite.c
source/dnode/vnode/src/vnd/vnodeWrite.c
+1
-1
source/libs/executor/inc/executil.h
source/libs/executor/inc/executil.h
+1
-1
source/libs/executor/inc/executorimpl.h
source/libs/executor/inc/executorimpl.h
+10
-14
source/libs/executor/src/dataDispatcher.c
source/libs/executor/src/dataDispatcher.c
+9
-1
source/libs/executor/src/executor.c
source/libs/executor/src/executor.c
+7
-7
source/libs/executor/src/executorMain.c
source/libs/executor/src/executorMain.c
+30
-210
source/libs/executor/src/executorimpl.c
source/libs/executor/src/executorimpl.c
+78
-387
source/libs/executor/test/executorTests.cpp
source/libs/executor/test/executorTests.cpp
+1
-1
source/libs/planner/src/logicPlan.c
source/libs/planner/src/logicPlan.c
+0
-1
source/libs/planner/src/physicalPlanJson.c
source/libs/planner/src/physicalPlanJson.c
+2
-2
source/libs/qworker/inc/qworkerInt.h
source/libs/qworker/inc/qworkerInt.h
+9
-8
source/libs/qworker/inc/qworkerMsg.h
source/libs/qworker/inc/qworkerMsg.h
+1
-1
source/libs/qworker/src/qworker.c
source/libs/qworker/src/qworker.c
+27
-23
source/libs/qworker/src/qworkerMsg.c
source/libs/qworker/src/qworkerMsg.c
+9
-4
source/libs/qworker/test/qworkerTests.cpp
source/libs/qworker/test/qworkerTests.cpp
+3
-3
source/libs/transport/inc/transComm.h
source/libs/transport/inc/transComm.h
+9
-1
source/libs/transport/src/rpcMain.c
source/libs/transport/src/rpcMain.c
+14
-6
source/libs/transport/src/trans.c
source/libs/transport/src/trans.c
+9
-2
source/libs/transport/src/transCli.c
source/libs/transport/src/transCli.c
+66
-56
source/libs/transport/src/transComm.c
source/libs/transport/src/transComm.c
+54
-0
source/libs/transport/src/transSrv.c
source/libs/transport/src/transSrv.c
+121
-93
source/libs/transport/test/rclient.c
source/libs/transport/test/rclient.c
+1
-0
source/util/src/tqueue.c
source/util/src/tqueue.c
+107
-34
source/util/src/tworker.c
source/util/src/tworker.c
+117
-45
tests/script/tsim/dnode/basic1.sim
tests/script/tsim/dnode/basic1.sim
+3
-3
tests/script/tsim/table/basic1.sim
tests/script/tsim/table/basic1.sim
+6
-6
未找到文件。
2.0/src/query/src/queryMain.c
浏览文件 @
9db65e7a
...
@@ -461,7 +461,7 @@ int32_t qKillQuery(qinfo_t qinfo) {
...
@@ -461,7 +461,7 @@ int32_t qKillQuery(qinfo_t qinfo) {
}
}
qDebug
(
"QInfo:0x%"
PRIx64
" query killed"
,
pQInfo
->
qId
);
qDebug
(
"QInfo:0x%"
PRIx64
" query killed"
,
pQInfo
->
qId
);
set
Query
Killed
(
pQInfo
);
set
Task
Killed
(
pQInfo
);
// Wait for the query executing thread being stopped/
// Wait for the query executing thread being stopped/
// Once the query is stopped, the owner of qHandle will be cleared immediately.
// Once the query is stopped, the owner of qHandle will be cleared immediately.
...
@@ -634,7 +634,7 @@ int32_t qKillQueryByQId(void* pMgmt, int64_t qId, int32_t waitMs, int32_t waitCo
...
@@ -634,7 +634,7 @@ int32_t qKillQueryByQId(void* pMgmt, int64_t qId, int32_t waitMs, int32_t waitCo
return
TSDB_CODE_QRY_INVALID_QHANDLE
;
return
TSDB_CODE_QRY_INVALID_QHANDLE
;
}
}
qWarn
(
"QId:0x%"
PRIx64
" be killed(no memory commit)."
,
pQInfo
->
qId
);
qWarn
(
"QId:0x%"
PRIx64
" be killed(no memory commit)."
,
pQInfo
->
qId
);
set
Query
Killed
(
pQInfo
);
set
Task
Killed
(
pQInfo
);
// wait query stop
// wait query stop
int32_t
loop
=
0
;
int32_t
loop
=
0
;
...
...
include/libs/executor/executor.h
浏览文件 @
9db65e7a
...
@@ -24,6 +24,7 @@ extern "C" {
...
@@ -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
;
/**
/**
...
@@ -45,7 +46,7 @@ int32_t qSetStreamInput(qTaskInfo_t tinfo, void* input);
...
@@ -45,7 +46,7 @@ int32_t qSetStreamInput(qTaskInfo_t tinfo, void* input);
* @param qId
* @param qId
* @return
* @return
*/
*/
int32_t
qCreateExecTask
(
void
*
readHandle
,
int32_t
vgId
,
struct
SSubplan
*
pPlan
,
qTaskInfo_t
*
pTaskInfo
,
DataSinkHandle
*
handle
);
int32_t
qCreateExecTask
(
void
*
readHandle
,
int32_t
vgId
,
uint64_t
taskId
,
struct
SSubplan
*
pPlan
,
qTaskInfo_t
*
pTaskInfo
,
DataSinkHandle
*
handle
);
/**
/**
* The main task execution function, including query on both table and multiple tables,
* The main task execution function, including query on both table and multiple tables,
...
@@ -208,6 +209,8 @@ void** qReleaseTask(void* pMgmt, void* pQInfo, bool freeHandle);
...
@@ -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
...
...
include/libs/qworker/qworker.h
浏览文件 @
9db65e7a
...
@@ -49,9 +49,10 @@ typedef struct {
...
@@ -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);
...
@@ -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
);
...
...
include/os/os.h
浏览文件 @
9db65e7a
...
@@ -51,6 +51,7 @@ extern "C" {
...
@@ -51,6 +51,7 @@ extern "C" {
#include <libgen.h>
#include <libgen.h>
#include <sys/mman.h>
#include <sys/mman.h>
#include <sys/prctl.h>
#include "osAtomic.h"
#include "osAtomic.h"
#include "osDef.h"
#include "osDef.h"
...
...
include/os/osDef.h
浏览文件 @
9db65e7a
...
@@ -181,7 +181,8 @@ extern "C" {
...
@@ -181,7 +181,8 @@ extern "C" {
#endif
#endif
#else
#else
// Windows
// Windows
#define setThreadName(name)
// #define setThreadName(name)
#define setThreadName(name) do { prctl(PR_SET_NAME, (name)); } while (0)
#endif
#endif
#if defined(_WIN32)
#if defined(_WIN32)
...
...
include/util/tqueue.h
浏览文件 @
9db65e7a
...
@@ -15,6 +15,7 @@
...
@@ -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,13 +41,13 @@ shall be used to set up the protection.
...
@@ -40,13 +41,13 @@ 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
(
*
F
Process
Item
)(
void
*
ahandle
,
void
*
pItem
);
typedef
void
(
*
FItem
)(
void
*
ahandle
,
void
*
pItem
);
typedef
void
(
*
F
Process
Items
)(
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
,
F
ProcessItem
itemFp
,
FProcess
Items
itemsFp
);
void
taosSetQueueFp
(
STaosQueue
*
queue
,
F
Item
itemFp
,
F
Items
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
);
int32_t
taosReadQitem
(
STaosQueue
*
queue
,
void
**
ppItem
);
int32_t
taosReadQitem
(
STaosQueue
*
queue
,
void
**
ppItem
);
...
@@ -66,8 +67,11 @@ int32_t taosAddIntoQset(STaosQset *qset, STaosQueue *queue, void *ahandle);
...
@@ -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
);
...
...
include/util/tworker.h
浏览文件 @
9db65e7a
...
@@ -15,57 +15,61 @@
...
@@ -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
S
WorkerPool
S
WorkerPool
;
typedef
struct
S
QWorkerPool
SQ
WorkerPool
;
typedef
struct
S
MWorkerPool
SM
WorkerPool
;
typedef
struct
S
WWorkerPool
SW
WorkerPool
;
typedef
struct
SWorker
{
typedef
struct
S
Q
Worker
{
int32_t
id
;
// worker ID
int32_t
id
;
// worker ID
pthread_t
thread
;
// thread
pthread_t
thread
;
// thread
SWorkerPool
*
pool
;
S
Q
WorkerPool
*
pool
;
}
SWorker
;
}
S
QWorker
,
SF
Worker
;
typedef
struct
SWorkerPool
{
typedef
struct
S
Q
WorkerPool
{
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
;
S
Worker
*
workers
;
S
QWorker
*
workers
;
pthread_mutex_t
mutex
;
pthread_mutex_t
mutex
;
}
SWorkerPool
;
}
S
QWorkerPool
,
SF
WorkerPool
;
typedef
struct
S
M
Worker
{
typedef
struct
S
W
Worker
{
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
S
M
WorkerPool
*
pool
;
S
W
WorkerPool
*
pool
;
}
S
M
Worker
;
}
S
W
Worker
;
typedef
struct
S
M
WorkerPool
{
typedef
struct
S
W
WorkerPool
{
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
;
S
MWorker
*
workers
;
S
WWorker
*
workers
;
pthread_mutex_t
mutex
;
pthread_mutex_t
mutex
;
}
SMWorkerPool
;
}
SWWorkerPool
;
int32_t
tQWorkerInit
(
SQWorkerPool
*
pool
);
void
tQWorkerCleanup
(
SQWorkerPool
*
pool
);
STaosQueue
*
tQWorkerAllocQueue
(
SQWorkerPool
*
pool
,
void
*
ahandle
,
FItem
fp
);
void
tQWorkerFreeQueue
(
SQWorkerPool
*
pool
,
STaosQueue
*
queue
);
int32_t
t
WorkerInit
(
S
WorkerPool
*
pool
);
int32_t
t
FWorkerInit
(
SF
WorkerPool
*
pool
);
void
t
WorkerCleanup
(
S
WorkerPool
*
pool
);
void
t
FWorkerCleanup
(
SF
WorkerPool
*
pool
);
STaosQueue
*
t
WorkerAllocQueue
(
SWorkerPool
*
pool
,
void
*
ahandle
,
FProcess
Item
fp
);
STaosQueue
*
t
FWorkerAllocQueue
(
SFWorkerPool
*
pool
,
void
*
ahandle
,
F
Item
fp
);
void
t
WorkerFreeQueue
(
S
WorkerPool
*
pool
,
STaosQueue
*
queue
);
void
t
FWorkerFreeQueue
(
SF
WorkerPool
*
pool
,
STaosQueue
*
queue
);
int32_t
t
MWorkerInit
(
SM
WorkerPool
*
pool
);
int32_t
t
WWorkerInit
(
SW
WorkerPool
*
pool
);
void
t
MWorkerCleanup
(
SM
WorkerPool
*
pool
);
void
t
WWorkerCleanup
(
SW
WorkerPool
*
pool
);
STaosQueue
*
t
MWorkerAllocQueue
(
SMWorkerPool
*
pool
,
void
*
ahandle
,
FProcess
Items
fp
);
STaosQueue
*
t
WWorkerAllocQueue
(
SWWorkerPool
*
pool
,
void
*
ahandle
,
F
Items
fp
);
void
t
MWorkerFreeQueue
(
SM
WorkerPool
*
pool
,
STaosQueue
*
queue
);
void
t
WWorkerFreeQueue
(
SW
WorkerPool
*
pool
,
STaosQueue
*
queue
);
#ifdef __cplusplus
#ifdef __cplusplus
}
}
...
...
source/client/test/clientTests.cpp
浏览文件 @
9db65e7a
...
@@ -570,6 +570,7 @@ TEST(testCase, create_topic_Test) {
...
@@ -570,6 +570,7 @@ TEST(testCase, create_topic_Test) {
//taos_close(pConn);
//taos_close(pConn);
//}
//}
#if 0
TEST(testCase, tmq_subscribe_Test) {
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);
...
@@ -594,6 +595,7 @@ TEST(testCase, tmq_subscribe_Test) {
...
@@ -594,6 +595,7 @@ TEST(testCase, tmq_subscribe_Test) {
//if (msg == NULL) break;
//if (msg == NULL) break;
}
}
}
}
#endif
TEST
(
testCase
,
tmq_consume_Test
)
{
TEST
(
testCase
,
tmq_consume_Test
)
{
}
}
...
...
source/dnode/mgmt/impl/inc/dndEnv.h
浏览文件 @
9db65e7a
...
@@ -31,8 +31,8 @@ typedef struct {
...
@@ -31,8 +31,8 @@ typedef struct {
SDnode
*
pDnode
;
SDnode
*
pDnode
;
STaosQueue
*
queue
;
STaosQueue
*
queue
;
union
{
union
{
SWorkerPool
pool
;
S
Q
WorkerPool
pool
;
S
M
WorkerPool
mpool
;
S
W
WorkerPool
mpool
;
};
};
}
SDnodeWorker
;
}
SDnodeWorker
;
...
@@ -109,10 +109,10 @@ typedef struct {
...
@@ -109,10 +109,10 @@ typedef struct {
int32_t
openVnodes
;
int32_t
openVnodes
;
int32_t
totalVnodes
;
int32_t
totalVnodes
;
SRWLatch
latch
;
SRWLatch
latch
;
S
WorkerPool
queryPool
;
S
QWorkerPool
queryPool
;
S
WorkerPool
fetchPool
;
S
FWorkerPool
fetchPool
;
S
M
WorkerPool
syncPool
;
S
W
WorkerPool
syncPool
;
S
M
WorkerPool
writePool
;
S
W
WorkerPool
writePool
;
}
SVnodesMgmt
;
}
SVnodesMgmt
;
typedef
struct
{
typedef
struct
{
...
...
source/dnode/mgmt/impl/src/dndEnv.c
浏览文件 @
9db65e7a
...
@@ -289,6 +289,7 @@ int32_t dndInit(const SDnodeEnvCfg *pCfg) {
...
@@ -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
)
{
...
...
source/dnode/mgmt/impl/src/dndMgmt.c
浏览文件 @
9db65e7a
...
@@ -487,6 +487,8 @@ static void *dnodeThreadRoutine(void *param) {
...
@@ -487,6 +487,8 @@ static void *dnodeThreadRoutine(void *param) {
SDnodeMgmt
*
pMgmt
=
&
pDnode
->
dmgmt
;
SDnodeMgmt
*
pMgmt
=
&
pDnode
->
dmgmt
;
int32_t
ms
=
pDnode
->
cfg
.
statusInterval
*
1000
;
int32_t
ms
=
pDnode
->
cfg
.
statusInterval
*
1000
;
setThreadName
(
"dnode-hb"
);
while
(
true
)
{
while
(
true
)
{
pthread_testcancel
();
pthread_testcancel
();
taosMsleep
(
ms
);
taosMsleep
(
ms
);
...
@@ -527,7 +529,7 @@ int32_t dndInitMgmt(SDnode *pDnode) {
...
@@ -527,7 +529,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
;
}
}
...
...
source/dnode/mgmt/impl/src/dndTransport.c
浏览文件 @
9db65e7a
...
@@ -25,9 +25,9 @@
...
@@ -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
...
@@ -120,8 +120,9 @@ static void dndInitMsgFp(STransMgmt *pMgmt) {
...
@@ -120,8 +120,9 @@ static void dndInitMsgFp(STransMgmt *pMgmt) {
// 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
;
...
@@ -159,17 +160,18 @@ static void dndProcessResponse(void *parent, SRpcMsg *pRsp, SEpSet *pEpSet) {
...
@@ -159,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 i
s ignored since dnode is stopping"
,
pRsp
->
handle
,
TMSG_INFO
(
msgType
)
);
dTrace
(
"RPC %p, rsp:%s i
gnored 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
);
}
}
}
}
...
@@ -196,7 +198,7 @@ static int32_t dndInitClient(SDnode *pDnode) {
...
@@ -196,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
;
}
}
...
@@ -219,40 +221,39 @@ static void dndProcessRequest(void *param, SRpcMsg *pReq, SEpSet *pEpSet) {
...
@@ -219,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
->
cod
e
);
dTrace
(
"RPC %p, network test req
will be processed, app:%p"
,
pReq
->
handle
,
pReq
->
ahandl
e
);
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
);
}
}
...
@@ -292,24 +293,24 @@ static int32_t dndRetrieveUserAuthInfo(void *parent, char *user, char *spi, char
...
@@ -292,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
);
...
@@ -353,7 +354,7 @@ static int32_t dndInitServer(SDnode *pDnode) {
...
@@ -353,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
;
}
}
...
...
source/dnode/mgmt/impl/src/dndVnodes.c
浏览文件 @
9db65e7a
...
@@ -253,7 +253,7 @@ static int32_t dndGetVnodesFromFile(SDnode *pDnode, SWrapperCfg **ppCfgs, int32_
...
@@ -253,7 +253,7 @@ static int32_t dndGetVnodesFromFile(SDnode *pDnode, SWrapperCfg **ppCfgs, int32_
}
}
for
(
int32_t
i
=
0
;
i
<
vnodesNum
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
vnodesNum
;
++
i
)
{
cJSON
*
vnode
=
cJSON_GetArrayItem
(
vnodes
,
i
);
cJSON
*
vnode
=
cJSON_GetArrayItem
(
vnodes
,
i
);
SWrapperCfg
*
pCfg
=
&
pCfgs
[
i
];
SWrapperCfg
*
pCfg
=
&
pCfgs
[
i
];
cJSON
*
vgId
=
cJSON_GetObjectItem
(
vnode
,
"vgId"
);
cJSON
*
vgId
=
cJSON_GetObjectItem
(
vnode
,
"vgId"
);
...
@@ -382,7 +382,7 @@ static void *dnodeOpenVnodeFunc(void *param) {
...
@@ -382,7 +382,7 @@ static void *dnodeOpenVnodeFunc(void *param) {
dndReportStartup
(
pDnode
,
"open-vnodes"
,
stepDesc
);
dndReportStartup
(
pDnode
,
"open-vnodes"
,
stepDesc
);
SVnodeCfg
cfg
=
{.
pDnode
=
pDnode
,
.
pTfs
=
pDnode
->
pTfs
,
.
vgId
=
pCfg
->
vgId
};
SVnodeCfg
cfg
=
{.
pDnode
=
pDnode
,
.
pTfs
=
pDnode
->
pTfs
,
.
vgId
=
pCfg
->
vgId
};
SVnode
*
pImpl
=
vnodeOpen
(
pCfg
->
path
,
&
cfg
);
SVnode
*
pImpl
=
vnodeOpen
(
pCfg
->
path
,
&
cfg
);
if
(
pImpl
==
NULL
)
{
if
(
pImpl
==
NULL
)
{
dError
(
"vgId:%d, failed to open vnode by thread:%d"
,
pCfg
->
vgId
,
pThread
->
threadIndex
);
dError
(
"vgId:%d, failed to open vnode by thread:%d"
,
pCfg
->
vgId
,
pThread
->
threadIndex
);
pThread
->
failed
++
;
pThread
->
failed
++
;
...
@@ -737,15 +737,9 @@ int32_t dndProcessCompactVnodeReq(SDnode *pDnode, SRpcMsg *pReq) {
...
@@ -737,15 +737,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 +910,27 @@ static int32_t dndInitVnodeWorkers(SDnode *pDnode) {
...
@@ -916,27 +910,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
);
S
WorkerPool
*
p
Pool
=
&
pMgmt
->
queryPool
;
S
QWorkerPool
*
pQ
Pool
=
&
pMgmt
->
queryPool
;
pPool
->
name
=
"vnode-query"
;
p
Q
Pool
->
name
=
"vnode-query"
;
pPool
->
min
=
minQueryThreads
;
p
Q
Pool
->
min
=
minQueryThreads
;
pPool
->
max
=
maxQueryThreads
;
p
Q
Pool
->
max
=
maxQueryThreads
;
if
(
t
WorkerInit
(
p
Pool
)
!=
0
)
return
-
1
;
if
(
t
QWorkerInit
(
pQ
Pool
)
!=
0
)
return
-
1
;
p
Pool
=
&
pMgmt
->
fetchPool
;
SFWorkerPool
*
pF
Pool
=
&
pMgmt
->
fetchPool
;
pPool
->
name
=
"vnode-fetch"
;
p
F
Pool
->
name
=
"vnode-fetch"
;
pPool
->
min
=
minFetchThreads
;
p
F
Pool
->
min
=
minFetchThreads
;
pPool
->
max
=
maxFetchThreads
;
p
F
Pool
->
max
=
maxFetchThreads
;
if
(
t
WorkerInit
(
p
Pool
)
!=
0
)
return
-
1
;
if
(
t
FWorkerInit
(
pF
Pool
)
!=
0
)
return
-
1
;
S
MWorkerPool
*
pM
Pool
=
&
pMgmt
->
writePool
;
S
WWorkerPool
*
pW
Pool
=
&
pMgmt
->
writePool
;
p
M
Pool
->
name
=
"vnode-write"
;
p
W
Pool
->
name
=
"vnode-write"
;
p
M
Pool
->
max
=
maxWriteThreads
;
p
W
Pool
->
max
=
maxWriteThreads
;
if
(
t
MWorkerInit
(
pM
Pool
)
!=
0
)
return
-
1
;
if
(
t
WWorkerInit
(
pW
Pool
)
!=
0
)
return
-
1
;
p
M
Pool
=
&
pMgmt
->
syncPool
;
p
W
Pool
=
&
pMgmt
->
syncPool
;
p
M
Pool
->
name
=
"vnode-sync"
;
p
W
Pool
->
name
=
"vnode-sync"
;
p
M
Pool
->
max
=
maxSyncThreads
;
p
W
Pool
->
max
=
maxSyncThreads
;
if
(
t
MWorkerInit
(
pM
Pool
)
!=
0
)
return
-
1
;
if
(
t
WWorkerInit
(
pW
Pool
)
!=
0
)
return
-
1
;
dDebug
(
"vnode workers is initialized"
);
dDebug
(
"vnode workers is initialized"
);
return
0
;
return
0
;
...
@@ -944,21 +938,21 @@ static int32_t dndInitVnodeWorkers(SDnode *pDnode) {
...
@@ -944,21 +938,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
);
t
F
WorkerCleanup
(
&
pMgmt
->
fetchPool
);
tWorkerCleanup
(
&
pMgmt
->
queryPool
);
t
Q
WorkerCleanup
(
&
pMgmt
->
queryPool
);
t
M
WorkerCleanup
(
&
pMgmt
->
writePool
);
t
W
WorkerCleanup
(
&
pMgmt
->
writePool
);
t
M
WorkerCleanup
(
&
pMgmt
->
syncPool
);
t
W
WorkerCleanup
(
&
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
=
t
MWorkerAllocQueue
(
&
pMgmt
->
writePool
,
pVnode
,
(
FProcess
Items
)
dndProcessVnodeWriteQueue
);
pVnode
->
pWriteQ
=
t
WWorkerAllocQueue
(
&
pMgmt
->
writePool
,
pVnode
,
(
F
Items
)
dndProcessVnodeWriteQueue
);
pVnode
->
pApplyQ
=
t
MWorkerAllocQueue
(
&
pMgmt
->
writePool
,
pVnode
,
(
FProcess
Items
)
dndProcessVnodeApplyQueue
);
pVnode
->
pApplyQ
=
t
WWorkerAllocQueue
(
&
pMgmt
->
writePool
,
pVnode
,
(
F
Items
)
dndProcessVnodeApplyQueue
);
pVnode
->
pSyncQ
=
t
MWorkerAllocQueue
(
&
pMgmt
->
syncPool
,
pVnode
,
(
FProcess
Items
)
dndProcessVnodeSyncQueue
);
pVnode
->
pSyncQ
=
t
WWorkerAllocQueue
(
&
pMgmt
->
syncPool
,
pVnode
,
(
F
Items
)
dndProcessVnodeSyncQueue
);
pVnode
->
pFetchQ
=
t
WorkerAllocQueue
(
&
pMgmt
->
fetchPool
,
pVnode
,
(
FProcess
Item
)
dndProcessVnodeFetchQueue
);
pVnode
->
pFetchQ
=
t
FWorkerAllocQueue
(
&
pMgmt
->
fetchPool
,
pVnode
,
(
F
Item
)
dndProcessVnodeFetchQueue
);
pVnode
->
pQueryQ
=
t
WorkerAllocQueue
(
&
pMgmt
->
queryPool
,
pVnode
,
(
FProcess
Item
)
dndProcessVnodeQueryQueue
);
pVnode
->
pQueryQ
=
t
QWorkerAllocQueue
(
&
pMgmt
->
queryPool
,
pVnode
,
(
F
Item
)
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 +965,11 @@ static int32_t dndAllocVnodeQueue(SDnode *pDnode, SVnodeObj *pVnode) {
...
@@ -971,11 +965,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
);
t
Q
WorkerFreeQueue
(
&
pMgmt
->
queryPool
,
pVnode
->
pQueryQ
);
tWorkerFreeQueue
(
&
pMgmt
->
fetchPool
,
pVnode
->
pFetchQ
);
t
F
WorkerFreeQueue
(
&
pMgmt
->
fetchPool
,
pVnode
->
pFetchQ
);
t
M
WorkerFreeQueue
(
&
pMgmt
->
writePool
,
pVnode
->
pWriteQ
);
t
W
WorkerFreeQueue
(
&
pMgmt
->
writePool
,
pVnode
->
pWriteQ
);
t
M
WorkerFreeQueue
(
&
pMgmt
->
writePool
,
pVnode
->
pApplyQ
);
t
W
WorkerFreeQueue
(
&
pMgmt
->
writePool
,
pVnode
->
pApplyQ
);
t
M
WorkerFreeQueue
(
&
pMgmt
->
syncPool
,
pVnode
->
pSyncQ
);
t
W
WorkerFreeQueue
(
&
pMgmt
->
syncPool
,
pVnode
->
pSyncQ
);
pVnode
->
pWriteQ
=
NULL
;
pVnode
->
pWriteQ
=
NULL
;
pVnode
->
pApplyQ
=
NULL
;
pVnode
->
pApplyQ
=
NULL
;
pVnode
->
pSyncQ
=
NULL
;
pVnode
->
pSyncQ
=
NULL
;
...
...
source/dnode/mgmt/impl/src/dndWorker.c
浏览文件 @
9db65e7a
...
@@ -31,28 +31,28 @@ int32_t dndInitWorker(SDnode *pDnode, SDnodeWorker *pWorker, EWorkerType type, c
...
@@ -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
;
S
Q
WorkerPool
*
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
(
t
Q
WorkerInit
(
pPool
)
!=
0
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
-
1
;
return
-
1
;
}
}
pWorker
->
queue
=
t
WorkerAllocQueue
(
pPool
,
pDnode
,
(
FProcess
Item
)
queueFp
);
pWorker
->
queue
=
t
QWorkerAllocQueue
(
pPool
,
pDnode
,
(
F
Item
)
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
)
{
S
M
WorkerPool
*
pPool
=
&
pWorker
->
mpool
;
S
W
WorkerPool
*
pPool
=
&
pWorker
->
mpool
;
pPool
->
name
=
name
;
pPool
->
name
=
name
;
pPool
->
max
=
maxNum
;
pPool
->
max
=
maxNum
;
if
(
t
M
WorkerInit
(
pPool
)
!=
0
)
{
if
(
t
W
WorkerInit
(
pPool
)
!=
0
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
-
1
;
return
-
1
;
}
}
pWorker
->
queue
=
t
MWorkerAllocQueue
(
pPool
,
pDnode
,
(
FProcess
Items
)
queueFp
);
pWorker
->
queue
=
t
WWorkerAllocQueue
(
pPool
,
pDnode
,
(
F
Items
)
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) {
...
@@ -70,11 +70,11 @@ void dndCleanupWorker(SDnodeWorker *pWorker) {
}
}
if
(
pWorker
->
type
==
DND_WORKER_SINGLE
)
{
if
(
pWorker
->
type
==
DND_WORKER_SINGLE
)
{
tWorkerCleanup
(
&
pWorker
->
pool
);
t
Q
WorkerCleanup
(
&
pWorker
->
pool
);
tWorkerFreeQueue
(
&
pWorker
->
pool
,
pWorker
->
queue
);
t
Q
WorkerFreeQueue
(
&
pWorker
->
pool
,
pWorker
->
queue
);
}
else
if
(
pWorker
->
type
==
DND_WORKER_MULTI
)
{
}
else
if
(
pWorker
->
type
==
DND_WORKER_MULTI
)
{
t
M
WorkerCleanup
(
&
pWorker
->
mpool
);
t
W
WorkerCleanup
(
&
pWorker
->
mpool
);
t
M
WorkerFreeQueue
(
&
pWorker
->
mpool
,
pWorker
->
queue
);
t
W
WorkerFreeQueue
(
&
pWorker
->
mpool
,
pWorker
->
queue
);
}
else
{
}
else
{
}
}
}
}
...
...
source/dnode/mnode/impl/src/mndTrans.c
浏览文件 @
9db65e7a
...
@@ -921,7 +921,7 @@ static int32_t mndProcessTransMsg(SMnodeMsg *pMsg) {
...
@@ -921,7 +921,7 @@ static int32_t mndProcessTransMsg(SMnodeMsg *pMsg) {
void
mndTransPullup
(
SMnode
*
pMnode
)
{
void
mndTransPullup
(
SMnode
*
pMnode
)
{
STrans
*
pTrans
=
NULL
;
STrans
*
pTrans
=
NULL
;
void
*
pIter
=
NULL
;
void
*
pIter
=
NULL
;
while
(
1
)
{
while
(
1
)
{
pIter
=
sdbFetch
(
pMnode
->
pSdb
,
SDB_TRANS
,
pIter
,
(
void
**
)
&
pTrans
);
pIter
=
sdbFetch
(
pMnode
->
pSdb
,
SDB_TRANS
,
pIter
,
(
void
**
)
&
pTrans
);
...
@@ -930,4 +930,6 @@ void mndTransPullup(SMnode *pMnode) {
...
@@ -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
);
}
}
source/dnode/mnode/sdb/src/sdb.c
浏览文件 @
9db65e7a
...
@@ -64,11 +64,7 @@ SSdb *sdbInit(SSdbOpt *pOption) {
...
@@ -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
)
{
sdbWriteFile
(
pSdb
);
mDebug
(
"write sdb file for current ver:%"
PRId64
" larger than last commit ver:%"
PRId64
,
pSdb
->
curVer
,
pSdb
->
lastCommitVer
);
sdbWriteFile
(
pSdb
);
}
if
(
pSdb
->
currDir
!=
NULL
)
{
if
(
pSdb
->
currDir
!=
NULL
)
{
tfree
(
pSdb
->
currDir
);
tfree
(
pSdb
->
currDir
);
...
...
source/dnode/mnode/sdb/src/sdbFile.c
浏览文件 @
9db65e7a
...
@@ -221,7 +221,7 @@ PARSE_SDB_DATA_ERROR:
...
@@ -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) {
...
@@ -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) {
...
@@ -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
(
sdbWriteFile
Imp
(
pSdb
)
!=
0
)
{
return
-
1
;
return
-
1
;
}
}
...
...
source/dnode/vnode/inc/tq.h
浏览文件 @
9db65e7a
...
@@ -318,8 +318,8 @@ int tqRegisterContext(STqGroup*, void* ahandle);
...
@@ -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
}
}
...
...
source/dnode/vnode/inc/tsdb.h
浏览文件 @
9db65e7a
...
@@ -75,7 +75,6 @@ typedef struct STsdbQueryCond {
...
@@ -75,7 +75,6 @@ typedef struct STsdbQueryCond {
}
STsdbQueryCond
;
}
STsdbQueryCond
;
typedef
struct
{
typedef
struct
{
void
*
pTable
;
TSKEY
lastKey
;
TSKEY
lastKey
;
uint64_t
uid
;
uint64_t
uid
;
}
STableKeyInfo
;
}
STableKeyInfo
;
...
@@ -104,8 +103,7 @@ typedef void* tsdbReadHandleT;
...
@@ -104,8 +103,7 @@ typedef void* tsdbReadHandleT;
* @param qinfo query info handle from query processor
* @param qinfo query info handle from query processor
* @return
* @return
*/
*/
tsdbReadHandleT
*
tsdbQueryTables
(
STsdb
*
tsdb
,
STsdbQueryCond
*
pCond
,
STableGroupInfo
*
tableInfoGroup
,
uint64_t
qId
,
tsdbReadHandleT
*
tsdbQueryTables
(
STsdb
*
tsdb
,
STsdbQueryCond
*
pCond
,
STableGroupInfo
*
tableInfoGroup
,
uint64_t
qId
,
uint64_t
taskId
);
void
*
pRef
);
/**
/**
* Get the last row of the given query time window for all the tables in STableGroupInfo object.
* Get the last row of the given query time window for all the tables in STableGroupInfo object.
...
@@ -142,7 +140,7 @@ bool isTsdbCacheLastRow(tsdbReadHandleT* pTsdbReadHandle);
...
@@ -142,7 +140,7 @@ bool isTsdbCacheLastRow(tsdbReadHandleT* pTsdbReadHandle);
*/
*/
int32_t
tsdbQuerySTableByTagCond
(
STsdb
*
tsdb
,
uint64_t
uid
,
TSKEY
skey
,
const
char
*
pTagCond
,
size_t
len
,
int32_t
tsdbQuerySTableByTagCond
(
STsdb
*
tsdb
,
uint64_t
uid
,
TSKEY
skey
,
const
char
*
pTagCond
,
size_t
len
,
int16_t
tagNameRelType
,
const
char
*
tbnameCond
,
STableGroupInfo
*
pGroupInfo
,
int16_t
tagNameRelType
,
const
char
*
tbnameCond
,
STableGroupInfo
*
pGroupInfo
,
SColIndex
*
pColIndex
,
int32_t
numOfCols
,
uint64_t
reqId
);
SColIndex
*
pColIndex
,
int32_t
numOfCols
,
uint64_t
reqId
,
uint64_t
taskId
);
/**
/**
* get num of rows in mem table
* get num of rows in mem table
*
*
...
...
source/dnode/vnode/inc/vnode.h
浏览文件 @
9db65e7a
...
@@ -33,6 +33,7 @@ extern "C" {
...
@@ -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 {
...
@@ -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);
...
@@ -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
vnodeProcessQuery
Req
(
SVnode
*
pVnode
,
SRpcMsg
*
pMsg
,
SRpcMsg
**
pRsp
);
int
vnodeProcessQuery
Msg
(
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
vnodeProcessFetch
Req
(
SVnode
*
pVnode
,
SRpcMsg
*
pMsg
,
SRpcMsg
**
pRsp
);
int
vnodeProcessFetch
Msg
(
SVnode
*
pVnode
,
SRpcMsg
*
pMsg
);
/* ------------------------ SVnodeCfg ------------------------ */
/* ------------------------ SVnodeCfg ------------------------ */
/**
/**
...
...
source/dnode/vnode/src/inc/vnd.h
浏览文件 @
9db65e7a
...
@@ -55,6 +55,7 @@ typedef struct SVnodeMgr {
...
@@ -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 {
...
@@ -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
;
...
...
source/dnode/vnode/src/tq/tq.c
浏览文件 @
9db65e7a
...
@@ -667,8 +667,8 @@ int tqItemSSize() {
...
@@ -667,8 +667,8 @@ 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
;
int64_t
consumerId
=
pReq
->
consumerId
;
int64_t
consumerId
=
pReq
->
consumerId
;
...
@@ -767,7 +767,7 @@ int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg** ppRsp) {
...
@@ -767,7 +767,7 @@ int32_t tqProcessConsumeReq(STQ* pTq, SRpcMsg* pMsg, SRpcMsg** ppRsp) {
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
);
...
...
source/dnode/vnode/src/tsdb/tsdbRead.c
浏览文件 @
9db65e7a
...
@@ -81,7 +81,6 @@ enum {
...
@@ -81,7 +81,6 @@ enum {
CHECKINFO_CHOSEN_BOTH
=
2
//for update=2(merge case)
CHECKINFO_CHOSEN_BOTH
=
2
//for update=2(merge case)
};
};
typedef
struct
STableCheckInfo
{
typedef
struct
STableCheckInfo
{
uint64_t
tableId
;
uint64_t
tableId
;
TSKEY
lastKey
;
TSKEY
lastKey
;
...
@@ -132,7 +131,7 @@ typedef struct STsdbReadHandle {
...
@@ -132,7 +131,7 @@ typedef struct STsdbReadHandle {
bool
loadExternalRow
;
// load time window external data rows
bool
loadExternalRow
;
// load time window external data rows
bool
currentLoadExternalRows
;
// current load external rows
bool
currentLoadExternalRows
;
// current load external rows
int32_t
loadType
;
// block load type
int32_t
loadType
;
// block load type
uint64_t
qId
;
// query info handle, for debug purpose
char
*
idStr
;
// query info handle, for debug purpose
int32_t
type
;
// query type: retrieve all data blocks, 2. retrieve only last row, 3. retrieve direct prev|next rows
int32_t
type
;
// query type: retrieve all data blocks, 2. retrieve only last row, 3. retrieve direct prev|next rows
SDFileSet
*
pFileGroup
;
SDFileSet
*
pFileGroup
;
SFSIter
fileIter
;
SFSIter
fileIter
;
...
@@ -209,31 +208,6 @@ static SArray* getDefaultLoadColumns(STsdbReadHandle* pTsdbReadHandle, bool load
...
@@ -209,31 +208,6 @@ static SArray* getDefaultLoadColumns(STsdbReadHandle* pTsdbReadHandle, bool load
return
pLocalIdList
;
return
pLocalIdList
;
}
}
static
void
tsdbMayTakeMemSnapshot
(
STsdbReadHandle
*
pTsdbReadHandle
,
SArray
*
psTable
)
{
// assert(pTsdbReadHandle != NULL && pTsdbReadHandle->pMemRef != NULL);
//
// STsdbMemTable* pMemRef = pTsdbReadHandle->pMemRef;
// if (pTsdbReadHandle->pMemRef->ref++ == 0) {
// tsdbTakeMemSnapshot(pTsdbReadHandle->pTsdb, &(pMemRef->snapshot), psTable);
// }
//
// taosArrayDestroy(psTable);
}
static
void
tsdbMayUnTakeMemSnapshot
(
STsdbReadHandle
*
pTsdbReadHandle
)
{
// assert(pTsdbReadHandle != NULL);
// STsdbMemTable* pMemRef = pTsdbReadHandle->pMemRef;
// if (pMemRef == NULL) { // it has been freed
// return;
// }
//
// if (--pMemRef->ref == 0) {
// tsdbUnTakeMemSnapShot(pTsdbReadHandle->pTsdb, &(pMemRef->snapshot));
// }
//
// pTsdbReadHandle->pMemRef = NULL;
}
//int64_t tsdbGetNumOfRowsInMemTable(tsdbReadHandleT* pHandle) {
//int64_t tsdbGetNumOfRowsInMemTable(tsdbReadHandleT* pHandle) {
// STsdbReadHandle* pTsdbReadHandle = (STsdbReadHandle*) pHandle;
// STsdbReadHandle* pTsdbReadHandle = (STsdbReadHandle*) pHandle;
//
//
...
@@ -263,9 +237,9 @@ static void tsdbMayUnTakeMemSnapshot(STsdbReadHandle* pTsdbReadHandle) {
...
@@ -263,9 +237,9 @@ static void tsdbMayUnTakeMemSnapshot(STsdbReadHandle* pTsdbReadHandle) {
// return rows;
// return rows;
//}
//}
static
SArray
*
createCheckInfoFromTableGroup
(
STsdbReadHandle
*
pTsdbReadHandle
,
STableGroupInfo
*
pGroupList
,
SArray
**
psTable
)
{
static
SArray
*
createCheckInfoFromTableGroup
(
STsdbReadHandle
*
pTsdbReadHandle
,
STableGroupInfo
*
pGroupList
)
{
size_t
size
OfGroup
=
taosArrayGetSize
(
pGroupList
->
pGroupList
);
size_t
num
OfGroup
=
taosArrayGetSize
(
pGroupList
->
pGroupList
);
assert
(
size
OfGroup
>=
1
);
assert
(
num
OfGroup
>=
1
);
// allocate buffer in order to load data blocks from file
// allocate buffer in order to load data blocks from file
SArray
*
pTableCheckInfo
=
taosArrayInit
(
pGroupList
->
numOfTables
,
sizeof
(
STableCheckInfo
));
SArray
*
pTableCheckInfo
=
taosArrayInit
(
pGroupList
->
numOfTables
,
sizeof
(
STableCheckInfo
));
...
@@ -273,14 +247,8 @@ static SArray* createCheckInfoFromTableGroup(STsdbReadHandle* pTsdbReadHandle, S
...
@@ -273,14 +247,8 @@ static SArray* createCheckInfoFromTableGroup(STsdbReadHandle* pTsdbReadHandle, S
return
NULL
;
return
NULL
;
}
}
SArray
*
pTable
=
taosArrayInit
(
4
,
sizeof
(
STable
*
));
if
(
pTable
==
NULL
)
{
taosArrayDestroy
(
pTableCheckInfo
);
return
NULL
;
}
// todo apply the lastkey of table check to avoid to load header file
// todo apply the lastkey of table check to avoid to load header file
for
(
int32_t
i
=
0
;
i
<
size
OfGroup
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
num
OfGroup
;
++
i
)
{
SArray
*
group
=
*
(
SArray
**
)
taosArrayGet
(
pGroupList
->
pGroupList
,
i
);
SArray
*
group
=
*
(
SArray
**
)
taosArrayGet
(
pGroupList
->
pGroupList
,
i
);
size_t
gsize
=
taosArrayGetSize
(
group
);
size_t
gsize
=
taosArrayGetSize
(
group
);
...
@@ -289,12 +257,7 @@ static SArray* createCheckInfoFromTableGroup(STsdbReadHandle* pTsdbReadHandle, S
...
@@ -289,12 +257,7 @@ static SArray* createCheckInfoFromTableGroup(STsdbReadHandle* pTsdbReadHandle, S
for
(
int32_t
j
=
0
;
j
<
gsize
;
++
j
)
{
for
(
int32_t
j
=
0
;
j
<
gsize
;
++
j
)
{
STableKeyInfo
*
pKeyInfo
=
(
STableKeyInfo
*
)
taosArrayGet
(
group
,
j
);
STableKeyInfo
*
pKeyInfo
=
(
STableKeyInfo
*
)
taosArrayGet
(
group
,
j
);
STableCheckInfo
info
=
{
.
lastKey
=
pKeyInfo
->
lastKey
};
STableCheckInfo
info
=
{
.
lastKey
=
pKeyInfo
->
lastKey
,
.
tableId
=
pKeyInfo
->
uid
};
// assert(info.pTableObj != NULL && (info.pTableObj->type == TSDB_NORMAL_TABLE ||
// info.pTableObj->type == TSDB_CHILD_TABLE || info.pTableObj->type == TSDB_STREAM_TABLE));
info
.
tableId
=
pKeyInfo
->
uid
;
if
(
ASCENDING_TRAVERSE
(
pTsdbReadHandle
->
order
))
{
if
(
ASCENDING_TRAVERSE
(
pTsdbReadHandle
->
order
))
{
if
(
info
.
lastKey
==
INT64_MIN
||
info
.
lastKey
<
pTsdbReadHandle
->
window
.
skey
)
{
if
(
info
.
lastKey
==
INT64_MIN
||
info
.
lastKey
<
pTsdbReadHandle
->
window
.
skey
)
{
info
.
lastKey
=
pTsdbReadHandle
->
window
.
skey
;
info
.
lastKey
=
pTsdbReadHandle
->
window
.
skey
;
...
@@ -306,17 +269,12 @@ static SArray* createCheckInfoFromTableGroup(STsdbReadHandle* pTsdbReadHandle, S
...
@@ -306,17 +269,12 @@ static SArray* createCheckInfoFromTableGroup(STsdbReadHandle* pTsdbReadHandle, S
}
}
taosArrayPush
(
pTableCheckInfo
,
&
info
);
taosArrayPush
(
pTableCheckInfo
,
&
info
);
tsdbDebug
(
"%p check table uid:%"
PRId64
" from lastKey:%"
PRId64
"
0x%"
PRIx64
,
pTsdbReadHandle
,
info
.
tableId
,
info
.
lastKey
,
pTsdbReadHandle
->
qId
);
tsdbDebug
(
"%p check table uid:%"
PRId64
" from lastKey:%"
PRId64
"
%s"
,
pTsdbReadHandle
,
info
.
tableId
,
info
.
lastKey
,
pTsdbReadHandle
->
idStr
);
}
}
}
}
// taosArraySort(pTableCheckInfo, tsdbCheckInfoCompar);
// TODO group table according to the tag value.
size_t
gsize
=
taosArrayGetSize
(
pTableCheckInfo
);
taosArraySort
(
pTableCheckInfo
,
tsdbCheckInfoCompar
);
// for (int32_t i = 0; i < gsize; ++i) {
// STableCheckInfo* pInfo = (STableCheckInfo*) taosArrayGet(pTableCheckInfo, i);
// }
*
psTable
=
pTable
;
return
pTableCheckInfo
;
return
pTableCheckInfo
;
}
}
...
@@ -389,13 +347,13 @@ static void setQueryTimewindow(STsdbReadHandle* pTsdbReadHandle, STsdbQueryCond*
...
@@ -389,13 +347,13 @@ static void setQueryTimewindow(STsdbReadHandle* pTsdbReadHandle, STsdbQueryCond*
}
}
if
(
updateTs
)
{
if
(
updateTs
)
{
tsdbDebug
(
"%p update the query time window, old:%"
PRId64
" - %"
PRId64
", new:%"
PRId64
" - %"
PRId64
tsdbDebug
(
"%p update the query time window, old:%"
PRId64
" - %"
PRId64
", new:%"
PRId64
" - %"
PRId64
", %s"
,
", 0x%"
PRIx64
,
pTsdbReadHandle
,
pCond
->
twindow
.
skey
,
pCond
->
twindow
.
ekey
,
pTsdbReadHandle
->
window
.
skey
,
pTsdbReadHandle
,
pCond
->
twindow
.
skey
,
pCond
->
twindow
.
ekey
,
pTsdbReadHandle
->
window
.
skey
,
pTsdbReadHandle
->
window
.
ekey
,
pTsdbReadHandle
->
qId
);
pTsdbReadHandle
->
window
.
ekey
,
pTsdbReadHandle
->
idStr
);
}
}
}
}
static
STsdbReadHandle
*
tsdbQueryTablesImpl
(
STsdb
*
tsdb
,
STsdbQueryCond
*
pCond
,
uint64_t
qId
,
STsdbMemTable
*
pMemRef
)
{
static
STsdbReadHandle
*
tsdbQueryTablesImpl
(
STsdb
*
tsdb
,
STsdbQueryCond
*
pCond
,
uint64_t
qId
,
uint64_t
taskId
)
{
STsdbReadHandle
*
pReadHandle
=
calloc
(
1
,
sizeof
(
STsdbReadHandle
));
STsdbReadHandle
*
pReadHandle
=
calloc
(
1
,
sizeof
(
STsdbReadHandle
));
if
(
pReadHandle
==
NULL
)
{
if
(
pReadHandle
==
NULL
)
{
goto
_end
;
goto
_end
;
...
@@ -408,7 +366,6 @@ static STsdbReadHandle* tsdbQueryTablesImpl(STsdb* tsdb, STsdbQueryCond* pCond,
...
@@ -408,7 +366,6 @@ static STsdbReadHandle* tsdbQueryTablesImpl(STsdb* tsdb, STsdbQueryCond* pCond,
pReadHandle
->
cur
.
win
=
TSWINDOW_INITIALIZER
;
pReadHandle
->
cur
.
win
=
TSWINDOW_INITIALIZER
;
pReadHandle
->
checkFiles
=
true
;
pReadHandle
->
checkFiles
=
true
;
pReadHandle
->
activeIndex
=
0
;
// current active table index
pReadHandle
->
activeIndex
=
0
;
// current active table index
pReadHandle
->
qId
=
qId
;
pReadHandle
->
allocSize
=
0
;
pReadHandle
->
allocSize
=
0
;
pReadHandle
->
locateStart
=
false
;
pReadHandle
->
locateStart
=
false
;
pReadHandle
->
loadType
=
pCond
->
type
;
pReadHandle
->
loadType
=
pCond
->
type
;
...
@@ -417,6 +374,10 @@ static STsdbReadHandle* tsdbQueryTablesImpl(STsdb* tsdb, STsdbQueryCond* pCond,
...
@@ -417,6 +374,10 @@ static STsdbReadHandle* tsdbQueryTablesImpl(STsdb* tsdb, STsdbQueryCond* pCond,
pReadHandle
->
loadExternalRow
=
pCond
->
loadExternalRows
;
pReadHandle
->
loadExternalRow
=
pCond
->
loadExternalRows
;
pReadHandle
->
currentLoadExternalRows
=
pCond
->
loadExternalRows
;
pReadHandle
->
currentLoadExternalRows
=
pCond
->
loadExternalRows
;
char
buf
[
128
]
=
{
0
};
snprintf
(
buf
,
tListLen
(
buf
),
"TID:0x%"
PRIx64
" QID:0x%"
PRIx64
,
taskId
,
qId
);
pReadHandle
->
idStr
=
strdup
(
buf
);
if
(
tsdbInitReadH
(
&
pReadHandle
->
rhelper
,
(
STsdb
*
)
tsdb
)
!=
0
)
{
if
(
tsdbInitReadH
(
&
pReadHandle
->
rhelper
,
(
STsdb
*
)
tsdb
)
!=
0
)
{
goto
_end
;
goto
_end
;
}
}
...
@@ -455,7 +416,7 @@ static STsdbReadHandle* tsdbQueryTablesImpl(STsdb* tsdb, STsdbQueryCond* pCond,
...
@@ -455,7 +416,7 @@ static STsdbReadHandle* tsdbQueryTablesImpl(STsdb* tsdb, STsdbQueryCond* pCond,
pReadHandle
->
pDataCols
=
tdNewDataCols
(
1000
,
pReadHandle
->
pTsdb
->
config
.
maxRowsPerFileBlock
);
pReadHandle
->
pDataCols
=
tdNewDataCols
(
1000
,
pReadHandle
->
pTsdb
->
config
.
maxRowsPerFileBlock
);
if
(
pReadHandle
->
pDataCols
==
NULL
)
{
if
(
pReadHandle
->
pDataCols
==
NULL
)
{
tsdbError
(
"%p failed to malloc buf for pDataCols, %
"
PRIu64
,
pReadHandle
,
pReadHandle
->
qId
);
tsdbError
(
"%p failed to malloc buf for pDataCols, %
s"
,
pReadHandle
,
pReadHandle
->
idStr
);
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
goto
_end
;
goto
_end
;
}
}
...
@@ -471,8 +432,8 @@ static STsdbReadHandle* tsdbQueryTablesImpl(STsdb* tsdb, STsdbQueryCond* pCond,
...
@@ -471,8 +432,8 @@ static STsdbReadHandle* tsdbQueryTablesImpl(STsdb* tsdb, STsdbQueryCond* pCond,
return
NULL
;
return
NULL
;
}
}
tsdbReadHandleT
*
tsdbQueryTables
(
STsdb
*
tsdb
,
STsdbQueryCond
*
pCond
,
STableGroupInfo
*
groupList
,
uint64_t
qId
,
void
*
pRef
)
{
tsdbReadHandleT
*
tsdbQueryTables
(
STsdb
*
tsdb
,
STsdbQueryCond
*
pCond
,
STableGroupInfo
*
groupList
,
uint64_t
qId
,
uint64_t
taskId
)
{
STsdbReadHandle
*
pTsdbReadHandle
=
tsdbQueryTablesImpl
(
tsdb
,
pCond
,
qId
,
pRef
);
STsdbReadHandle
*
pTsdbReadHandle
=
tsdbQueryTablesImpl
(
tsdb
,
pCond
,
qId
,
taskId
);
if
(
pTsdbReadHandle
==
NULL
)
{
if
(
pTsdbReadHandle
==
NULL
)
{
return
NULL
;
return
NULL
;
}
}
...
@@ -481,20 +442,17 @@ tsdbReadHandleT* tsdbQueryTables(STsdb* tsdb, STsdbQueryCond* pCond, STableGroup
...
@@ -481,20 +442,17 @@ tsdbReadHandleT* tsdbQueryTables(STsdb* tsdb, STsdbQueryCond* pCond, STableGroup
return
(
tsdbReadHandleT
*
)
pTsdbReadHandle
;
return
(
tsdbReadHandleT
*
)
pTsdbReadHandle
;
}
}
SArray
*
psTable
=
NULL
;
// todo apply the lastkey of table check to avoid to load header file
// todo apply the lastkey of table check to avoid to load header file
pTsdbReadHandle
->
pTableCheckInfo
=
createCheckInfoFromTableGroup
(
pTsdbReadHandle
,
groupList
,
&
psTable
);
pTsdbReadHandle
->
pTableCheckInfo
=
createCheckInfoFromTableGroup
(
pTsdbReadHandle
,
groupList
);
if
(
pTsdbReadHandle
->
pTableCheckInfo
==
NULL
)
{
if
(
pTsdbReadHandle
->
pTableCheckInfo
==
NULL
)
{
// tsdbCleanupQueryHandle(pTsdbReadHandle);
// tsdbCleanupQueryHandle(pTsdbReadHandle);
taosArrayDestroy
(
psTable
);
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
return
NULL
;
return
NULL
;
}
}
// tsdbMayTakeMemSnapshot(pTsdbReadHandle, psTable);
tsdbDebug
(
"%p total numOfTable:%"
PRIzu
" in this query, group %"
PRIzu
" %s"
,
pTsdbReadHandle
,
taosArrayGetSize
(
pTsdbReadHandle
->
pTableCheckInfo
),
taosArrayGetSize
(
groupList
->
pGroupList
),
pTsdbReadHandle
->
idStr
);
tsdbDebug
(
"%p total numOfTable:%"
PRIzu
" in query, 0x%"
PRIx64
,
pTsdbReadHandle
,
taosArrayGetSize
(
pTsdbReadHandle
->
pTableCheckInfo
),
pTsdbReadHandle
->
qId
);
return
(
tsdbReadHandleT
)
pTsdbReadHandle
;
return
(
tsdbReadHandleT
)
pTsdbReadHandle
;
}
}
...
@@ -575,7 +533,7 @@ void tsdbResetQueryHandleForNewTable(tsdbReadHandleT queryHandle, STsdbQueryCond
...
@@ -575,7 +533,7 @@ void tsdbResetQueryHandleForNewTable(tsdbReadHandleT queryHandle, STsdbQueryCond
// pTsdbReadHandle->next = doFreeColumnInfoData(pTsdbReadHandle->next);
// pTsdbReadHandle->next = doFreeColumnInfoData(pTsdbReadHandle->next);
}
}
tsdbReadHandleT
tsdbQueryLastRow
(
STsdb
*
tsdb
,
STsdbQueryCond
*
pCond
,
STableGroupInfo
*
groupList
,
uint64_t
qId
,
STsdbMemTable
*
pMemRef
)
{
tsdbReadHandleT
tsdbQueryLastRow
(
STsdb
*
tsdb
,
STsdbQueryCond
*
pCond
,
STableGroupInfo
*
groupList
,
uint64_t
qId
,
uint64_t
taskId
)
{
pCond
->
twindow
=
updateLastrowForEachGroup
(
groupList
);
pCond
->
twindow
=
updateLastrowForEachGroup
(
groupList
);
// no qualified table
// no qualified table
...
@@ -583,7 +541,7 @@ tsdbReadHandleT tsdbQueryLastRow(STsdb *tsdb, STsdbQueryCond *pCond, STableGroup
...
@@ -583,7 +541,7 @@ tsdbReadHandleT tsdbQueryLastRow(STsdb *tsdb, STsdbQueryCond *pCond, STableGroup
return
NULL
;
return
NULL
;
}
}
STsdbReadHandle
*
pTsdbReadHandle
=
(
STsdbReadHandle
*
)
tsdbQueryTables
(
tsdb
,
pCond
,
groupList
,
qId
,
pMemRef
);
STsdbReadHandle
*
pTsdbReadHandle
=
(
STsdbReadHandle
*
)
tsdbQueryTables
(
tsdb
,
pCond
,
groupList
,
qId
,
taskId
);
if
(
pTsdbReadHandle
==
NULL
)
{
if
(
pTsdbReadHandle
==
NULL
)
{
return
NULL
;
return
NULL
;
}
}
...
@@ -666,7 +624,7 @@ static STableGroupInfo* trimTableGroup(STimeWindow* window, STableGroupInfo* pGr
...
@@ -666,7 +624,7 @@ static STableGroupInfo* trimTableGroup(STimeWindow* window, STableGroupInfo* pGr
return
pNew
;
return
pNew
;
}
}
tsdbReadHandleT
tsdbQueryRowsInExternalWindow
(
STsdb
*
tsdb
,
STsdbQueryCond
*
pCond
,
STableGroupInfo
*
groupList
,
uint64_t
qId
,
STsdbMemTable
*
pRef
)
{
tsdbReadHandleT
tsdbQueryRowsInExternalWindow
(
STsdb
*
tsdb
,
STsdbQueryCond
*
pCond
,
STableGroupInfo
*
groupList
,
uint64_t
qId
,
uint64_t
taskId
)
{
STableGroupInfo
*
pNew
=
trimTableGroup
(
&
pCond
->
twindow
,
groupList
);
STableGroupInfo
*
pNew
=
trimTableGroup
(
&
pCond
->
twindow
,
groupList
);
if
(
pNew
->
numOfTables
==
0
)
{
if
(
pNew
->
numOfTables
==
0
)
{
...
@@ -681,7 +639,7 @@ tsdbReadHandleT tsdbQueryRowsInExternalWindow(STsdb *tsdb, STsdbQueryCond* pCond
...
@@ -681,7 +639,7 @@ tsdbReadHandleT tsdbQueryRowsInExternalWindow(STsdb *tsdb, STsdbQueryCond* pCond
}
}
}
}
STsdbReadHandle
*
pTsdbReadHandle
=
(
STsdbReadHandle
*
)
tsdbQueryTables
(
tsdb
,
pCond
,
pNew
,
qId
,
pRef
);
STsdbReadHandle
*
pTsdbReadHandle
=
(
STsdbReadHandle
*
)
tsdbQueryTables
(
tsdb
,
pCond
,
pNew
,
qId
,
taskId
);
pTsdbReadHandle
->
loadExternalRow
=
true
;
pTsdbReadHandle
->
loadExternalRow
=
true
;
pTsdbReadHandle
->
currentLoadExternalRows
=
true
;
pTsdbReadHandle
->
currentLoadExternalRows
=
true
;
...
@@ -734,8 +692,8 @@ static bool initTableMemIterator(STsdbReadHandle* pHandle, STableCheckInfo* pChe
...
@@ -734,8 +692,8 @@ static bool initTableMemIterator(STsdbReadHandle* pHandle, STableCheckInfo* pChe
SMemRow
row
=
(
SMemRow
)
SL_GET_NODE_DATA
(
node
);
SMemRow
row
=
(
SMemRow
)
SL_GET_NODE_DATA
(
node
);
TSKEY
key
=
memRowKey
(
row
);
// first timestamp in buffer
TSKEY
key
=
memRowKey
(
row
);
// first timestamp in buffer
tsdbDebug
(
"%p uid:%"
PRId64
", check data in mem from skey:%"
PRId64
", order:%d, ts range in buf:%"
PRId64
tsdbDebug
(
"%p uid:%"
PRId64
", check data in mem from skey:%"
PRId64
", order:%d, ts range in buf:%"
PRId64
"-%"
PRId64
", lastKey:%"
PRId64
", numOfRows:%"
PRId64
",
0x%"
PRIx64
,
"-%"
PRId64
", lastKey:%"
PRId64
", numOfRows:%"
PRId64
",
%s"
,
pHandle
,
pCheckInfo
->
tableId
,
key
,
order
,
(
*
pMem
)
->
keyMin
,
(
*
pMem
)
->
keyMax
,
pCheckInfo
->
lastKey
,
(
*
pMem
)
->
nrows
,
pHandle
->
qId
);
pHandle
,
pCheckInfo
->
tableId
,
key
,
order
,
(
*
pMem
)
->
keyMin
,
(
*
pMem
)
->
keyMax
,
pCheckInfo
->
lastKey
,
(
*
pMem
)
->
nrows
,
pHandle
->
idStr
);
if
(
ASCENDING_TRAVERSE
(
order
))
{
if
(
ASCENDING_TRAVERSE
(
order
))
{
assert
(
pCheckInfo
->
lastKey
<=
key
);
assert
(
pCheckInfo
->
lastKey
<=
key
);
...
@@ -744,7 +702,7 @@ static bool initTableMemIterator(STsdbReadHandle* pHandle, STableCheckInfo* pChe
...
@@ -744,7 +702,7 @@ static bool initTableMemIterator(STsdbReadHandle* pHandle, STableCheckInfo* pChe
}
}
}
else
{
}
else
{
tsdbDebug
(
"%p uid:%"
PRId64
", no data in mem,
0x%"
PRIx64
,
pHandle
,
pCheckInfo
->
tableId
,
pHandle
->
qId
);
tsdbDebug
(
"%p uid:%"
PRId64
", no data in mem,
%s"
,
pHandle
,
pCheckInfo
->
tableId
,
pHandle
->
idStr
);
}
}
if
(
!
imemEmpty
)
{
if
(
!
imemEmpty
)
{
...
@@ -754,8 +712,8 @@ static bool initTableMemIterator(STsdbReadHandle* pHandle, STableCheckInfo* pChe
...
@@ -754,8 +712,8 @@ static bool initTableMemIterator(STsdbReadHandle* pHandle, STableCheckInfo* pChe
SMemRow
row
=
(
SMemRow
)
SL_GET_NODE_DATA
(
node
);
SMemRow
row
=
(
SMemRow
)
SL_GET_NODE_DATA
(
node
);
TSKEY
key
=
memRowKey
(
row
);
// first timestamp in buffer
TSKEY
key
=
memRowKey
(
row
);
// first timestamp in buffer
tsdbDebug
(
"%p uid:%"
PRId64
", check data in imem from skey:%"
PRId64
", order:%d, ts range in buf:%"
PRId64
tsdbDebug
(
"%p uid:%"
PRId64
", check data in imem from skey:%"
PRId64
", order:%d, ts range in buf:%"
PRId64
"-%"
PRId64
", lastKey:%"
PRId64
", numOfRows:%"
PRId64
",
0x%"
PRIx64
,
"-%"
PRId64
", lastKey:%"
PRId64
", numOfRows:%"
PRId64
",
%s"
,
pHandle
,
pCheckInfo
->
tableId
,
key
,
order
,
(
*
pIMem
)
->
keyMin
,
(
*
pIMem
)
->
keyMax
,
pCheckInfo
->
lastKey
,
(
*
pIMem
)
->
nrows
,
pHandle
->
qId
);
pHandle
,
pCheckInfo
->
tableId
,
key
,
order
,
(
*
pIMem
)
->
keyMin
,
(
*
pIMem
)
->
keyMax
,
pCheckInfo
->
lastKey
,
(
*
pIMem
)
->
nrows
,
pHandle
->
idStr
);
if
(
ASCENDING_TRAVERSE
(
order
))
{
if
(
ASCENDING_TRAVERSE
(
order
))
{
assert
(
pCheckInfo
->
lastKey
<=
key
);
assert
(
pCheckInfo
->
lastKey
<=
key
);
...
@@ -763,7 +721,7 @@ static bool initTableMemIterator(STsdbReadHandle* pHandle, STableCheckInfo* pChe
...
@@ -763,7 +721,7 @@ static bool initTableMemIterator(STsdbReadHandle* pHandle, STableCheckInfo* pChe
assert
(
pCheckInfo
->
lastKey
>=
key
);
assert
(
pCheckInfo
->
lastKey
>=
key
);
}
}
}
else
{
}
else
{
tsdbDebug
(
"%p uid:%"
PRId64
", no data in imem,
0x%"
PRIx64
,
pHandle
,
pCheckInfo
->
tableId
,
pHandle
->
qId
);
tsdbDebug
(
"%p uid:%"
PRId64
", no data in imem,
%s"
,
pHandle
,
pCheckInfo
->
tableId
,
pHandle
->
idStr
);
}
}
return
true
;
return
true
;
...
@@ -952,8 +910,8 @@ static bool hasMoreDataInCache(STsdbReadHandle* pHandle) {
...
@@ -952,8 +910,8 @@ static bool hasMoreDataInCache(STsdbReadHandle* pHandle) {
}
}
pCheckInfo
->
lastKey
=
memRowKey
(
row
);
// first timestamp in buffer
pCheckInfo
->
lastKey
=
memRowKey
(
row
);
// first timestamp in buffer
tsdbDebug
(
"%p uid:%"
PRId64
", check data in buffer from skey:%"
PRId64
", order:%d,
0x%"
PRIx64
,
pHandle
,
tsdbDebug
(
"%p uid:%"
PRId64
", check data in buffer from skey:%"
PRId64
", order:%d,
%s"
,
pHandle
,
pCheckInfo
->
tableId
,
pCheckInfo
->
lastKey
,
pHandle
->
order
,
pHandle
->
qId
);
pCheckInfo
->
tableId
,
pCheckInfo
->
lastKey
,
pHandle
->
order
,
pHandle
->
idStr
);
// all data in mem are checked already.
// all data in mem are checked already.
if
((
pCheckInfo
->
lastKey
>
pHandle
->
window
.
ekey
&&
ASCENDING_TRAVERSE
(
pHandle
->
order
))
||
if
((
pCheckInfo
->
lastKey
>
pHandle
->
window
.
ekey
&&
ASCENDING_TRAVERSE
(
pHandle
->
order
))
||
...
@@ -1138,21 +1096,21 @@ static int32_t doLoadFileDataBlock(STsdbReadHandle* pTsdbReadHandle, SBlock* pBl
...
@@ -1138,21 +1096,21 @@ static int32_t doLoadFileDataBlock(STsdbReadHandle* pTsdbReadHandle, SBlock* pBl
STSchema
*
pSchema
=
metaGetTbTSchema
(
pTsdbReadHandle
->
pTsdb
->
pMeta
,
pCheckInfo
->
tableId
,
0
);
STSchema
*
pSchema
=
metaGetTbTSchema
(
pTsdbReadHandle
->
pTsdb
->
pMeta
,
pCheckInfo
->
tableId
,
0
);
int32_t
code
=
tdInitDataCols
(
pTsdbReadHandle
->
pDataCols
,
pSchema
);
int32_t
code
=
tdInitDataCols
(
pTsdbReadHandle
->
pDataCols
,
pSchema
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
tsdbError
(
"%p failed to malloc buf for pDataCols,
0x%"
PRIx64
,
pTsdbReadHandle
,
pTsdbReadHandle
->
qId
);
tsdbError
(
"%p failed to malloc buf for pDataCols,
%s"
,
pTsdbReadHandle
,
pTsdbReadHandle
->
idStr
);
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
goto
_error
;
goto
_error
;
}
}
code
=
tdInitDataCols
(
pTsdbReadHandle
->
rhelper
.
pDCols
[
0
],
pSchema
);
code
=
tdInitDataCols
(
pTsdbReadHandle
->
rhelper
.
pDCols
[
0
],
pSchema
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
tsdbError
(
"%p failed to malloc buf for rhelper.pDataCols[0],
0x%"
PRIx64
,
pTsdbReadHandle
,
pTsdbReadHandle
->
qId
);
tsdbError
(
"%p failed to malloc buf for rhelper.pDataCols[0],
%s"
,
pTsdbReadHandle
,
pTsdbReadHandle
->
idStr
);
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
goto
_error
;
goto
_error
;
}
}
code
=
tdInitDataCols
(
pTsdbReadHandle
->
rhelper
.
pDCols
[
1
],
pSchema
);
code
=
tdInitDataCols
(
pTsdbReadHandle
->
rhelper
.
pDCols
[
1
],
pSchema
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
tsdbError
(
"%p failed to malloc buf for rhelper.pDataCols[1],
0x%"
PRIx64
,
pTsdbReadHandle
,
pTsdbReadHandle
->
qId
);
tsdbError
(
"%p failed to malloc buf for rhelper.pDataCols[1],
%s"
,
pTsdbReadHandle
,
pTsdbReadHandle
->
idStr
);
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
goto
_error
;
goto
_error
;
}
}
...
@@ -1188,15 +1146,15 @@ static int32_t doLoadFileDataBlock(STsdbReadHandle* pTsdbReadHandle, SBlock* pBl
...
@@ -1188,15 +1146,15 @@ static int32_t doLoadFileDataBlock(STsdbReadHandle* pTsdbReadHandle, SBlock* pBl
int64_t
elapsedTime
=
(
taosGetTimestampUs
()
-
st
);
int64_t
elapsedTime
=
(
taosGetTimestampUs
()
-
st
);
pTsdbReadHandle
->
cost
.
blockLoadTime
+=
elapsedTime
;
pTsdbReadHandle
->
cost
.
blockLoadTime
+=
elapsedTime
;
tsdbDebug
(
"%p load file block into buffer, index:%d, brange:%"
PRId64
"-%"
PRId64
", rows:%d, elapsed time:%"
PRId64
" us,
0x%"
PRIx64
,
tsdbDebug
(
"%p load file block into buffer, index:%d, brange:%"
PRId64
"-%"
PRId64
", rows:%d, elapsed time:%"
PRId64
" us,
%s"
,
pTsdbReadHandle
,
slotIndex
,
pBlock
->
keyFirst
,
pBlock
->
keyLast
,
pBlock
->
numOfRows
,
elapsedTime
,
pTsdbReadHandle
->
qId
);
pTsdbReadHandle
,
slotIndex
,
pBlock
->
keyFirst
,
pBlock
->
keyLast
,
pBlock
->
numOfRows
,
elapsedTime
,
pTsdbReadHandle
->
idStr
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
_error:
_error:
pBlock
->
numOfRows
=
0
;
pBlock
->
numOfRows
=
0
;
tsdbError
(
"%p error occurs in loading file block, index:%d, brange:%"
PRId64
"-%"
PRId64
", rows:%d,
0x%"
PRIx64
,
tsdbError
(
"%p error occurs in loading file block, index:%d, brange:%"
PRId64
"-%"
PRId64
", rows:%d,
%s"
,
pTsdbReadHandle
,
slotIndex
,
pBlock
->
keyFirst
,
pBlock
->
keyLast
,
pBlock
->
numOfRows
,
pTsdbReadHandle
->
qId
);
pTsdbReadHandle
,
slotIndex
,
pBlock
->
keyFirst
,
pBlock
->
keyLast
,
pBlock
->
numOfRows
,
pTsdbReadHandle
->
idStr
);
return
terrno
;
return
terrno
;
}
}
...
@@ -1219,9 +1177,9 @@ static int32_t handleDataMergeIfNeeded(STsdbReadHandle* pTsdbReadHandle, SBlock*
...
@@ -1219,9 +1177,9 @@ static int32_t handleDataMergeIfNeeded(STsdbReadHandle* pTsdbReadHandle, SBlock*
key
=
extractFirstTraverseKey
(
pCheckInfo
,
pTsdbReadHandle
->
order
,
pCfg
->
update
);
key
=
extractFirstTraverseKey
(
pCheckInfo
,
pTsdbReadHandle
->
order
,
pCfg
->
update
);
if
(
key
!=
TSKEY_INITIAL_VAL
)
{
if
(
key
!=
TSKEY_INITIAL_VAL
)
{
tsdbDebug
(
"%p key in mem:%"
PRId64
",
0x%"
PRIx64
,
pTsdbReadHandle
,
key
,
pTsdbReadHandle
->
qId
);
tsdbDebug
(
"%p key in mem:%"
PRId64
",
%s"
,
pTsdbReadHandle
,
key
,
pTsdbReadHandle
->
idStr
);
}
else
{
}
else
{
tsdbDebug
(
"%p no data in mem,
0x%"
PRIx64
,
pTsdbReadHandle
,
pTsdbReadHandle
->
qId
);
tsdbDebug
(
"%p no data in mem,
%s"
,
pTsdbReadHandle
,
pTsdbReadHandle
->
idStr
);
}
}
if
((
ASCENDING_TRAVERSE
(
pTsdbReadHandle
->
order
)
&&
(
key
!=
TSKEY_INITIAL_VAL
&&
key
<=
binfo
.
window
.
ekey
))
||
if
((
ASCENDING_TRAVERSE
(
pTsdbReadHandle
->
order
)
&&
(
key
!=
TSKEY_INITIAL_VAL
&&
key
<=
binfo
.
window
.
ekey
))
||
...
@@ -1288,11 +1246,11 @@ static int32_t handleDataMergeIfNeeded(STsdbReadHandle* pTsdbReadHandle, SBlock*
...
@@ -1288,11 +1246,11 @@ static int32_t handleDataMergeIfNeeded(STsdbReadHandle* pTsdbReadHandle, SBlock*
assert
(
cur
->
blockCompleted
);
assert
(
cur
->
blockCompleted
);
if
(
cur
->
rows
==
binfo
.
rows
)
{
if
(
cur
->
rows
==
binfo
.
rows
)
{
tsdbDebug
(
"%p whole file block qualified, brange:%"
PRId64
"-%"
PRId64
", rows:%d, lastKey:%"
PRId64
", %
"
PRIx64
,
tsdbDebug
(
"%p whole file block qualified, brange:%"
PRId64
"-%"
PRId64
", rows:%d, lastKey:%"
PRId64
", %
s"
,
pTsdbReadHandle
,
cur
->
win
.
skey
,
cur
->
win
.
ekey
,
cur
->
rows
,
cur
->
lastKey
,
pTsdbReadHandle
->
qId
);
pTsdbReadHandle
,
cur
->
win
.
skey
,
cur
->
win
.
ekey
,
cur
->
rows
,
cur
->
lastKey
,
pTsdbReadHandle
->
idStr
);
}
else
{
}
else
{
tsdbDebug
(
"%p create data block from remain file block, brange:%"
PRId64
"-%"
PRId64
", rows:%d, total:%d, lastKey:%"
PRId64
", %
"
PRIx64
,
tsdbDebug
(
"%p create data block from remain file block, brange:%"
PRId64
"-%"
PRId64
", rows:%d, total:%d, lastKey:%"
PRId64
", %
s"
,
pTsdbReadHandle
,
cur
->
win
.
skey
,
cur
->
win
.
ekey
,
cur
->
rows
,
binfo
.
rows
,
cur
->
lastKey
,
pTsdbReadHandle
->
qId
);
pTsdbReadHandle
,
cur
->
win
.
skey
,
cur
->
win
.
ekey
,
cur
->
rows
,
binfo
.
rows
,
cur
->
lastKey
,
pTsdbReadHandle
->
idStr
);
}
}
}
}
...
@@ -1815,8 +1773,8 @@ static void copyAllRemainRowsFromFileBlock(STsdbReadHandle* pTsdbReadHandle, STa
...
@@ -1815,8 +1773,8 @@ static void copyAllRemainRowsFromFileBlock(STsdbReadHandle* pTsdbReadHandle, STa
updateInfoAfterMerge
(
pTsdbReadHandle
,
pCheckInfo
,
numOfRows
,
pos
);
updateInfoAfterMerge
(
pTsdbReadHandle
,
pCheckInfo
,
numOfRows
,
pos
);
doCheckGeneratedBlockRange
(
pTsdbReadHandle
);
doCheckGeneratedBlockRange
(
pTsdbReadHandle
);
tsdbDebug
(
"%p uid:%"
PRIu64
", data block created, mixblock:%d, brange:%"
PRIu64
"-%"
PRIu64
" rows:%d,
0x%"
PRIx64
,
tsdbDebug
(
"%p uid:%"
PRIu64
", data block created, mixblock:%d, brange:%"
PRIu64
"-%"
PRIu64
" rows:%d,
%s"
,
pTsdbReadHandle
,
pCheckInfo
->
tableId
,
cur
->
mixBlock
,
cur
->
win
.
skey
,
cur
->
win
.
ekey
,
cur
->
rows
,
pTsdbReadHandle
->
qId
);
pTsdbReadHandle
,
pCheckInfo
->
tableId
,
cur
->
mixBlock
,
cur
->
win
.
skey
,
cur
->
win
.
ekey
,
cur
->
rows
,
pTsdbReadHandle
->
idStr
);
}
}
int32_t
getEndPosInDataBlock
(
STsdbReadHandle
*
pTsdbReadHandle
,
SDataBlockInfo
*
pBlockInfo
)
{
int32_t
getEndPosInDataBlock
(
STsdbReadHandle
*
pTsdbReadHandle
,
SDataBlockInfo
*
pBlockInfo
)
{
...
@@ -1868,9 +1826,9 @@ static void doMergeTwoLevelData(STsdbReadHandle* pTsdbReadHandle, STableCheckInf
...
@@ -1868,9 +1826,9 @@ static void doMergeTwoLevelData(STsdbReadHandle* pTsdbReadHandle, STableCheckInf
int32_t
endPos
=
getEndPosInDataBlock
(
pTsdbReadHandle
,
&
blockInfo
);
int32_t
endPos
=
getEndPosInDataBlock
(
pTsdbReadHandle
,
&
blockInfo
);
tsdbDebug
(
"%p uid:%"
PRIu64
" start merge data block, file block range:%"
PRIu64
"-%"
PRIu64
" rows:%d, start:%d,"
tsdbDebug
(
"%p uid:%"
PRIu64
" start merge data block, file block range:%"
PRIu64
"-%"
PRIu64
" rows:%d, start:%d,"
"end:%d,
0x%"
PRIx64
,
"end:%d,
%s"
,
pTsdbReadHandle
,
pCheckInfo
->
tableId
,
blockInfo
.
window
.
skey
,
blockInfo
.
window
.
ekey
,
pTsdbReadHandle
,
pCheckInfo
->
tableId
,
blockInfo
.
window
.
skey
,
blockInfo
.
window
.
ekey
,
blockInfo
.
rows
,
cur
->
pos
,
endPos
,
pTsdbReadHandle
->
qId
);
blockInfo
.
rows
,
cur
->
pos
,
endPos
,
pTsdbReadHandle
->
idStr
);
// compared with the data from in-memory buffer, to generate the correct timestamp array list
// compared with the data from in-memory buffer, to generate the correct timestamp array list
int32_t
numOfRows
=
0
;
int32_t
numOfRows
=
0
;
...
@@ -2027,8 +1985,8 @@ static void doMergeTwoLevelData(STsdbReadHandle* pTsdbReadHandle, STableCheckInf
...
@@ -2027,8 +1985,8 @@ static void doMergeTwoLevelData(STsdbReadHandle* pTsdbReadHandle, STableCheckInf
updateInfoAfterMerge
(
pTsdbReadHandle
,
pCheckInfo
,
numOfRows
,
pos
);
updateInfoAfterMerge
(
pTsdbReadHandle
,
pCheckInfo
,
numOfRows
,
pos
);
doCheckGeneratedBlockRange
(
pTsdbReadHandle
);
doCheckGeneratedBlockRange
(
pTsdbReadHandle
);
tsdbDebug
(
"%p uid:%"
PRIu64
", data block created, mixblock:%d, brange:%"
PRIu64
"-%"
PRIu64
" rows:%d,
0x%"
PRIx64
,
tsdbDebug
(
"%p uid:%"
PRIu64
", data block created, mixblock:%d, brange:%"
PRIu64
"-%"
PRIu64
" rows:%d,
%s"
,
pTsdbReadHandle
,
pCheckInfo
->
tableId
,
cur
->
mixBlock
,
cur
->
win
.
skey
,
cur
->
win
.
ekey
,
cur
->
rows
,
pTsdbReadHandle
->
qId
);
pTsdbReadHandle
,
pCheckInfo
->
tableId
,
cur
->
mixBlock
,
cur
->
win
.
skey
,
cur
->
win
.
ekey
,
cur
->
rows
,
pTsdbReadHandle
->
idStr
);
}
}
int32_t
binarySearchForKey
(
char
*
pValue
,
int
num
,
TSKEY
key
,
int
order
)
{
int32_t
binarySearchForKey
(
char
*
pValue
,
int
num
,
TSKEY
key
,
int
order
)
{
...
@@ -2202,13 +2160,13 @@ static int32_t createDataBlocksInfo(STsdbReadHandle* pTsdbReadHandle, int32_t nu
...
@@ -2202,13 +2160,13 @@ static int32_t createDataBlocksInfo(STsdbReadHandle* pTsdbReadHandle, int32_t nu
memcpy
(
pTsdbReadHandle
->
pDataBlockInfo
,
sup
.
pDataBlockInfo
[
0
],
sizeof
(
STableBlockInfo
)
*
numOfBlocks
);
memcpy
(
pTsdbReadHandle
->
pDataBlockInfo
,
sup
.
pDataBlockInfo
[
0
],
sizeof
(
STableBlockInfo
)
*
numOfBlocks
);
cleanBlockOrderSupporter
(
&
sup
,
numOfQualTables
);
cleanBlockOrderSupporter
(
&
sup
,
numOfQualTables
);
tsdbDebug
(
"%p create data blocks info struct completed for 1 table, %d blocks not sorted
0x%"
PRIx64
,
pTsdbReadHandle
,
cnt
,
tsdbDebug
(
"%p create data blocks info struct completed for 1 table, %d blocks not sorted
%s"
,
pTsdbReadHandle
,
cnt
,
pTsdbReadHandle
->
qId
);
pTsdbReadHandle
->
idStr
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
tsdbDebug
(
"%p create data blocks info struct completed, %d blocks in %d tables
0x%"
PRIx64
,
pTsdbReadHandle
,
cnt
,
tsdbDebug
(
"%p create data blocks info struct completed, %d blocks in %d tables
%s"
,
pTsdbReadHandle
,
cnt
,
numOfQualTables
,
pTsdbReadHandle
->
qId
);
numOfQualTables
,
pTsdbReadHandle
->
idStr
);
assert
(
cnt
<=
numOfBlocks
&&
numOfQualTables
<=
numOfTables
);
// the pTableQueryInfo[j]->numOfBlocks may be 0
assert
(
cnt
<=
numOfBlocks
&&
numOfQualTables
<=
numOfTables
);
// the pTableQueryInfo[j]->numOfBlocks may be 0
sup
.
numOfTables
=
numOfQualTables
;
sup
.
numOfTables
=
numOfQualTables
;
...
@@ -2244,7 +2202,7 @@ static int32_t createDataBlocksInfo(STsdbReadHandle* pTsdbReadHandle, int32_t nu
...
@@ -2244,7 +2202,7 @@ static int32_t createDataBlocksInfo(STsdbReadHandle* pTsdbReadHandle, int32_t nu
* }
* }
*/
*/
tsdbDebug
(
"%p %d data blocks sort completed,
0x%"
PRIx64
,
pTsdbReadHandle
,
cnt
,
pTsdbReadHandle
->
qId
);
tsdbDebug
(
"%p %d data blocks sort completed,
%s"
,
pTsdbReadHandle
,
cnt
,
pTsdbReadHandle
->
idStr
);
cleanBlockOrderSupporter
(
&
sup
,
numOfTables
);
cleanBlockOrderSupporter
(
&
sup
,
numOfTables
);
free
(
pTree
);
free
(
pTree
);
...
@@ -2302,8 +2260,8 @@ static int32_t getFirstFileDataBlock(STsdbReadHandle* pTsdbReadHandle, bool* exi
...
@@ -2302,8 +2260,8 @@ static int32_t getFirstFileDataBlock(STsdbReadHandle* pTsdbReadHandle, bool* exi
if
((
ASCENDING_TRAVERSE
(
pTsdbReadHandle
->
order
)
&&
win
.
skey
>
pTsdbReadHandle
->
window
.
ekey
)
||
if
((
ASCENDING_TRAVERSE
(
pTsdbReadHandle
->
order
)
&&
win
.
skey
>
pTsdbReadHandle
->
window
.
ekey
)
||
(
!
ASCENDING_TRAVERSE
(
pTsdbReadHandle
->
order
)
&&
win
.
ekey
<
pTsdbReadHandle
->
window
.
ekey
))
{
(
!
ASCENDING_TRAVERSE
(
pTsdbReadHandle
->
order
)
&&
win
.
ekey
<
pTsdbReadHandle
->
window
.
ekey
))
{
tsdbUnLockFS
(
REPO_FS
(
pTsdbReadHandle
->
pTsdb
));
tsdbUnLockFS
(
REPO_FS
(
pTsdbReadHandle
->
pTsdb
));
tsdbDebug
(
"%p remain files are not qualified for qrange:%"
PRId64
"-%"
PRId64
", ignore,
0x%"
PRIx64
,
pTsdbReadHandle
,
tsdbDebug
(
"%p remain files are not qualified for qrange:%"
PRId64
"-%"
PRId64
", ignore,
%s"
,
pTsdbReadHandle
,
pTsdbReadHandle
->
window
.
skey
,
pTsdbReadHandle
->
window
.
ekey
,
pTsdbReadHandle
->
qId
);
pTsdbReadHandle
->
window
.
skey
,
pTsdbReadHandle
->
window
.
ekey
,
pTsdbReadHandle
->
idStr
);
pTsdbReadHandle
->
pFileGroup
=
NULL
;
pTsdbReadHandle
->
pFileGroup
=
NULL
;
assert
(
pTsdbReadHandle
->
numOfBlocks
==
0
);
assert
(
pTsdbReadHandle
->
numOfBlocks
==
0
);
break
;
break
;
...
@@ -2326,8 +2284,8 @@ static int32_t getFirstFileDataBlock(STsdbReadHandle* pTsdbReadHandle, bool* exi
...
@@ -2326,8 +2284,8 @@ static int32_t getFirstFileDataBlock(STsdbReadHandle* pTsdbReadHandle, bool* exi
break
;
break
;
}
}
tsdbDebug
(
"%p %d blocks found in file for %d table(s), fid:%d,
0x%"
PRIx64
,
pTsdbReadHandle
,
numOfBlocks
,
numOfTables
,
tsdbDebug
(
"%p %d blocks found in file for %d table(s), fid:%d,
%s"
,
pTsdbReadHandle
,
numOfBlocks
,
numOfTables
,
pTsdbReadHandle
->
pFileGroup
->
fid
,
pTsdbReadHandle
->
qId
);
pTsdbReadHandle
->
pFileGroup
->
fid
,
pTsdbReadHandle
->
idStr
);
assert
(
numOfBlocks
>=
0
);
assert
(
numOfBlocks
>=
0
);
if
(
numOfBlocks
==
0
)
{
if
(
numOfBlocks
==
0
)
{
...
@@ -2420,8 +2378,8 @@ int32_t tsdbGetFileBlocksDistInfo(tsdbReadHandleT* queryHandle, STableBlockDist*
...
@@ -2420,8 +2378,8 @@ int32_t tsdbGetFileBlocksDistInfo(tsdbReadHandleT* queryHandle, STableBlockDist*
if ((ASCENDING_TRAVERSE(pTsdbReadHandle->order) && win.skey > pTsdbReadHandle->window.ekey) ||
if ((ASCENDING_TRAVERSE(pTsdbReadHandle->order) && win.skey > pTsdbReadHandle->window.ekey) ||
(!ASCENDING_TRAVERSE(pTsdbReadHandle->order) && win.ekey < pTsdbReadHandle->window.ekey)) {
(!ASCENDING_TRAVERSE(pTsdbReadHandle->order) && win.ekey < pTsdbReadHandle->window.ekey)) {
tsdbUnLockFS(REPO_FS(pTsdbReadHandle->pTsdb));
tsdbUnLockFS(REPO_FS(pTsdbReadHandle->pTsdb));
tsdbDebug("%p remain files are not qualified for qrange:%" PRId64 "-%" PRId64 ", ignore,
0x%"PRIx64
, pTsdbReadHandle,
tsdbDebug("%p remain files are not qualified for qrange:%" PRId64 "-%" PRId64 ", ignore,
%s"
, pTsdbReadHandle,
pTsdbReadHandle->window.skey, pTsdbReadHandle->window.ekey, pTsdbReadHandle->
qId
);
pTsdbReadHandle->window.skey, pTsdbReadHandle->window.ekey, pTsdbReadHandle->
idStr
);
pTsdbReadHandle->pFileGroup = NULL;
pTsdbReadHandle->pFileGroup = NULL;
break;
break;
}
}
...
@@ -2444,8 +2402,8 @@ int32_t tsdbGetFileBlocksDistInfo(tsdbReadHandleT* queryHandle, STableBlockDist*
...
@@ -2444,8 +2402,8 @@ int32_t tsdbGetFileBlocksDistInfo(tsdbReadHandleT* queryHandle, STableBlockDist*
break;
break;
}
}
tsdbDebug("%p %d blocks found in file for %d table(s), fid:%d,
0x%"PRIx64
, pTsdbReadHandle, numOfBlocks, numOfTables,
tsdbDebug("%p %d blocks found in file for %d table(s), fid:%d,
%s"
, pTsdbReadHandle, numOfBlocks, numOfTables,
pTsdbReadHandle->pFileGroup->fid, pTsdbReadHandle->
qId
);
pTsdbReadHandle->pFileGroup->fid, pTsdbReadHandle->
idStr
);
if (numOfBlocks == 0) {
if (numOfBlocks == 0) {
continue;
continue;
...
@@ -2499,8 +2457,8 @@ static int32_t getDataBlocksInFiles(STsdbReadHandle* pTsdbReadHandle, bool* exis
...
@@ -2499,8 +2457,8 @@ static int32_t getDataBlocksInFiles(STsdbReadHandle* pTsdbReadHandle, bool* exis
if
((
!
cur
->
mixBlock
)
||
cur
->
blockCompleted
)
{
if
((
!
cur
->
mixBlock
)
||
cur
->
blockCompleted
)
{
// all data blocks in current file has been checked already, try next file if exists
// all data blocks in current file has been checked already, try next file if exists
}
else
{
}
else
{
tsdbDebug
(
"%p continue in current data block, index:%d, pos:%d,
0x%"
PRIx64
,
pTsdbReadHandle
,
cur
->
slot
,
cur
->
pos
,
tsdbDebug
(
"%p continue in current data block, index:%d, pos:%d,
%s"
,
pTsdbReadHandle
,
cur
->
slot
,
cur
->
pos
,
pTsdbReadHandle
->
qId
);
pTsdbReadHandle
->
idStr
);
int32_t
code
=
handleDataMergeIfNeeded
(
pTsdbReadHandle
,
pBlockInfo
->
compBlock
,
pCheckInfo
);
int32_t
code
=
handleDataMergeIfNeeded
(
pTsdbReadHandle
,
pBlockInfo
->
compBlock
,
pCheckInfo
);
*
exists
=
(
pTsdbReadHandle
->
realNumOfRows
>
0
);
*
exists
=
(
pTsdbReadHandle
->
realNumOfRows
>
0
);
...
@@ -2624,8 +2582,8 @@ static int tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int
...
@@ -2624,8 +2582,8 @@ static int tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int
}
}
int64_t
elapsedTime
=
taosGetTimestampUs
()
-
st
;
int64_t
elapsedTime
=
taosGetTimestampUs
()
-
st
;
tsdbDebug
(
"%p build data block from cache completed, elapsed time:%"
PRId64
" us, numOfRows:%d, numOfCols:%d,
0x%"
PRIx64
,
pTsdbReadHandle
,
tsdbDebug
(
"%p build data block from cache completed, elapsed time:%"
PRId64
" us, numOfRows:%d, numOfCols:%d,
%s"
,
pTsdbReadHandle
,
elapsedTime
,
numOfRows
,
numOfCols
,
pTsdbReadHandle
->
qId
);
elapsedTime
,
numOfRows
,
numOfCols
,
pTsdbReadHandle
->
idStr
);
return
numOfRows
;
return
numOfRows
;
}
}
...
@@ -2639,7 +2597,7 @@ static int32_t getAllTableList(SMeta* pMeta, uint64_t uid, SArray* list) {
...
@@ -2639,7 +2597,7 @@ static int32_t getAllTableList(SMeta* pMeta, uint64_t uid, SArray* list) {
break
;
break
;
}
}
STableKeyInfo
info
=
{.
pTable
=
NULL
,
.
lastKey
=
TSKEY_INITIAL_VAL
,
uid
=
id
};
STableKeyInfo
info
=
{.
lastKey
=
TSKEY_INITIAL_VAL
,
uid
=
id
};
taosArrayPush
(
list
,
&
info
);
taosArrayPush
(
list
,
&
info
);
}
}
...
@@ -2937,7 +2895,7 @@ bool tsdbNextDataBlock(tsdbReadHandleT pHandle) {
...
@@ -2937,7 +2895,7 @@ bool tsdbNextDataBlock(tsdbReadHandleT pHandle) {
STsdbReadHandle
*
pTsdbReadHandle
=
(
STsdbReadHandle
*
)
pHandle
;
STsdbReadHandle
*
pTsdbReadHandle
=
(
STsdbReadHandle
*
)
pHandle
;
if
(
emptyQueryTimewindow
(
pTsdbReadHandle
))
{
if
(
emptyQueryTimewindow
(
pTsdbReadHandle
))
{
tsdbDebug
(
"%p query window not overlaps with the data set, no result returned,
0x%"
PRIx64
,
pTsdbReadHandle
,
pTsdbReadHandle
->
qId
);
tsdbDebug
(
"%p query window not overlaps with the data set, no result returned,
%s"
,
pTsdbReadHandle
,
pTsdbReadHandle
->
idStr
);
return
false
;
return
false
;
}
}
...
@@ -3052,7 +3010,7 @@ bool tsdbNextDataBlock(tsdbReadHandleT pHandle) {
...
@@ -3052,7 +3010,7 @@ bool tsdbNextDataBlock(tsdbReadHandleT pHandle) {
// memcpy(&cond.colList[i], &pColInfoData->info, sizeof(SColumnInfo));
// memcpy(&cond.colList[i], &pColInfoData->info, sizeof(SColumnInfo));
// }
// }
//
//
// pSecQueryHandle = tsdbQueryTablesImpl(pTsdbReadHandle->pTsdb, &cond, pTsdbReadHandle->
qId
, pMemRef);
// pSecQueryHandle = tsdbQueryTablesImpl(pTsdbReadHandle->pTsdb, &cond, pTsdbReadHandle->
idStr
, pMemRef);
// tfree(cond.colList);
// tfree(cond.colList);
//
//
// // current table, only one table
// // current table, only one table
...
@@ -3230,7 +3188,7 @@ STimeWindow updateLastrowForEachGroup(STableGroupInfo *groupList) {
...
@@ -3230,7 +3188,7 @@ STimeWindow updateLastrowForEachGroup(STableGroupInfo *groupList) {
if
(
key
<
lastKey
)
{
if
(
key
<
lastKey
)
{
key
=
lastKey
;
key
=
lastKey
;
keyInfo
.
pTable
=
pInfo
->
pTable
;
//
keyInfo.pTable = pInfo->pTable;
keyInfo
.
lastKey
=
key
;
keyInfo
.
lastKey
=
key
;
pInfo
->
lastKey
=
key
;
pInfo
->
lastKey
=
key
;
...
@@ -3244,29 +3202,19 @@ STimeWindow updateLastrowForEachGroup(STableGroupInfo *groupList) {
...
@@ -3244,29 +3202,19 @@ STimeWindow updateLastrowForEachGroup(STableGroupInfo *groupList) {
}
}
}
}
// clear current group, unref unused table
for
(
int32_t
i
=
0
;
i
<
numOfTables
;
++
i
)
{
STableKeyInfo
*
pInfo
=
(
STableKeyInfo
*
)
taosArrayGet
(
pGroup
,
i
);
// keyInfo.pTable may be NULL here.
if
(
pInfo
->
pTable
!=
keyInfo
.
pTable
)
{
// tsdbUnRefTable(pInfo->pTable);
}
}
// more than one table in each group, only one table left for each group
// more than one table in each group, only one table left for each group
if
(
keyInfo
.
pTable
!=
NULL
)
{
//
if (keyInfo.pTable != NULL) {
totalNumOfTable
++
;
//
totalNumOfTable++;
if
(
taosArrayGetSize
(
pGroup
)
==
1
)
{
//
if (taosArrayGetSize(pGroup) == 1) {
// do nothing
//
// do nothing
}
else
{
//
} else {
taosArrayClear
(
pGroup
);
//
taosArrayClear(pGroup);
taosArrayPush
(
pGroup
,
&
keyInfo
);
//
taosArrayPush(pGroup, &keyInfo);
}
//
}
}
else
{
// mark all the empty groups, and remove it later
//
} else { // mark all the empty groups, and remove it later
taosArrayDestroy
(
pGroup
);
//
taosArrayDestroy(pGroup);
taosArrayPush
(
emptyGroup
,
&
j
);
//
taosArrayPush(emptyGroup, &j);
}
//
}
}
}
// window does not being updated, so set the original
// window does not being updated, so set the original
...
@@ -3456,11 +3404,13 @@ void filterPrepare(void* expr, void* param) {
...
@@ -3456,11 +3404,13 @@ void filterPrepare(void* expr, void* param) {
}
}
}
}
#endif
static
int32_t
tableGroupComparFn
(
const
void
*
p1
,
const
void
*
p2
,
const
void
*
param
)
{
static
int32_t
tableGroupComparFn
(
const
void
*
p1
,
const
void
*
p2
,
const
void
*
param
)
{
#if 0
STableGroupSupporter* pTableGroupSupp = (STableGroupSupporter*) param;
STableGroupSupporter* pTableGroupSupp = (STableGroupSupporter*) param;
STable* pTable1 = ((STableKeyInfo*) p1)->
pTable
;
STable* pTable1 = ((STableKeyInfo*) p1)->
uid
;
STable* pTable2 = ((STableKeyInfo*) p2)->
pTable
;
STable* pTable2 = ((STableKeyInfo*) p2)->
uid
;
for (int32_t i = 0; i < pTableGroupSupp->numOfCols; ++i) {
for (int32_t i = 0; i < pTableGroupSupp->numOfCols; ++i) {
SColIndex* pColIndex = &pTableGroupSupp->pCols[i];
SColIndex* pColIndex = &pTableGroupSupp->pCols[i];
...
@@ -3508,10 +3458,9 @@ static int32_t tableGroupComparFn(const void *p1, const void *p2, const void *pa
...
@@ -3508,10 +3458,9 @@ static int32_t tableGroupComparFn(const void *p1, const void *p2, const void *pa
return ret;
return ret;
}
}
}
}
#endif
return
0
;
return
0
;
}
}
#endif
static
int
tsdbCheckInfoCompar
(
const
void
*
key1
,
const
void
*
key2
)
{
static
int
tsdbCheckInfoCompar
(
const
void
*
key1
,
const
void
*
key2
)
{
if
(((
STableCheckInfo
*
)
key1
)
->
tableId
<
((
STableCheckInfo
*
)
key2
)
->
tableId
)
{
if
(((
STableCheckInfo
*
)
key1
)
->
tableId
<
((
STableCheckInfo
*
)
key2
)
->
tableId
)
{
...
@@ -3527,10 +3476,9 @@ static int tsdbCheckInfoCompar(const void* key1, const void* key2) {
...
@@ -3527,10 +3476,9 @@ static int tsdbCheckInfoCompar(const void* key1, const void* key2) {
void
createTableGroupImpl
(
SArray
*
pGroups
,
SArray
*
pTableList
,
size_t
numOfTables
,
TSKEY
skey
,
void
createTableGroupImpl
(
SArray
*
pGroups
,
SArray
*
pTableList
,
size_t
numOfTables
,
TSKEY
skey
,
STableGroupSupporter
*
pSupp
,
__ext_compar_fn_t
compareFn
)
{
STableGroupSupporter
*
pSupp
,
__ext_compar_fn_t
compareFn
)
{
STable
*
pTable
=
taosArrayGetP
(
pTableList
,
0
);
STable
*
pTable
=
taosArrayGetP
(
pTableList
,
0
);
SArray
*
g
=
taosArrayInit
(
16
,
sizeof
(
STableKeyInfo
));
SArray
*
g
=
taosArrayInit
(
16
,
sizeof
(
STableKeyInfo
));
STableKeyInfo
info
=
{.
pTable
=
pTable
,
.
lastKey
=
skey
};
STableKeyInfo
info
=
{.
lastKey
=
skey
};
taosArrayPush
(
g
,
&
info
);
taosArrayPush
(
g
,
&
info
);
for
(
int32_t
i
=
1
;
i
<
numOfTables
;
++
i
)
{
for
(
int32_t
i
=
1
;
i
<
numOfTables
;
++
i
)
{
...
@@ -3541,13 +3489,13 @@ void createTableGroupImpl(SArray* pGroups, SArray* pTableList, size_t numOfTable
...
@@ -3541,13 +3489,13 @@ void createTableGroupImpl(SArray* pGroups, SArray* pTableList, size_t numOfTable
assert
(
ret
==
0
||
ret
==
-
1
);
assert
(
ret
==
0
||
ret
==
-
1
);
if
(
ret
==
0
)
{
if
(
ret
==
0
)
{
STableKeyInfo
info1
=
{.
pTable
=
*
p
,
.
lastKey
=
skey
};
STableKeyInfo
info1
=
{.
lastKey
=
skey
};
taosArrayPush
(
g
,
&
info1
);
taosArrayPush
(
g
,
&
info1
);
}
else
{
}
else
{
taosArrayPush
(
pGroups
,
&
g
);
// current group is ended, start a new group
taosArrayPush
(
pGroups
,
&
g
);
// current group is ended, start a new group
g
=
taosArrayInit
(
16
,
sizeof
(
STableKeyInfo
));
g
=
taosArrayInit
(
16
,
sizeof
(
STableKeyInfo
));
STableKeyInfo
info1
=
{.
pTable
=
*
p
,
.
lastKey
=
skey
};
STableKeyInfo
info1
=
{.
lastKey
=
skey
};
taosArrayPush
(
g
,
&
info1
);
taosArrayPush
(
g
,
&
info1
);
}
}
}
}
...
@@ -3580,8 +3528,8 @@ SArray* createTableGroup(SArray* pTableList, SSchemaWrapper* pTagSchema, SColInd
...
@@ -3580,8 +3528,8 @@ SArray* createTableGroup(SArray* pTableList, SSchemaWrapper* pTagSchema, SColInd
sup
.
pTagSchema
=
pTagSchema
->
pSchema
;
sup
.
pTagSchema
=
pTagSchema
->
pSchema
;
sup
.
pCols
=
pCols
;
sup
.
pCols
=
pCols
;
//
taosqsort(pTableList->pData, size, sizeof(STableKeyInfo), &sup, tableGroupComparFn);
taosqsort
(
pTableList
->
pData
,
size
,
sizeof
(
STableKeyInfo
),
&
sup
,
tableGroupComparFn
);
//
createTableGroupImpl(pTableGroup, pTableList, size, skey, &sup, tableGroupComparFn);
createTableGroupImpl
(
pTableGroup
,
pTableList
,
size
,
skey
,
&
sup
,
tableGroupComparFn
);
}
}
return
pTableGroup
;
return
pTableGroup
;
...
@@ -3689,16 +3637,16 @@ SArray* createTableGroup(SArray* pTableList, SSchemaWrapper* pTagSchema, SColInd
...
@@ -3689,16 +3637,16 @@ SArray* createTableGroup(SArray* pTableList, SSchemaWrapper* pTagSchema, SColInd
int32_t
tsdbQuerySTableByTagCond
(
STsdb
*
tsdb
,
uint64_t
uid
,
TSKEY
skey
,
const
char
*
pTagCond
,
size_t
len
,
int32_t
tsdbQuerySTableByTagCond
(
STsdb
*
tsdb
,
uint64_t
uid
,
TSKEY
skey
,
const
char
*
pTagCond
,
size_t
len
,
int16_t
tagNameRelType
,
const
char
*
tbnameCond
,
STableGroupInfo
*
pGroupInfo
,
int16_t
tagNameRelType
,
const
char
*
tbnameCond
,
STableGroupInfo
*
pGroupInfo
,
SColIndex
*
pColIndex
,
int32_t
numOfCols
,
uint64_t
reqId
)
{
SColIndex
*
pColIndex
,
int32_t
numOfCols
,
uint64_t
reqId
,
uint64_t
taskId
)
{
STbCfg
*
pTbCfg
=
metaGetTbInfoByUid
(
tsdb
->
pMeta
,
uid
);
STbCfg
*
pTbCfg
=
metaGetTbInfoByUid
(
tsdb
->
pMeta
,
uid
);
if
(
pTbCfg
==
NULL
)
{
if
(
pTbCfg
==
NULL
)
{
tsdbError
(
"%p failed to get stable, uid:%"
PRIu64
",
reqId:0x%"
PRIx64
,
tsdb
,
ui
d
,
reqId
);
tsdbError
(
"%p failed to get stable, uid:%"
PRIu64
",
TID:0x%"
PRIx64
" QID:0x%"
PRIx64
,
tsdb
,
uid
,
taskI
d
,
reqId
);
terrno
=
TSDB_CODE_TDB_INVALID_TABLE_ID
;
terrno
=
TSDB_CODE_TDB_INVALID_TABLE_ID
;
goto
_error
;
goto
_error
;
}
}
if
(
pTbCfg
->
type
!=
META_SUPER_TABLE
)
{
if
(
pTbCfg
->
type
!=
META_SUPER_TABLE
)
{
tsdbError
(
"%p query normal tag not allowed, uid:%"
PRIu64
",
reId:0x%"
PRIx64
,
tsdb
,
ui
d
,
reqId
);
tsdbError
(
"%p query normal tag not allowed, uid:%"
PRIu64
",
TID:0x%"
PRIx64
" QID:0x%"
PRIx64
,
tsdb
,
uid
,
taskI
d
,
reqId
);
terrno
=
TSDB_CODE_OPS_NOT_SUPPORT
;
//basically, this error is caused by invalid sql issued by client
terrno
=
TSDB_CODE_OPS_NOT_SUPPORT
;
//basically, this error is caused by invalid sql issued by client
goto
_error
;
goto
_error
;
}
}
...
@@ -3717,8 +3665,8 @@ int32_t tsdbQuerySTableByTagCond(STsdb* tsdb, uint64_t uid, TSKEY skey, const ch
...
@@ -3717,8 +3665,8 @@ int32_t tsdbQuerySTableByTagCond(STsdb* tsdb, uint64_t uid, TSKEY skey, const ch
pGroupInfo
->
numOfTables
=
(
uint32_t
)
taosArrayGetSize
(
res
);
pGroupInfo
->
numOfTables
=
(
uint32_t
)
taosArrayGetSize
(
res
);
pGroupInfo
->
pGroupList
=
createTableGroup
(
res
,
pTagSchema
,
pColIndex
,
numOfCols
,
skey
);
pGroupInfo
->
pGroupList
=
createTableGroup
(
res
,
pTagSchema
,
pColIndex
,
numOfCols
,
skey
);
tsdbDebug
(
"%p no table name/tag condition, all tables qualified, numOfTables:%u, group:%zu
"
,
tsdb
,
tsdbDebug
(
"%p no table name/tag condition, all tables qualified, numOfTables:%u, group:%zu
, TID:0x%"
PRIx64
" QID:0x%"
PRIx64
,
tsdb
,
pGroupInfo
->
numOfTables
,
taosArrayGetSize
(
pGroupInfo
->
pGroupList
));
pGroupInfo
->
numOfTables
,
taosArrayGetSize
(
pGroupInfo
->
pGroupList
)
,
taskId
,
reqId
);
taosArrayDestroy
(
res
);
taosArrayDestroy
(
res
);
return
ret
;
return
ret
;
...
@@ -3891,7 +3839,7 @@ void tsdbCleanupQueryHandle(tsdbReadHandleT queryHandle) {
...
@@ -3891,7 +3839,7 @@ void tsdbCleanupQueryHandle(tsdbReadHandleT queryHandle) {
tfree
(
pTsdbReadHandle
->
statis
);
tfree
(
pTsdbReadHandle
->
statis
);
if
(
!
emptyQueryTimewindow
(
pTsdbReadHandle
))
{
if
(
!
emptyQueryTimewindow
(
pTsdbReadHandle
))
{
tsdbMayUnTakeMemSnapshot
(
pTsdbReadHandle
);
//
tsdbMayUnTakeMemSnapshot(pTsdbReadHandle);
}
else
{
}
else
{
assert
(
pTsdbReadHandle
->
pTableCheckInfo
==
NULL
);
assert
(
pTsdbReadHandle
->
pTableCheckInfo
==
NULL
);
}
}
...
@@ -3910,8 +3858,8 @@ void tsdbCleanupQueryHandle(tsdbReadHandleT queryHandle) {
...
@@ -3910,8 +3858,8 @@ void tsdbCleanupQueryHandle(tsdbReadHandleT queryHandle) {
SIOCostSummary
*
pCost
=
&
pTsdbReadHandle
->
cost
;
SIOCostSummary
*
pCost
=
&
pTsdbReadHandle
->
cost
;
tsdbDebug
(
"%p :io-cost summary: head-file read cnt:%"
PRIu64
", head-file time:%"
PRIu64
" us, statis-info:%"
PRId64
" us, datablock:%"
PRId64
" us, check data:%"
PRId64
" us,
0x%"
PRIx64
,
tsdbDebug
(
"%p :io-cost summary: head-file read cnt:%"
PRIu64
", head-file time:%"
PRIu64
" us, statis-info:%"
PRId64
" us, datablock:%"
PRId64
" us, check data:%"
PRId64
" us,
%s"
,
pTsdbReadHandle
,
pCost
->
headFileLoad
,
pCost
->
headFileLoadTime
,
pCost
->
statisInfoLoadTime
,
pCost
->
blockLoadTime
,
pCost
->
checkForNextTime
,
pTsdbReadHandle
->
qId
);
pTsdbReadHandle
,
pCost
->
headFileLoad
,
pCost
->
headFileLoadTime
,
pCost
->
statisInfoLoadTime
,
pCost
->
blockLoadTime
,
pCost
->
checkForNextTime
,
pTsdbReadHandle
->
idStr
);
tfree
(
pTsdbReadHandle
);
tfree
(
pTsdbReadHandle
);
}
}
...
...
source/dnode/vnode/src/vnd/vnodeMgr.c
浏览文件 @
9db65e7a
...
@@ -26,6 +26,7 @@ int vnodeInit(const SVnodeOpt *pOption) {
...
@@ -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,8 +97,14 @@ int32_t vnodePutReqToVQueryQ(SVnode* pVnode, struct SRpcMsg* pReq) {
...
@@ -96,8 +97,14 @@ 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"
);
SVnodeTask
*
pTask
;
SVnodeTask
*
pTask
;
for
(;;)
{
for
(;;)
{
pthread_mutex_lock
(
&
(
vnodeMgr
.
mutex
));
pthread_mutex_lock
(
&
(
vnodeMgr
.
mutex
));
...
...
source/dnode/vnode/src/vnd/vnodeQuery.c
浏览文件 @
9db65e7a
...
@@ -17,14 +17,14 @@
...
@@ -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
vnodeProcessQuery
Req
(
SVnode
*
pVnode
,
SRpcMsg
*
pMsg
,
SRpcMsg
**
pRsp
)
{
int
vnodeProcessQuery
Msg
(
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) {
...
@@ -38,11 +38,13 @@ int vnodeProcessQueryReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
}
}
}
}
int
vnodeProcessFetch
Req
(
SVnode
*
pVnode
,
SRpcMsg
*
pMsg
,
SRpcMsg
**
pRsp
)
{
int
vnodeProcessFetch
Msg
(
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,24 +59,24 @@ int vnodeProcessFetchReq(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
...
@@ -57,24 +59,24 @@ 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
;
tb_uid_t
uid
;
tb_uid_t
uid
;
int32_t
nCols
;
int32_t
nCols
;
int32_t
nTagCols
;
int32_t
nTagCols
;
SSchemaWrapper
*
pSW
;
SSchemaWrapper
*
pSW
=
NULL
;
STableMetaRsp
*
pTbMetaMsg
=
NULL
;
STableMetaRsp
*
pTbMetaMsg
=
NULL
;
SSchema
*
pTagSchema
;
SSchema
*
pTagSchema
;
SRpcMsg
rpcMsg
;
SRpcMsg
rpcMsg
;
int
msgLen
=
0
;
int
msgLen
=
0
;
...
@@ -145,15 +147,22 @@ static int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
...
@@ -145,15 +147,22 @@ static int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
_exit:
_exit:
free
(
pSW
->
pSchema
);
if
(
pSW
!=
NULL
)
{
free
(
pSW
);
tfree
(
pSW
->
pSchema
);
free
(
pTbCfg
->
name
);
tfree
(
pSW
);
free
(
pTbCfg
);
if
(
pTbCfg
->
type
==
META_SUPER_TABLE
)
{
free
(
pTbCfg
->
stbCfg
.
pTagSchema
);
}
else
if
(
pTbCfg
->
type
==
META_SUPER_TABLE
)
{
kvRowFree
(
pTbCfg
->
ctbCfg
.
pTag
);
}
}
if
(
pTbCfg
)
{
tfree
(
pTbCfg
->
name
);
if
(
pTbCfg
->
type
==
META_SUPER_TABLE
)
{
free
(
pTbCfg
->
stbCfg
.
pTagSchema
);
}
else
if
(
pTbCfg
->
type
==
META_SUPER_TABLE
)
{
kvRowFree
(
pTbCfg
->
ctbCfg
.
pTag
);
}
tfree
(
pTbCfg
);
}
rpcMsg
.
handle
=
pMsg
->
handle
;
rpcMsg
.
handle
=
pMsg
->
handle
;
rpcMsg
.
ahandle
=
pMsg
->
ahandle
;
rpcMsg
.
ahandle
=
pMsg
->
ahandle
;
rpcMsg
.
pCont
=
pTbMetaMsg
;
rpcMsg
.
pCont
=
pTbMetaMsg
;
...
...
source/dnode/vnode/src/vnd/vnodeWrite.c
浏览文件 @
9db65e7a
...
@@ -115,7 +115,7 @@ int vnodeApplyWMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
...
@@ -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
;
...
...
source/libs/executor/inc/executil.h
浏览文件 @
9db65e7a
...
@@ -38,7 +38,7 @@
...
@@ -38,7 +38,7 @@
#define GET_RES_WINDOW_KEY_LEN(_l) ((_l) + sizeof(uint64_t))
#define GET_RES_WINDOW_KEY_LEN(_l) ((_l) + sizeof(uint64_t))
#define GET_RES_EXT_WINDOW_KEY_LEN(_l) ((_l) + sizeof(uint64_t) + POINTER_BYTES)
#define GET_RES_EXT_WINDOW_KEY_LEN(_l) ((_l) + sizeof(uint64_t) + POINTER_BYTES)
#define GET_TASKID(_t) (((SExecTaskInfo*)(_t))->id.
queryId
)
#define GET_TASKID(_t) (((SExecTaskInfo*)(_t))->id.
str
)
#define curTimeWindowIndex(_winres) ((_winres)->curIndex)
#define curTimeWindowIndex(_winres) ((_winres)->curIndex)
...
...
source/libs/executor/inc/executorimpl.h
浏览文件 @
9db65e7a
...
@@ -239,7 +239,7 @@ typedef struct STaskIdInfo {
...
@@ -239,7 +239,7 @@ typedef struct STaskIdInfo {
uint64_t
queryId
;
// this is also a request id
uint64_t
queryId
;
// this is also a request id
uint64_t
subplanId
;
uint64_t
subplanId
;
uint64_t
templateId
;
uint64_t
templateId
;
uint64_t
taskId
;
// this is a subplan id
char
*
str
;
}
STaskIdInfo
;
}
STaskIdInfo
;
typedef
struct
SExecTaskInfo
{
typedef
struct
SExecTaskInfo
{
...
@@ -250,9 +250,8 @@ typedef struct SExecTaskInfo {
...
@@ -250,9 +250,8 @@ typedef struct SExecTaskInfo {
STaskCostInfo
cost
;
STaskCostInfo
cost
;
int64_t
owner
;
// if it is in execution
int64_t
owner
;
// if it is in execution
int32_t
code
;
int32_t
code
;
uint64_t
totalRows
;
// total number of rows
STableGroupInfo
tableqinfoGroupInfo
;
// this is a group array list, including SArray<STableQueryInfo*> structure
STableGroupInfo
tableqinfoGroupInfo
;
// this is a group array list, including SArray<STableQueryInfo*> structure
pthread_mutex_t
lock
;
// used to synchronize the rsp/query threads
char
*
sql
;
// query sql string
char
*
sql
;
// query sql string
jmp_buf
env
;
//
jmp_buf
env
;
//
struct
SOperatorInfo
*
pRoot
;
struct
SOperatorInfo
*
pRoot
;
...
@@ -378,8 +377,10 @@ typedef struct SExchangeInfo {
...
@@ -378,8 +377,10 @@ typedef struct SExchangeInfo {
SSDataBlock
*
pResult
;
SSDataBlock
*
pResult
;
int32_t
current
;
int32_t
current
;
uint64_t
rowsOfCurrentSource
;
uint64_t
rowsOfCurrentSource
;
uint64_t
bytes
;
// total load bytes from remote
uint64_t
totalRows
;
uint64_t
totalSize
;
// total load bytes from remote
uint64_t
totalRows
;
// total number of rows
uint64_t
totalElapsed
;
// total elapsed time
}
SExchangeInfo
;
}
SExchangeInfo
;
typedef
struct
STableScanInfo
{
typedef
struct
STableScanInfo
{
...
@@ -622,8 +623,6 @@ int32_t createIndirectQueryFuncExprFromMsg(SQueryTableReq *pQueryMsg, int32_t nu
...
@@ -622,8 +623,6 @@ int32_t createIndirectQueryFuncExprFromMsg(SQueryTableReq *pQueryMsg, int32_t nu
int32_t
createQueryFilter
(
char
*
data
,
uint16_t
len
,
SFilterInfo
**
pFilters
);
int32_t
createQueryFilter
(
char
*
data
,
uint16_t
len
,
SFilterInfo
**
pFilters
);
SGroupbyExpr
*
createGroupbyExprFromMsg
(
SQueryTableReq
*
pQueryMsg
,
SColIndex
*
pColIndex
,
int32_t
*
code
);
SGroupbyExpr
*
createGroupbyExprFromMsg
(
SQueryTableReq
*
pQueryMsg
,
SColIndex
*
pColIndex
,
int32_t
*
code
);
SQInfo
*
createQInfoImpl
(
SQueryTableReq
*
pQueryMsg
,
SGroupbyExpr
*
pGroupbyExpr
,
SExprInfo
*
pExprs
,
SExprInfo
*
pSecExprs
,
STableGroupInfo
*
pTableGroupInfo
,
SColumnInfo
*
pTagCols
,
SFilterInfo
*
pFilters
,
int32_t
vgId
,
char
*
sql
,
uint64_t
qId
,
struct
SUdfInfo
*
pUdfInfo
);
int32_t
initQInfo
(
STsBufInfo
*
pTsBufInfo
,
void
*
tsdb
,
void
*
sourceOptr
,
SQInfo
*
pQInfo
,
STaskParam
*
param
,
char
*
start
,
int32_t
initQInfo
(
STsBufInfo
*
pTsBufInfo
,
void
*
tsdb
,
void
*
sourceOptr
,
SQInfo
*
pQInfo
,
STaskParam
*
param
,
char
*
start
,
int32_t
prevResultLen
,
void
*
merger
);
int32_t
prevResultLen
,
void
*
merger
);
...
@@ -639,32 +638,29 @@ int32_t buildArithmeticExprFromMsg(SExprInfo *pArithExprInfo, void *pQueryMsg);
...
@@ -639,32 +638,29 @@ int32_t buildArithmeticExprFromMsg(SExprInfo *pArithExprInfo, void *pQueryMsg);
bool
isTaskKilled
(
SExecTaskInfo
*
pTaskInfo
);
bool
isTaskKilled
(
SExecTaskInfo
*
pTaskInfo
);
int32_t
checkForQueryBuf
(
size_t
numOfTables
);
int32_t
checkForQueryBuf
(
size_t
numOfTables
);
bool
checkNeedToCompressQueryCol
(
SQInfo
*
pQInfo
);
bool
checkNeedToCompressQueryCol
(
SQInfo
*
pQInfo
);
bool
doBuildResCheck
(
SQInfo
*
pQInfo
);
void
setQueryStatus
(
STaskRuntimeEnv
*
pRuntimeEnv
,
int8_t
status
);
void
setQueryStatus
(
STaskRuntimeEnv
*
pRuntimeEnv
,
int8_t
status
);
bool
onlyQueryTags
(
STaskAttr
*
pQueryAttr
);
bool
onlyQueryTags
(
STaskAttr
*
pQueryAttr
);
//void destroyUdfInfo(struct SUdfInfo* pUdfInfo);
//void destroyUdfInfo(struct SUdfInfo* pUdfInfo);
bool
isValidQInfo
(
void
*
param
);
int32_t
doDumpQueryResult
(
SQInfo
*
pQInfo
,
char
*
data
,
int8_t
compressed
,
int32_t
*
compLen
);
int32_t
doDumpQueryResult
(
SQInfo
*
pQInfo
,
char
*
data
,
int8_t
compressed
,
int32_t
*
compLen
);
size_t
getResultSize
(
SQInfo
*
pQInfo
,
int64_t
*
numOfRows
);
size_t
getResultSize
(
SQInfo
*
pQInfo
,
int64_t
*
numOfRows
);
void
set
QueryKilled
(
SQInfo
*
pQ
Info
);
void
set
TaskKilled
(
SExecTaskInfo
*
pTask
Info
);
void
publishOperatorProfEvent
(
SOperatorInfo
*
operatorInfo
,
EQueryProfEventType
eventType
);
void
publishOperatorProfEvent
(
SOperatorInfo
*
operatorInfo
,
EQueryProfEventType
eventType
);
void
publishQueryAbortEvent
(
SExecTaskInfo
*
pTaskInfo
,
int32_t
code
);
void
publishQueryAbortEvent
(
SExecTaskInfo
*
pTaskInfo
,
int32_t
code
);
void
calculateOperatorProfResults
(
SQInfo
*
pQInfo
);
void
calculateOperatorProfResults
(
SQInfo
*
pQInfo
);
void
queryCostStatis
(
S
QInfo
*
pQ
Info
);
void
queryCostStatis
(
S
ExecTaskInfo
*
pTask
Info
);
void
doDestroyTask
(
S
QInfo
*
pQ
Info
);
void
doDestroyTask
(
S
ExecTaskInfo
*
pTask
Info
);
void
freeQueryAttr
(
STaskAttr
*
pQuery
);
void
freeQueryAttr
(
STaskAttr
*
pQuery
);
int32_t
getMaximumIdleDurationSec
();
int32_t
getMaximumIdleDurationSec
();
void
doInvokeUdf
(
struct
SUdfInfo
*
pUdfInfo
,
SQLFunctionCtx
*
pCtx
,
int32_t
idx
,
int32_t
type
);
void
doInvokeUdf
(
struct
SUdfInfo
*
pUdfInfo
,
SQLFunctionCtx
*
pCtx
,
int32_t
idx
,
int32_t
type
);
void
setTaskStatus
(
SExecTaskInfo
*
pTaskInfo
,
int8_t
status
);
void
setTaskStatus
(
SExecTaskInfo
*
pTaskInfo
,
int8_t
status
);
int32_t
createExecTaskInfoImpl
(
SSubplan
*
pPlan
,
SExecTaskInfo
**
pTaskInfo
,
void
*
readerHandle
);
int32_t
createExecTaskInfoImpl
(
SSubplan
*
pPlan
,
SExecTaskInfo
**
pTaskInfo
,
void
*
readerHandle
,
uint64_t
taskId
);
#endif // TDENGINE_EXECUTORIMPL_H
#endif // TDENGINE_EXECUTORIMPL_H
source/libs/executor/src/dataDispatcher.c
浏览文件 @
9db65e7a
...
@@ -121,11 +121,19 @@ static void toDataCacheEntry(const SDataDispatchHandle* pHandle, const SInputDat
...
@@ -121,11 +121,19 @@ static void toDataCacheEntry(const SDataDispatchHandle* pHandle, const SInputDat
}
}
static
bool
allocBuf
(
SDataDispatchHandle
*
pDispatcher
,
const
SInputData
*
pInput
,
SDataDispatchBuf
*
pBuf
)
{
static
bool
allocBuf
(
SDataDispatchHandle
*
pDispatcher
,
const
SInputData
*
pInput
,
SDataDispatchBuf
*
pBuf
)
{
if
(
taosQueueSize
(
pDispatcher
->
pDataBlocks
)
>=
pDispatcher
->
pManager
->
cfg
.
maxDataBlockNumPerQuery
)
{
uint32_t
capacity
=
pDispatcher
->
pManager
->
cfg
.
maxDataBlockNumPerQuery
;
if
(
taosQueueSize
(
pDispatcher
->
pDataBlocks
)
>
capacity
)
{
qError
(
"SinkNode queue is full, no capacity, max:%d, current:%d, no capacity"
,
capacity
,
taosQueueSize
(
pDispatcher
->
pDataBlocks
));
return
false
;
return
false
;
}
}
pBuf
->
allocSize
=
DATA_META_LENGTH
(
pInput
->
pTableRetrieveTsMap
)
+
pDispatcher
->
schema
.
resultRowSize
*
pInput
->
pData
->
info
.
rows
;
pBuf
->
allocSize
=
DATA_META_LENGTH
(
pInput
->
pTableRetrieveTsMap
)
+
pDispatcher
->
schema
.
resultRowSize
*
pInput
->
pData
->
info
.
rows
;
pBuf
->
pData
=
malloc
(
pBuf
->
allocSize
);
pBuf
->
pData
=
malloc
(
pBuf
->
allocSize
);
if
(
pBuf
->
pData
==
NULL
)
{
qError
(
"SinkNode failed to malloc memory, size:%d, code:%d"
,
pBuf
->
allocSize
,
TAOS_SYSTEM_ERROR
(
errno
));
}
return
NULL
!=
pBuf
->
pData
;
return
NULL
!=
pBuf
->
pData
;
}
}
...
...
source/libs/executor/src/executor.c
浏览文件 @
9db65e7a
...
@@ -18,20 +18,20 @@
...
@@ -18,20 +18,20 @@
#include "executorimpl.h"
#include "executorimpl.h"
#include "planner.h"
#include "planner.h"
static
int32_t
doSetStreamBlock
(
SOperatorInfo
*
pOperator
,
void
*
input
,
uint64_t
reqI
d
)
{
static
int32_t
doSetStreamBlock
(
SOperatorInfo
*
pOperator
,
void
*
input
,
char
*
i
d
)
{
ASSERT
(
pOperator
!=
NULL
);
ASSERT
(
pOperator
!=
NULL
);
if
(
pOperator
->
operatorType
!=
OP_StreamScan
)
{
if
(
pOperator
->
operatorType
!=
OP_StreamScan
)
{
if
(
pOperator
->
numOfDownstream
==
0
)
{
if
(
pOperator
->
numOfDownstream
==
0
)
{
qError
(
"failed to find stream scan operator to set the input data block,
reqId:0x%"
PRIx64
,
reqI
d
);
qError
(
"failed to find stream scan operator to set the input data block,
%s"
PRIx64
,
i
d
);
return
TSDB_CODE_QRY_APP_ERROR
;
return
TSDB_CODE_QRY_APP_ERROR
;
}
}
if
(
pOperator
->
numOfDownstream
>
1
)
{
// not handle this in join query
if
(
pOperator
->
numOfDownstream
>
1
)
{
// not handle this in join query
qError
(
"join not supported for stream block scan,
reqId:0x%"
PRIx64
,
reqI
d
);
qError
(
"join not supported for stream block scan,
%s"
PRIx64
,
i
d
);
return
TSDB_CODE_QRY_APP_ERROR
;
return
TSDB_CODE_QRY_APP_ERROR
;
}
}
return
doSetStreamBlock
(
pOperator
->
pDownstream
[
0
],
input
,
reqI
d
);
return
doSetStreamBlock
(
pOperator
->
pDownstream
[
0
],
input
,
i
d
);
}
else
{
}
else
{
SStreamBlockScanInfo
*
pInfo
=
pOperator
->
info
;
SStreamBlockScanInfo
*
pInfo
=
pOperator
->
info
;
tqReadHandleSetMsg
(
pInfo
->
readerHandle
,
input
,
0
);
tqReadHandleSetMsg
(
pInfo
->
readerHandle
,
input
,
0
);
...
@@ -52,9 +52,9 @@ int32_t qSetStreamInput(qTaskInfo_t tinfo, void* input) {
...
@@ -52,9 +52,9 @@ int32_t qSetStreamInput(qTaskInfo_t tinfo, void* input) {
int32_t
code
=
doSetStreamBlock
(
pTaskInfo
->
pRoot
,
input
,
GET_TASKID
(
pTaskInfo
));
int32_t
code
=
doSetStreamBlock
(
pTaskInfo
->
pRoot
,
input
,
GET_TASKID
(
pTaskInfo
));
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
qError
(
"
failed to set the stream block data, reqId:0x%"
PRIx64
,
GET_TASKID
(
pTaskInfo
));
qError
(
"
%s failed to set the stream block data"
,
GET_TASKID
(
pTaskInfo
));
}
else
{
}
else
{
qDebug
(
"
set the stream block successfully, reqId:0x%"
PRIx64
,
GET_TASKID
(
pTaskInfo
));
qDebug
(
"
%s set the stream block successfully"
,
GET_TASKID
(
pTaskInfo
));
}
}
return
code
;
return
code
;
...
@@ -81,7 +81,7 @@ qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, void* streamReadHandle) {
...
@@ -81,7 +81,7 @@ qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, void* streamReadHandle) {
}
}
qTaskInfo_t
pTaskInfo
=
NULL
;
qTaskInfo_t
pTaskInfo
=
NULL
;
code
=
qCreateExecTask
(
streamReadHandle
,
0
,
plan
,
&
pTaskInfo
,
NULL
);
code
=
qCreateExecTask
(
streamReadHandle
,
0
,
0
,
plan
,
&
pTaskInfo
,
NULL
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
// TODO: destroy SSubplan & pTaskInfo
// TODO: destroy SSubplan & pTaskInfo
terrno
=
code
;
terrno
=
code
;
...
...
source/libs/executor/src/executorMain.c
浏览文件 @
9db65e7a
...
@@ -69,11 +69,11 @@ void freeParam(STaskParam *param) {
...
@@ -69,11 +69,11 @@ void freeParam(STaskParam *param) {
tfree
(
param
->
prevResult
);
tfree
(
param
->
prevResult
);
}
}
int32_t
qCreateExecTask
(
void
*
readHandle
,
int32_t
vgId
,
SSubplan
*
pSubplan
,
qTaskInfo_t
*
pTaskInfo
,
DataSinkHandle
*
handle
)
{
int32_t
qCreateExecTask
(
void
*
readHandle
,
int32_t
vgId
,
uint64_t
taskId
,
SSubplan
*
pSubplan
,
qTaskInfo_t
*
pTaskInfo
,
DataSinkHandle
*
handle
)
{
assert
(
readHandle
!=
NULL
&&
pSubplan
!=
NULL
);
assert
(
readHandle
!=
NULL
&&
pSubplan
!=
NULL
);
SExecTaskInfo
**
pTask
=
(
SExecTaskInfo
**
)
pTaskInfo
;
SExecTaskInfo
**
pTask
=
(
SExecTaskInfo
**
)
pTaskInfo
;
int32_t
code
=
createExecTaskInfoImpl
(
pSubplan
,
pTask
,
readHandle
);
int32_t
code
=
createExecTaskInfoImpl
(
pSubplan
,
pTask
,
readHandle
,
taskId
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
goto
_error
;
goto
_error
;
}
}
...
@@ -141,16 +141,10 @@ int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t *useconds) {
...
@@ -141,16 +141,10 @@ int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t *useconds) {
SExecTaskInfo
*
pTaskInfo
=
(
SExecTaskInfo
*
)
tinfo
;
SExecTaskInfo
*
pTaskInfo
=
(
SExecTaskInfo
*
)
tinfo
;
int64_t
threadId
=
taosGetSelfPthreadId
();
int64_t
threadId
=
taosGetSelfPthreadId
();
// todo: remove it.
if
(
tinfo
==
NULL
)
{
return
TSDB_CODE_SUCCESS
;
}
*
pRes
=
NULL
;
*
pRes
=
NULL
;
int64_t
curOwner
=
0
;
int64_t
curOwner
=
0
;
if
((
curOwner
=
atomic_val_compare_exchange_64
(
&
pTaskInfo
->
owner
,
0
,
threadId
))
!=
0
)
{
if
((
curOwner
=
atomic_val_compare_exchange_64
(
&
pTaskInfo
->
owner
,
0
,
threadId
))
!=
0
)
{
qError
(
"
QInfo:0x%"
PRIx64
"-%p qhandle
is now executed by thread:%p"
,
GET_TASKID
(
pTaskInfo
),
pTaskInfo
,
qError
(
"
%s-%p execTask
is now executed by thread:%p"
,
GET_TASKID
(
pTaskInfo
),
pTaskInfo
,
(
void
*
)
curOwner
);
(
void
*
)
curOwner
);
pTaskInfo
->
code
=
TSDB_CODE_QRY_IN_EXEC
;
pTaskInfo
->
code
=
TSDB_CODE_QRY_IN_EXEC
;
return
pTaskInfo
->
code
;
return
pTaskInfo
->
code
;
...
@@ -161,7 +155,7 @@ int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t *useconds) {
...
@@ -161,7 +155,7 @@ int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t *useconds) {
}
}
if
(
isTaskKilled
(
pTaskInfo
))
{
if
(
isTaskKilled
(
pTaskInfo
))
{
qDebug
(
"
QInfo:0x%"
PRIx64
" it i
s already killed, abort"
,
GET_TASKID
(
pTaskInfo
));
qDebug
(
"
%
s already killed, abort"
,
GET_TASKID
(
pTaskInfo
));
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
@@ -170,12 +164,12 @@ int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t *useconds) {
...
@@ -170,12 +164,12 @@ int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t *useconds) {
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
publishQueryAbortEvent
(
pTaskInfo
,
ret
);
publishQueryAbortEvent
(
pTaskInfo
,
ret
);
pTaskInfo
->
code
=
ret
;
pTaskInfo
->
code
=
ret
;
qDebug
(
"
QInfo:0x%"
PRIx64
" query
abort due to error/cancel occurs, code:%s"
,
GET_TASKID
(
pTaskInfo
),
qDebug
(
"
%s task
abort due to error/cancel occurs, code:%s"
,
GET_TASKID
(
pTaskInfo
),
tstrerror
(
pTaskInfo
->
code
));
tstrerror
(
pTaskInfo
->
code
));
return
pTaskInfo
->
code
;
return
pTaskInfo
->
code
;
}
}
qDebug
(
"
QInfo:0x%"
PRIx64
" query t
ask is launched"
,
GET_TASKID
(
pTaskInfo
));
qDebug
(
"
%s execT
ask is launched"
,
GET_TASKID
(
pTaskInfo
));
bool
newgroup
=
false
;
bool
newgroup
=
false
;
publishOperatorProfEvent
(
pTaskInfo
->
pRoot
,
QUERY_PROF_BEFORE_OPERATOR_EXEC
);
publishOperatorProfEvent
(
pTaskInfo
->
pRoot
,
QUERY_PROF_BEFORE_OPERATOR_EXEC
);
...
@@ -184,66 +178,25 @@ int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t *useconds) {
...
@@ -184,66 +178,25 @@ int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t *useconds) {
st
=
taosGetTimestampUs
();
st
=
taosGetTimestampUs
();
*
pRes
=
pTaskInfo
->
pRoot
->
exec
(
pTaskInfo
->
pRoot
,
&
newgroup
);
*
pRes
=
pTaskInfo
->
pRoot
->
exec
(
pTaskInfo
->
pRoot
,
&
newgroup
);
pTaskInfo
->
cost
.
elapsedTime
+=
(
taosGetTimestampUs
()
-
st
);
uint64_t
el
=
(
taosGetTimestampUs
()
-
st
);
pTaskInfo
->
cost
.
elapsedTime
+=
el
;
publishOperatorProfEvent
(
pTaskInfo
->
pRoot
,
QUERY_PROF_AFTER_OPERATOR_EXEC
);
publishOperatorProfEvent
(
pTaskInfo
->
pRoot
,
QUERY_PROF_AFTER_OPERATOR_EXEC
);
if
(
NULL
==
*
pRes
)
{
if
(
NULL
==
*
pRes
)
{
*
useconds
=
pTaskInfo
->
cost
.
elapsedTime
;
*
useconds
=
pTaskInfo
->
cost
.
elapsedTime
;
}
}
qDebug
(
"QInfo:0x%"
PRIx64
" query paused, %d rows returned, total:%"
PRId64
" rows, in sinkNode:%d"
,
int32_t
current
=
(
*
pRes
!=
NULL
)
?
(
*
pRes
)
->
info
.
rows
:
0
;
GET_TASKID
(
pTaskInfo
),
0
,
0L
,
0
);
pTaskInfo
->
totalRows
+=
current
;
qDebug
(
"%s task suspended, %d rows returned, total:%"
PRId64
" rows, in sinkNode:%d, elapsed:%.2f ms"
,
GET_TASKID
(
pTaskInfo
),
current
,
pTaskInfo
->
totalRows
,
0
,
el
/
1000
.
0
);
atomic_store_64
(
&
pTaskInfo
->
owner
,
0
);
atomic_store_64
(
&
pTaskInfo
->
owner
,
0
);
return
pTaskInfo
->
code
;
return
pTaskInfo
->
code
;
}
}
int32_t
qRetrieveQueryResultInfo
(
qTaskInfo_t
qinfo
,
bool
*
buildRes
,
void
*
pRspContext
)
{
SQInfo
*
pQInfo
=
(
SQInfo
*
)
qinfo
;
if
(
pQInfo
==
NULL
||
!
isValidQInfo
(
pQInfo
))
{
qError
(
"QInfo invalid qhandle"
);
return
TSDB_CODE_QRY_INVALID_QHANDLE
;
}
*
buildRes
=
false
;
if
(
IS_QUERY_KILLED
(
pQInfo
))
{
qDebug
(
"QInfo:0x%"
PRIx64
" query is killed, code:0x%08x"
,
pQInfo
->
qId
,
pQInfo
->
code
);
return
pQInfo
->
code
;
}
int32_t
code
=
TSDB_CODE_SUCCESS
;
if
(
tsRetrieveBlockingModel
)
{
pQInfo
->
rspContext
=
pRspContext
;
tsem_wait
(
&
pQInfo
->
ready
);
*
buildRes
=
true
;
code
=
pQInfo
->
code
;
}
else
{
STaskRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
STaskAttr
*
pQueryAttr
=
pQInfo
->
runtimeEnv
.
pQueryAttr
;
pthread_mutex_lock
(
&
pQInfo
->
lock
);
assert
(
pQInfo
->
rspContext
==
NULL
);
if
(
pQInfo
->
dataReady
==
QUERY_RESULT_READY
)
{
*
buildRes
=
true
;
qDebug
(
"QInfo:0x%"
PRIx64
" retrieve result info, rowsize:%d, rows:%d, code:%s"
,
pQInfo
->
qId
,
pQueryAttr
->
resultRowSize
,
GET_NUM_OF_RESULTS
(
pRuntimeEnv
),
tstrerror
(
pQInfo
->
code
));
}
else
{
*
buildRes
=
false
;
qDebug
(
"QInfo:0x%"
PRIx64
" retrieve req set query return result after paused"
,
pQInfo
->
qId
);
pQInfo
->
rspContext
=
pRspContext
;
assert
(
pQInfo
->
rspContext
!=
NULL
);
}
code
=
pQInfo
->
code
;
pthread_mutex_unlock
(
&
pQInfo
->
lock
);
}
return
code
;
}
void
*
qGetResultRetrieveMsg
(
qTaskInfo_t
qinfo
)
{
void
*
qGetResultRetrieveMsg
(
qTaskInfo_t
qinfo
)
{
SQInfo
*
pQInfo
=
(
SQInfo
*
)
qinfo
;
SQInfo
*
pQInfo
=
(
SQInfo
*
)
qinfo
;
assert
(
pQInfo
!=
NULL
);
assert
(
pQInfo
!=
NULL
);
...
@@ -252,18 +205,18 @@ void* qGetResultRetrieveMsg(qTaskInfo_t qinfo) {
...
@@ -252,18 +205,18 @@ void* qGetResultRetrieveMsg(qTaskInfo_t qinfo) {
}
}
int32_t
qKillTask
(
qTaskInfo_t
qinfo
)
{
int32_t
qKillTask
(
qTaskInfo_t
qinfo
)
{
S
QInfo
*
pQInfo
=
(
SQ
Info
*
)
qinfo
;
S
ExecTaskInfo
*
pTaskInfo
=
(
SExecTask
Info
*
)
qinfo
;
if
(
p
QInfo
==
NULL
||
!
isValidQInfo
(
pQInfo
)
)
{
if
(
p
TaskInfo
==
NULL
)
{
return
TSDB_CODE_QRY_INVALID_QHANDLE
;
return
TSDB_CODE_QRY_INVALID_QHANDLE
;
}
}
qDebug
(
"
QInfo:0x%"
PRIx64
" query killed"
,
pQInfo
->
qId
);
qDebug
(
"
%s execTask killed"
,
GET_TASKID
(
pTaskInfo
)
);
set
QueryKilled
(
pQ
Info
);
set
TaskKilled
(
pTask
Info
);
// Wait for the query executing thread being stopped/
// Wait for the query executing thread being stopped/
// Once the query is stopped, the owner of qHandle will be cleared immediately.
// Once the query is stopped, the owner of qHandle will be cleared immediately.
while
(
p
Q
Info
->
owner
!=
0
)
{
while
(
p
Task
Info
->
owner
!=
0
)
{
taosMsleep
(
100
);
taosMsleep
(
100
);
}
}
...
@@ -271,14 +224,14 @@ int32_t qKillTask(qTaskInfo_t qinfo) {
...
@@ -271,14 +224,14 @@ int32_t qKillTask(qTaskInfo_t qinfo) {
}
}
int32_t
qAsyncKillTask
(
qTaskInfo_t
qinfo
)
{
int32_t
qAsyncKillTask
(
qTaskInfo_t
qinfo
)
{
S
QInfo
*
pQInfo
=
(
SQ
Info
*
)
qinfo
;
S
ExecTaskInfo
*
pTaskInfo
=
(
SExecTask
Info
*
)
qinfo
;
if
(
p
QInfo
==
NULL
||
!
isValidQInfo
(
pQInfo
)
)
{
if
(
p
TaskInfo
==
NULL
)
{
return
TSDB_CODE_QRY_INVALID_QHANDLE
;
return
TSDB_CODE_QRY_INVALID_QHANDLE
;
}
}
qDebug
(
"
QInfo:0x%"
PRIx64
" query async killed"
,
pQInfo
->
qId
);
qDebug
(
"
%s execTask async killed"
,
GET_TASKID
(
pTaskInfo
)
);
set
QueryKilled
(
pQ
Info
);
set
TaskKilled
(
pTask
Info
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
@@ -293,145 +246,12 @@ int32_t qIsTaskCompleted(qTaskInfo_t qinfo) {
...
@@ -293,145 +246,12 @@ int32_t qIsTaskCompleted(qTaskInfo_t qinfo) {
return
isTaskKilled
(
pTaskInfo
)
||
Q_STATUS_EQUAL
(
pTaskInfo
->
status
,
TASK_OVER
);
return
isTaskKilled
(
pTaskInfo
)
||
Q_STATUS_EQUAL
(
pTaskInfo
->
status
,
TASK_OVER
);
}
}
void
qDestroyTask
(
qTaskInfo_t
qHandle
)
{
void
qDestroyTask
(
qTaskInfo_t
qTaskHandle
)
{
SQInfo
*
pQInfo
=
(
SQInfo
*
)
qHandle
;
SExecTaskInfo
*
pTaskInfo
=
(
SExecTaskInfo
*
)
qTaskHandle
;
if
(
!
isValidQInfo
(
pQInfo
))
{
qDebug
(
"%s execTask completed, numOfRows:%"
PRId64
,
GET_TASKID
(
pTaskInfo
),
pTaskInfo
->
totalRows
);
return
;
}
qDebug
(
"QInfo:0x%"
PRIx64
" query completed"
,
pQInfo
->
qId
);
queryCostStatis
(
pQInfo
);
// print the query cost summary
doDestroyTask
(
pQInfo
);
}
void
*
qOpenTaskMgmt
(
int32_t
vgId
)
{
const
int32_t
refreshHandleInterval
=
30
;
// every 30 seconds, refresh handle pool
char
cacheName
[
128
]
=
{
0
};
sprintf
(
cacheName
,
"qhandle_%d"
,
vgId
);
STaskMgmt
*
pTaskMgmt
=
calloc
(
1
,
sizeof
(
STaskMgmt
));
if
(
pTaskMgmt
==
NULL
)
{
terrno
=
TSDB_CODE_QRY_OUT_OF_MEMORY
;
return
NULL
;
}
pTaskMgmt
->
qinfoPool
=
taosCacheInit
(
TSDB_CACHE_PTR_KEY
,
refreshHandleInterval
,
true
,
freeqinfoFn
,
cacheName
);
pTaskMgmt
->
closed
=
false
;
pTaskMgmt
->
vgId
=
vgId
;
pthread_mutex_init
(
&
pTaskMgmt
->
lock
,
NULL
);
qDebug
(
"vgId:%d, open queryTaskMgmt success"
,
vgId
);
return
pTaskMgmt
;
}
void
qTaskMgmtNotifyClosing
(
void
*
pQMgmt
)
{
if
(
pQMgmt
==
NULL
)
{
return
;
}
STaskMgmt
*
pQueryMgmt
=
pQMgmt
;
qInfo
(
"vgId:%d, set querymgmt closed, wait for all queries cancelled"
,
pQueryMgmt
->
vgId
);
pthread_mutex_lock
(
&
pQueryMgmt
->
lock
);
pQueryMgmt
->
closed
=
true
;
pthread_mutex_unlock
(
&
pQueryMgmt
->
lock
);
taosCacheRefresh
(
pQueryMgmt
->
qinfoPool
,
taskMgmtKillTaskFn
,
NULL
);
}
void
qQueryMgmtReOpen
(
void
*
pQMgmt
)
{
if
(
pQMgmt
==
NULL
)
{
return
;
}
STaskMgmt
*
pQueryMgmt
=
pQMgmt
;
qInfo
(
"vgId:%d, set querymgmt reopen"
,
pQueryMgmt
->
vgId
);
pthread_mutex_lock
(
&
pQueryMgmt
->
lock
);
pQueryMgmt
->
closed
=
false
;
pthread_mutex_unlock
(
&
pQueryMgmt
->
lock
);
}
void
qCleanupTaskMgmt
(
void
*
pQMgmt
)
{
if
(
pQMgmt
==
NULL
)
{
return
;
}
STaskMgmt
*
pQueryMgmt
=
pQMgmt
;
int32_t
vgId
=
pQueryMgmt
->
vgId
;
assert
(
pQueryMgmt
->
closed
);
SCacheObj
*
pqinfoPool
=
pQueryMgmt
->
qinfoPool
;
pQueryMgmt
->
qinfoPool
=
NULL
;
taosCacheCleanup
(
pqinfoPool
);
pthread_mutex_destroy
(
&
pQueryMgmt
->
lock
);
tfree
(
pQueryMgmt
);
qDebug
(
"vgId:%d, queryMgmt cleanup completed"
,
vgId
);
}
void
**
qRegisterTask
(
void
*
pMgmt
,
uint64_t
qId
,
void
*
qInfo
)
{
if
(
pMgmt
==
NULL
)
{
terrno
=
TSDB_CODE_VND_INVALID_VGROUP_ID
;
return
NULL
;
}
STaskMgmt
*
pQueryMgmt
=
pMgmt
;
if
(
pQueryMgmt
->
qinfoPool
==
NULL
)
{
qError
(
"QInfo:0x%"
PRIx64
"-%p failed to add qhandle into qMgmt, since qMgmt is closed"
,
qId
,
(
void
*
)
qInfo
);
terrno
=
TSDB_CODE_VND_INVALID_VGROUP_ID
;
return
NULL
;
}
pthread_mutex_lock
(
&
pQueryMgmt
->
lock
);
if
(
pQueryMgmt
->
closed
)
{
pthread_mutex_unlock
(
&
pQueryMgmt
->
lock
);
qError
(
"QInfo:0x%"
PRIx64
"-%p failed to add qhandle into cache, since qMgmt is colsing"
,
qId
,
(
void
*
)
qInfo
);
terrno
=
TSDB_CODE_VND_INVALID_VGROUP_ID
;
return
NULL
;
}
else
{
void
**
handle
=
taosCachePut
(
pQueryMgmt
->
qinfoPool
,
&
qId
,
sizeof
(
qId
),
&
qInfo
,
sizeof
(
TSDB_CACHE_PTR_TYPE
),
(
getMaximumIdleDurationSec
()
*
1000
));
pthread_mutex_unlock
(
&
pQueryMgmt
->
lock
);
return
handle
;
}
}
void
**
qAcquireTask
(
void
*
pMgmt
,
uint64_t
_key
)
{
STaskMgmt
*
pQueryMgmt
=
pMgmt
;
if
(
pQueryMgmt
->
closed
)
{
terrno
=
TSDB_CODE_VND_INVALID_VGROUP_ID
;
return
NULL
;
}
if
(
pQueryMgmt
->
qinfoPool
==
NULL
)
{
terrno
=
TSDB_CODE_QRY_INVALID_QHANDLE
;
return
NULL
;
}
void
**
handle
=
taosCacheAcquireByKey
(
pQueryMgmt
->
qinfoPool
,
&
_key
,
sizeof
(
_key
));
if
(
handle
==
NULL
||
*
handle
==
NULL
)
{
terrno
=
TSDB_CODE_QRY_INVALID_QHANDLE
;
return
NULL
;
}
else
{
return
handle
;
}
}
void
**
qReleaseTask
(
void
*
pMgmt
,
void
*
pQInfo
,
bool
freeHandle
)
{
STaskMgmt
*
pQueryMgmt
=
pMgmt
;
if
(
pQueryMgmt
->
qinfoPool
==
NULL
)
{
return
NULL
;
}
taosCacheRelease
(
pQueryMgmt
->
qinfoPool
,
pQInfo
,
freeHandle
);
queryCostStatis
(
pTaskInfo
);
// print the query cost summary
return
0
;
doDestroyTask
(
pTaskInfo
)
;
}
}
#if 0
#if 0
...
@@ -445,8 +265,8 @@ int32_t qKillQueryByQId(void* pMgmt, int64_t qId, int32_t waitMs, int32_t waitCo
...
@@ -445,8 +265,8 @@ int32_t qKillQueryByQId(void* pMgmt, int64_t qId, int32_t waitMs, int32_t waitCo
if (pQInfo == NULL || !isValidQInfo(pQInfo)) {
if (pQInfo == NULL || !isValidQInfo(pQInfo)) {
return TSDB_CODE_QRY_INVALID_QHANDLE;
return TSDB_CODE_QRY_INVALID_QHANDLE;
}
}
qWarn("
QId:0x%"PRIx64"
be killed(no memory commit).", pQInfo->qId);
qWarn("
%s
be killed(no memory commit).", pQInfo->qId);
set
Query
Killed(pQInfo);
set
Task
Killed(pQInfo);
// wait query stop
// wait query stop
int32_t loop = 0;
int32_t loop = 0;
...
...
source/libs/executor/src/executorimpl.c
浏览文件 @
9db65e7a
...
@@ -2432,10 +2432,6 @@ static bool needBuildResAfterQueryComplete(SQInfo* pQInfo) {
...
@@ -2432,10 +2432,6 @@ static bool needBuildResAfterQueryComplete(SQInfo* pQInfo) {
}
}
bool
isTaskKilled
(
SExecTaskInfo
*
pTaskInfo
)
{
bool
isTaskKilled
(
SExecTaskInfo
*
pTaskInfo
)
{
if
(
IS_QUERY_KILLED
(
pTaskInfo
))
{
return
true
;
}
// query has been executed more than tsShellActivityTimer, and the retrieve has not arrived
// query has been executed more than tsShellActivityTimer, and the retrieve has not arrived
// abort current query execution.
// abort current query execution.
if
(
pTaskInfo
->
owner
!=
0
&&
((
taosGetTimestampSec
()
-
pTaskInfo
->
cost
.
start
/
1000
)
>
10
*
getMaximumIdleDurationSec
())
if
(
pTaskInfo
->
owner
!=
0
&&
((
taosGetTimestampSec
()
-
pTaskInfo
->
cost
.
start
/
1000
)
>
10
*
getMaximumIdleDurationSec
())
...
@@ -2444,13 +2440,13 @@ bool isTaskKilled(SExecTaskInfo *pTaskInfo) {
...
@@ -2444,13 +2440,13 @@ bool isTaskKilled(SExecTaskInfo *pTaskInfo) {
assert
(
pTaskInfo
->
cost
.
start
!=
0
);
assert
(
pTaskInfo
->
cost
.
start
!=
0
);
// qDebug("QInfo:%" PRIu64 " retrieve not arrive beyond %d ms, abort current query execution, start:%" PRId64
// qDebug("QInfo:%" PRIu64 " retrieve not arrive beyond %d ms, abort current query execution, start:%" PRId64
// ", current:%d", pQInfo->qId, 1, pQInfo->startExecTs, taosGetTimestampSec());
// ", current:%d", pQInfo->qId, 1, pQInfo->startExecTs, taosGetTimestampSec());
return
true
;
//
return true;
}
}
return
false
;
return
false
;
}
}
void
set
QueryKilled
(
SQInfo
*
pQInfo
)
{
pQ
Info
->
code
=
TSDB_CODE_TSC_QUERY_CANCELLED
;}
void
set
TaskKilled
(
SExecTaskInfo
*
pTaskInfo
)
{
pTask
Info
->
code
=
TSDB_CODE_TSC_QUERY_CANCELLED
;}
//static bool isFixedOutputQuery(STaskAttr* pQueryAttr) {
//static bool isFixedOutputQuery(STaskAttr* pQueryAttr) {
// if (QUERY_IS_INTERVAL_QUERY(pQueryAttr)) {
// if (QUERY_IS_INTERVAL_QUERY(pQueryAttr)) {
...
@@ -4420,33 +4416,32 @@ void calculateOperatorProfResults(SQInfo* pQInfo) {
...
@@ -4420,33 +4416,32 @@ void calculateOperatorProfResults(SQInfo* pQInfo) {
taosArrayDestroy
(
opStack
);
taosArrayDestroy
(
opStack
);
}
}
void
queryCostStatis
(
SQInfo
*
pQInfo
)
{
void
queryCostStatis
(
SExecTaskInfo
*
pTaskInfo
)
{
STaskRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
STaskCostInfo
*
pSummary
=
&
pTaskInfo
->
cost
;
STaskCostInfo
*
pSummary
=
&
pQInfo
->
summary
;
uint64_t
hashSize
=
taosHashGetMemSize
(
pQInfo
->
runtimeEnv
.
pResultRowHashTable
);
//
uint64_t hashSize = taosHashGetMemSize(pQInfo->runtimeEnv.pResultRowHashTable);
hashSize
+=
taosHashGetMemSize
(
pRuntimeEnv
->
tableqinfoGroupInfo
.
map
);
//
hashSize += taosHashGetMemSize(pRuntimeEnv->tableqinfoGroupInfo.map);
pSummary
->
hashSize
=
hashSize
;
//
pSummary->hashSize = hashSize;
// add the merge time
// add the merge time
pSummary
->
elapsedTime
+=
pSummary
->
firstStageMergeTime
;
pSummary
->
elapsedTime
+=
pSummary
->
firstStageMergeTime
;
SResultRowPool
*
p
=
pQInfo
->
runtimeEnv
.
pool
;
// SResultRowPool* p = pTaskInfo->pool;
if
(
p
!=
NULL
)
{
// if (p != NULL) {
pSummary
->
winInfoSize
=
getResultRowPoolMemSize
(
p
);
// pSummary->winInfoSize = getResultRowPoolMemSize(p);
pSummary
->
numOfTimeWindows
=
getNumOfAllocatedResultRows
(
p
);
// pSummary->numOfTimeWindows = getNumOfAllocatedResultRows(p);
}
else
{
// } else {
pSummary
->
winInfoSize
=
0
;
// pSummary->winInfoSize = 0;
pSummary
->
numOfTimeWindows
=
0
;
// pSummary->numOfTimeWindows = 0;
}
// }
//
calculateOperatorProfResults
(
pQInfo
);
// calculateOperatorProfResults(pQInfo);
//qDebug("QInfo:0x%"PRIx64" :cost summary: elapsed time:%"PRId64" us, first merge:%"PRId64" us, total blocks:%d, "
// "load block statis:%d, load data block:%d, total rows:%"PRId64 ", check rows:%"PRId64,
// pQInfo->qId, pSummary->elapsedTime, pSummary->firstStageMergeTime, pSummary->totalBlocks, pSummary->loadBlockStatis,
// pSummary->loadBlocks, pSummary->totalRows, pSummary->totalCheckedRows);
qDebug
(
"%s :cost summary: elapsed time:%"
PRId64
" us, first merge:%"
PRId64
" us, total blocks:%d, "
"load block statis:%d, load data block:%d, total rows:%"
PRId64
", check rows:%"
PRId64
,
GET_TASKID
(
pTaskInfo
),
pSummary
->
elapsedTime
,
pSummary
->
firstStageMergeTime
,
pSummary
->
totalBlocks
,
pSummary
->
loadBlockStatis
,
pSummary
->
loadBlocks
,
pSummary
->
totalRows
,
pSummary
->
totalCheckedRows
);
//
//qDebug("QInfo:0x%"PRIx64" :cost summary: winResPool size:%.2f Kb, numOfWin:%"PRId64", tableInfoSize:%.2f Kb, hashTable:%.2f Kb", pQInfo->qId, pSummary->winInfoSize/1024.0,
//qDebug("QInfo:0x%"PRIx64" :cost summary: winResPool size:%.2f Kb, numOfWin:%"PRId64", tableInfoSize:%.2f Kb, hashTable:%.2f Kb", pQInfo->qId, pSummary->winInfoSize/1024.0,
// pSummary->numOfTimeWindows, pSummary->tableInfoSize/1024.0, pSummary->hashSize/1024.0);
// pSummary->numOfTimeWindows, pSummary->tableInfoSize/1024.0, pSummary->hashSize/1024.0);
...
@@ -4995,7 +4990,7 @@ static SSDataBlock* doTableScan(void* param, bool *newgroup) {
...
@@ -4995,7 +4990,7 @@ static SSDataBlock* doTableScan(void* param, bool *newgroup) {
pResultRowInfo
->
curPos
=
0
;
pResultRowInfo
->
curPos
=
0
;
}
}
qDebug
(
"
QInfo:0x%"
PRIx64
"
start to repeat scan data blocks due to query func required, qrange:%"
PRId64
"-%"
PRId64
,
qDebug
(
"
%s
start to repeat scan data blocks due to query func required, qrange:%"
PRId64
"-%"
PRId64
,
GET_TASKID
(
pTaskInfo
),
pTaskInfo
->
window
.
skey
,
pTaskInfo
->
window
.
ekey
);
GET_TASKID
(
pTaskInfo
),
pTaskInfo
->
window
.
skey
,
pTaskInfo
->
window
.
ekey
);
}
}
...
@@ -5006,7 +5001,7 @@ static SSDataBlock* doTableScan(void* param, bool *newgroup) {
...
@@ -5006,7 +5001,7 @@ static SSDataBlock* doTableScan(void* param, bool *newgroup) {
// STsdbQueryCond cond = createTsdbQueryCond(pQueryAttr, &pQueryAttr->window);
// STsdbQueryCond cond = createTsdbQueryCond(pQueryAttr, &pQueryAttr->window);
// tsdbResetQueryHandle(pTableScanInfo->pTsdbReadHandle, &cond);
// tsdbResetQueryHandle(pTableScanInfo->pTsdbReadHandle, &cond);
qDebug
(
"
QInfo:0x%"
PRIx64
"
start to reverse scan data blocks due to query func required, qrange:%"
PRId64
"-%"
PRId64
,
qDebug
(
"
%s
start to reverse scan data blocks due to query func required, qrange:%"
PRId64
"-%"
PRId64
,
GET_TASKID
(
pTaskInfo
),
pTaskInfo
->
window
.
skey
,
pTaskInfo
->
window
.
ekey
);
GET_TASKID
(
pTaskInfo
),
pTaskInfo
->
window
.
skey
,
pTaskInfo
->
window
.
ekey
);
if
(
pResultRowInfo
->
size
>
0
)
{
if
(
pResultRowInfo
->
size
>
0
)
{
...
@@ -5120,7 +5115,7 @@ static void destroySendMsgInfo(SMsgSendInfo* pMsgBody) {
...
@@ -5120,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
);
...
@@ -5151,6 +5146,8 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
...
@@ -5151,6 +5146,8 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
size_t
totalSources
=
taosArrayGetSize
(
pExchangeInfo
->
pSources
);
size_t
totalSources
=
taosArrayGetSize
(
pExchangeInfo
->
pSources
);
if
(
pExchangeInfo
->
current
>=
totalSources
)
{
if
(
pExchangeInfo
->
current
>=
totalSources
)
{
qDebug
(
"%s all %"
PRIzu
" source(s) are exhausted, total rows:%"
PRIu64
" bytes:%"
PRIu64
", elapsed:%.2f ms"
,
GET_TASKID
(
pTaskInfo
),
totalSources
,
pExchangeInfo
->
totalRows
,
pExchangeInfo
->
totalSize
,
pExchangeInfo
->
totalElapsed
/
1000
.
0
);
return
NULL
;
return
NULL
;
}
}
...
@@ -5171,7 +5168,8 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
...
@@ -5171,7 +5168,8 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
epSet
.
port
[
0
]
=
pSource
->
addr
.
epAddr
[
0
].
port
;
epSet
.
port
[
0
]
=
pSource
->
addr
.
epAddr
[
0
].
port
;
tstrncpy
(
epSet
.
fqdn
[
0
],
pSource
->
addr
.
epAddr
[
0
].
fqdn
,
tListLen
(
epSet
.
fqdn
[
0
]));
tstrncpy
(
epSet
.
fqdn
[
0
],
pSource
->
addr
.
epAddr
[
0
].
fqdn
,
tListLen
(
epSet
.
fqdn
[
0
]));
qDebug
(
"QID:0x%"
PRIx64
" build fetch msg and send to vgId:%d, ep:%s, taskId:0x%"
PRIx64
", %d/%"
PRIzu
,
int64_t
startTs
=
taosGetTimestampUs
();
qDebug
(
"%s build fetch msg and send to vgId:%d, ep:%s, taskId:0x%"
PRIx64
", %d/%"
PRIzu
,
GET_TASKID
(
pTaskInfo
),
pSource
->
addr
.
nodeId
,
epSet
.
fqdn
[
0
],
pSource
->
taskId
,
pExchangeInfo
->
current
,
totalSources
);
GET_TASKID
(
pTaskInfo
),
pSource
->
addr
.
nodeId
,
epSet
.
fqdn
[
0
],
pSource
->
taskId
,
pExchangeInfo
->
current
,
totalSources
);
pMsg
->
header
.
vgId
=
htonl
(
pSource
->
addr
.
nodeId
);
pMsg
->
header
.
vgId
=
htonl
(
pSource
->
addr
.
nodeId
);
...
@@ -5182,7 +5180,7 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
...
@@ -5182,7 +5180,7 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
// send the fetch remote task result reques
// send the fetch remote task result reques
pMsgSendInfo
=
calloc
(
1
,
sizeof
(
SMsgSendInfo
));
pMsgSendInfo
=
calloc
(
1
,
sizeof
(
SMsgSendInfo
));
if
(
NULL
==
pMsgSendInfo
)
{
if
(
NULL
==
pMsgSendInfo
)
{
qError
(
"
QID:0x%"
PRIx64
"
prepare message %d failed"
,
GET_TASKID
(
pTaskInfo
),
(
int32_t
)
sizeof
(
SMsgSendInfo
));
qError
(
"
%s
prepare message %d failed"
,
GET_TASKID
(
pTaskInfo
),
(
int32_t
)
sizeof
(
SMsgSendInfo
));
pTaskInfo
->
code
=
TSDB_CODE_QRY_OUT_OF_MEMORY
;
pTaskInfo
->
code
=
TSDB_CODE_QRY_OUT_OF_MEMORY
;
goto
_error
;
goto
_error
;
}
}
...
@@ -5199,7 +5197,7 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
...
@@ -5199,7 +5197,7 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
SRetrieveTableRsp
*
pRsp
=
pExchangeInfo
->
pRsp
;
SRetrieveTableRsp
*
pRsp
=
pExchangeInfo
->
pRsp
;
if
(
pRsp
->
numOfRows
==
0
)
{
if
(
pRsp
->
numOfRows
==
0
)
{
qDebug
(
"
QID:0x%"
PRIx64
"
vgId:%d, taskID:0x%"
PRIx64
" %d of total completed, rowsOfSource:%"
PRIu64
", totalRows:%"
PRIu64
" try next"
,
qDebug
(
"
%s
vgId:%d, taskID:0x%"
PRIx64
" %d of total completed, rowsOfSource:%"
PRIu64
", totalRows:%"
PRIu64
" try next"
,
GET_TASKID
(
pTaskInfo
),
pSource
->
addr
.
nodeId
,
pSource
->
taskId
,
pExchangeInfo
->
current
+
1
,
GET_TASKID
(
pTaskInfo
),
pSource
->
addr
.
nodeId
,
pSource
->
taskId
,
pExchangeInfo
->
current
+
1
,
pExchangeInfo
->
rowsOfCurrentSource
,
pExchangeInfo
->
totalRows
);
pExchangeInfo
->
rowsOfCurrentSource
,
pExchangeInfo
->
totalRows
);
...
@@ -5207,6 +5205,11 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
...
@@ -5207,6 +5205,11 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
pExchangeInfo
->
current
+=
1
;
pExchangeInfo
->
current
+=
1
;
if
(
pExchangeInfo
->
current
>=
totalSources
)
{
if
(
pExchangeInfo
->
current
>=
totalSources
)
{
int64_t
el
=
taosGetTimestampUs
()
-
startTs
;
pExchangeInfo
->
totalElapsed
+=
el
;
qDebug
(
"%s all %"
PRIzu
" sources are exhausted, total rows: %"
PRIu64
" bytes:%"
PRIu64
", elapsed:%.2f ms"
,
GET_TASKID
(
pTaskInfo
),
totalSources
,
pExchangeInfo
->
totalRows
,
pExchangeInfo
->
totalSize
,
pExchangeInfo
->
totalElapsed
/
1000
.
0
);
return
NULL
;
return
NULL
;
}
else
{
}
else
{
continue
;
continue
;
...
@@ -5233,21 +5236,24 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
...
@@ -5233,21 +5236,24 @@ static SSDataBlock* doLoadRemoteData(void* param, bool* newgroup) {
pRes
->
info
.
numOfCols
=
pOperator
->
numOfOutput
;
pRes
->
info
.
numOfCols
=
pOperator
->
numOfOutput
;
pRes
->
info
.
rows
=
pRsp
->
numOfRows
;
pRes
->
info
.
rows
=
pRsp
->
numOfRows
;
int64_t
el
=
taosGetTimestampUs
()
-
startTs
;
pExchangeInfo
->
totalRows
+=
pRsp
->
numOfRows
;
pExchangeInfo
->
totalRows
+=
pRsp
->
numOfRows
;
pExchangeInfo
->
bytes
+=
pRsp
->
compLen
;
pExchangeInfo
->
totalSize
+=
pRsp
->
compLen
;
pExchangeInfo
->
rowsOfCurrentSource
+=
pRsp
->
numOfRows
;
pExchangeInfo
->
rowsOfCurrentSource
+=
pRsp
->
numOfRows
;
pExchangeInfo
->
totalElapsed
+=
el
;
if
(
pRsp
->
completed
==
1
)
{
if
(
pRsp
->
completed
==
1
)
{
qDebug
(
"
QID:0x%"
PRIx64
"
fetch msg rsp from vgId:%d, taskId:0x%"
PRIx64
" numOfRows:%d, rowsOfSource:%"
PRIu64
qDebug
(
"
%s
fetch msg rsp from vgId:%d, taskId:0x%"
PRIx64
" numOfRows:%d, rowsOfSource:%"
PRIu64
", totalRows:%"
PRIu64
", totalBytes:%"
PRIu64
" try next %d/%"
PRIzu
,
", totalRows:%"
PRIu64
", totalBytes:%"
PRIu64
" try next %d/%"
PRIzu
,
GET_TASKID
(
pTaskInfo
),
pSource
->
addr
.
nodeId
,
pSource
->
taskId
,
pRes
->
info
.
rows
,
pExchangeInfo
->
rowsOfCurrentSource
,
pExchangeInfo
->
totalRows
,
pExchangeInfo
->
bytes
,
GET_TASKID
(
pTaskInfo
),
pSource
->
addr
.
nodeId
,
pSource
->
taskId
,
pRes
->
info
.
rows
,
pExchangeInfo
->
rowsOfCurrentSource
,
pExchangeInfo
->
totalRows
,
pExchangeInfo
->
totalSize
,
pExchangeInfo
->
current
+
1
,
totalSources
);
pExchangeInfo
->
current
+
1
,
totalSources
);
pExchangeInfo
->
rowsOfCurrentSource
=
0
;
pExchangeInfo
->
rowsOfCurrentSource
=
0
;
pExchangeInfo
->
current
+=
1
;
pExchangeInfo
->
current
+=
1
;
}
else
{
}
else
{
qDebug
(
"
QID:0x%"
PRIx64
"
fetch msg rsp from vgId:%d, taskId:0x%"
PRIx64
" numOfRows:%d, totalRows:%"
PRIu64
", totalBytes:%"
PRIu64
,
qDebug
(
"
%s
fetch msg rsp from vgId:%d, taskId:0x%"
PRIx64
" numOfRows:%d, totalRows:%"
PRIu64
", totalBytes:%"
PRIu64
,
GET_TASKID
(
pTaskInfo
),
pSource
->
addr
.
nodeId
,
pSource
->
taskId
,
pRes
->
info
.
rows
,
pExchangeInfo
->
totalRows
,
pExchangeInfo
->
bytes
);
GET_TASKID
(
pTaskInfo
),
pSource
->
addr
.
nodeId
,
pSource
->
taskId
,
pRes
->
info
.
rows
,
pExchangeInfo
->
totalRows
,
pExchangeInfo
->
totalSize
);
}
}
return
pExchangeInfo
->
pResult
;
return
pExchangeInfo
->
pResult
;
...
@@ -5290,13 +5296,14 @@ SOperatorInfo* createExchangeOperatorInfo(const SArray* pSources, const SArray*
...
@@ -5290,13 +5296,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
=
"
TSC
"
;
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"
;
...
@@ -5310,7 +5317,7 @@ SOperatorInfo* createExchangeOperatorInfo(const SArray* pSources, const SArray*
...
@@ -5310,7 +5317,7 @@ SOperatorInfo* createExchangeOperatorInfo(const SArray* pSources, const SArray*
return
NULL
;
// todo
return
NULL
;
// todo
}
}
}
}
#endif
return
pOperator
;
return
pOperator
;
}
}
...
@@ -7729,33 +7736,37 @@ static int32_t deserializeColFilterInfo(SColumnFilterInfo* pColFilters, int16_t
...
@@ -7729,33 +7736,37 @@ static int32_t deserializeColFilterInfo(SColumnFilterInfo* pColFilters, int16_t
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
SExecTaskInfo
*
createExecTaskInfo
(
uint64_t
queryId
)
{
static
SExecTaskInfo
*
createExecTaskInfo
(
uint64_t
queryId
,
uint64_t
taskId
)
{
SExecTaskInfo
*
pTaskInfo
=
calloc
(
1
,
sizeof
(
SExecTaskInfo
));
SExecTaskInfo
*
pTaskInfo
=
calloc
(
1
,
sizeof
(
SExecTaskInfo
));
setTaskStatus
(
pTaskInfo
,
TASK_NOT_COMPLETED
);
setTaskStatus
(
pTaskInfo
,
TASK_NOT_COMPLETED
);
pthread_mutex_init
(
&
pTaskInfo
->
lock
,
NULL
);
pTaskInfo
->
cost
.
created
=
taosGetTimestampMs
();
pTaskInfo
->
cost
.
created
=
taosGetTimestampMs
();
pTaskInfo
->
id
.
queryId
=
queryId
;
pTaskInfo
->
id
.
queryId
=
queryId
;
char
*
p
=
calloc
(
1
,
128
);
snprintf
(
p
,
128
,
"TID:0x%"
PRIx64
" QID:0x%"
PRIx64
,
taskId
,
queryId
);
pTaskInfo
->
id
.
str
=
strdup
(
p
);
return
pTaskInfo
;
return
pTaskInfo
;
}
}
static
tsdbReadHandleT
doCreateDataReadHandle
(
STableScanPhyNode
*
pTableScanNode
,
void
*
readerHandle
,
uint64_t
queryId
);
static
tsdbReadHandleT
doCreateDataReadHandle
(
STableScanPhyNode
*
pTableScanNode
,
void
*
readerHandle
,
uint64_t
queryId
,
uint64_t
taskId
);
SOperatorInfo
*
doCreateOperatorTreeNode
(
SPhyNode
*
pPhyNode
,
SExecTaskInfo
*
pTaskInfo
,
void
*
readerHandle
,
uint64_t
queryId
)
{
SOperatorInfo
*
doCreateOperatorTreeNode
(
SPhyNode
*
pPhyNode
,
SExecTaskInfo
*
pTaskInfo
,
void
*
readerHandle
,
uint64_t
queryId
,
uint64_t
taskId
)
{
if
(
pPhyNode
->
pChildren
==
NULL
||
taosArrayGetSize
(
pPhyNode
->
pChildren
)
==
0
)
{
if
(
pPhyNode
->
pChildren
==
NULL
||
taosArrayGetSize
(
pPhyNode
->
pChildren
)
==
0
)
{
if
(
pPhyNode
->
info
.
type
==
OP_TableScan
)
{
if
(
pPhyNode
->
info
.
type
==
OP_TableScan
)
{
SScanPhyNode
*
pScanPhyNode
=
(
SScanPhyNode
*
)
pPhyNode
;
SScanPhyNode
*
pScanPhyNode
=
(
SScanPhyNode
*
)
pPhyNode
;
size_t
numOfCols
=
taosArrayGetSize
(
pPhyNode
->
pTargets
);
size_t
numOfCols
=
taosArrayGetSize
(
pPhyNode
->
pTargets
);
tsdbReadHandleT
tReaderHandle
=
doCreateDataReadHandle
((
STableScanPhyNode
*
)
pPhyNode
,
readerHandle
,
(
uint64_t
)
queryId
);
tsdbReadHandleT
tReaderHandle
=
doCreateDataReadHandle
((
STableScanPhyNode
*
)
pPhyNode
,
readerHandle
,
(
uint64_t
)
queryId
,
taskId
);
return
createTableScanOperatorInfo
(
tReaderHandle
,
pScanPhyNode
->
order
,
numOfCols
,
pScanPhyNode
->
count
,
pTaskInfo
);
return
createTableScanOperatorInfo
(
tReaderHandle
,
pScanPhyNode
->
order
,
numOfCols
,
pScanPhyNode
->
count
,
pTaskInfo
);
}
else
if
(
pPhyNode
->
info
.
type
==
OP_DataBlocksOptScan
)
{
}
else
if
(
pPhyNode
->
info
.
type
==
OP_DataBlocksOptScan
)
{
SScanPhyNode
*
pScanPhyNode
=
(
SScanPhyNode
*
)
pPhyNode
;
SScanPhyNode
*
pScanPhyNode
=
(
SScanPhyNode
*
)
pPhyNode
;
size_t
numOfCols
=
taosArrayGetSize
(
pPhyNode
->
pTargets
);
size_t
numOfCols
=
taosArrayGetSize
(
pPhyNode
->
pTargets
);
tsdbReadHandleT
tReaderHandle
=
doCreateDataReadHandle
((
STableScanPhyNode
*
)
pPhyNode
,
readerHandle
,
(
uint64_t
)
queryId
);
tsdbReadHandleT
tReaderHandle
=
doCreateDataReadHandle
((
STableScanPhyNode
*
)
pPhyNode
,
readerHandle
,
(
uint64_t
)
queryId
,
taskId
);
return
createDataBlocksOptScanInfo
(
tReaderHandle
,
pScanPhyNode
->
order
,
numOfCols
,
pScanPhyNode
->
count
,
pScanPhyNode
->
reverse
,
pTaskInfo
);
return
createDataBlocksOptScanInfo
(
tReaderHandle
,
pScanPhyNode
->
order
,
numOfCols
,
pScanPhyNode
->
count
,
pScanPhyNode
->
reverse
,
pTaskInfo
);
}
else
if
(
pPhyNode
->
info
.
type
==
OP_Exchange
)
{
}
else
if
(
pPhyNode
->
info
.
type
==
OP_Exchange
)
{
...
@@ -7773,13 +7784,13 @@ SOperatorInfo* doCreateOperatorTreeNode(SPhyNode* pPhyNode, SExecTaskInfo* pTask
...
@@ -7773,13 +7784,13 @@ SOperatorInfo* doCreateOperatorTreeNode(SPhyNode* pPhyNode, SExecTaskInfo* pTask
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SPhyNode
*
pChildNode
=
taosArrayGetP
(
pPhyNode
->
pChildren
,
i
);
SPhyNode
*
pChildNode
=
taosArrayGetP
(
pPhyNode
->
pChildren
,
i
);
SOperatorInfo
*
op
=
doCreateOperatorTreeNode
(
pChildNode
,
pTaskInfo
,
readerHandle
,
queryId
);
SOperatorInfo
*
op
=
doCreateOperatorTreeNode
(
pChildNode
,
pTaskInfo
,
readerHandle
,
queryId
,
taskId
);
return
createAggregateOperatorInfo
(
op
,
pPhyNode
->
pTargets
,
pTaskInfo
);
return
createAggregateOperatorInfo
(
op
,
pPhyNode
->
pTargets
,
pTaskInfo
);
}
}
}
}
}
}
static
tsdbReadHandleT
createDataReadHandle
(
STableScanPhyNode
*
pTableScanNode
,
STableGroupInfo
*
pGroupInfo
,
void
*
readerHandle
,
uint64_t
queryId
)
{
static
tsdbReadHandleT
createDataReadHandle
(
STableScanPhyNode
*
pTableScanNode
,
STableGroupInfo
*
pGroupInfo
,
void
*
readerHandle
,
uint64_t
queryId
,
uint64_t
taskId
)
{
STsdbQueryCond
cond
=
{.
loadExternalRows
=
false
};
STsdbQueryCond
cond
=
{.
loadExternalRows
=
false
};
cond
.
order
=
pTableScanNode
->
scan
.
order
;
cond
.
order
=
pTableScanNode
->
scan
.
order
;
...
@@ -7798,10 +7809,10 @@ static tsdbReadHandleT createDataReadHandle(STableScanPhyNode* pTableScanNode, S
...
@@ -7798,10 +7809,10 @@ static tsdbReadHandleT createDataReadHandle(STableScanPhyNode* pTableScanNode, S
cond
.
colList
[
i
].
colId
=
pSchema
->
colId
;
cond
.
colList
[
i
].
colId
=
pSchema
->
colId
;
}
}
return
tsdbQueryTables
(
readerHandle
,
&
cond
,
pGroupInfo
,
queryId
,
NULL
);
return
tsdbQueryTables
(
readerHandle
,
&
cond
,
pGroupInfo
,
queryId
,
taskId
);
}
}
static
tsdbReadHandleT
doCreateDataReadHandle
(
STableScanPhyNode
*
pTableScanNode
,
void
*
readerHandle
,
uint64_t
queryId
)
{
static
tsdbReadHandleT
doCreateDataReadHandle
(
STableScanPhyNode
*
pTableScanNode
,
void
*
readerHandle
,
uint64_t
queryId
,
uint64_t
taskId
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
STableGroupInfo
groupInfo
=
{
0
};
STableGroupInfo
groupInfo
=
{
0
};
...
@@ -7811,7 +7822,7 @@ static tsdbReadHandleT doCreateDataReadHandle(STableScanPhyNode* pTableScanNode,
...
@@ -7811,7 +7822,7 @@ static tsdbReadHandleT doCreateDataReadHandle(STableScanPhyNode* pTableScanNode,
if
(
tableType
==
TSDB_SUPER_TABLE
)
{
if
(
tableType
==
TSDB_SUPER_TABLE
)
{
code
=
code
=
tsdbQuerySTableByTagCond
(
readerHandle
,
uid
,
window
.
skey
,
NULL
,
0
,
0
,
NULL
,
&
groupInfo
,
NULL
,
0
,
queryId
);
tsdbQuerySTableByTagCond
(
readerHandle
,
uid
,
window
.
skey
,
NULL
,
0
,
0
,
NULL
,
&
groupInfo
,
NULL
,
0
,
queryId
,
taskId
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
goto
_error
;
goto
_error
;
}
}
...
@@ -7821,35 +7832,35 @@ static tsdbReadHandleT doCreateDataReadHandle(STableScanPhyNode* pTableScanNode,
...
@@ -7821,35 +7832,35 @@ static tsdbReadHandleT doCreateDataReadHandle(STableScanPhyNode* pTableScanNode,
SArray
*
pa
=
taosArrayInit
(
1
,
sizeof
(
STableKeyInfo
));
SArray
*
pa
=
taosArrayInit
(
1
,
sizeof
(
STableKeyInfo
));
STableKeyInfo
info
=
{.
pTable
=
NULL
,
.
lastKey
=
0
,
.
uid
=
uid
};
STableKeyInfo
info
=
{.
lastKey
=
0
,
.
uid
=
uid
};
taosArrayPush
(
pa
,
&
info
);
taosArrayPush
(
pa
,
&
info
);
taosArrayPush
(
groupInfo
.
pGroupList
,
&
pa
);
taosArrayPush
(
groupInfo
.
pGroupList
,
&
pa
);
}
}
if
(
groupInfo
.
numOfTables
==
0
)
{
if
(
groupInfo
.
numOfTables
==
0
)
{
code
=
0
;
code
=
0
;
qDebug
(
"no table qualified for query,
reqId:0x%"
PRIx64
,
queryId
);
qDebug
(
"no table qualified for query,
TID:0x%"
PRIx64
", QID:0x%"
PRIx64
,
taskId
,
queryId
);
goto
_error
;
goto
_error
;
}
}
return
createDataReadHandle
(
pTableScanNode
,
&
groupInfo
,
readerHandle
,
queryId
);
return
createDataReadHandle
(
pTableScanNode
,
&
groupInfo
,
readerHandle
,
queryId
,
taskId
);
_error:
_error:
terrno
=
code
;
terrno
=
code
;
return
NULL
;
return
NULL
;
}
}
int32_t
createExecTaskInfoImpl
(
SSubplan
*
pPlan
,
SExecTaskInfo
**
pTaskInfo
,
void
*
readerHandle
)
{
int32_t
createExecTaskInfoImpl
(
SSubplan
*
pPlan
,
SExecTaskInfo
**
pTaskInfo
,
void
*
readerHandle
,
uint64_t
taskId
)
{
uint64_t
queryId
=
pPlan
->
id
.
queryId
;
uint64_t
queryId
=
pPlan
->
id
.
queryId
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
*
pTaskInfo
=
createExecTaskInfo
(
queryId
);
*
pTaskInfo
=
createExecTaskInfo
(
queryId
,
taskId
);
if
(
*
pTaskInfo
==
NULL
)
{
if
(
*
pTaskInfo
==
NULL
)
{
code
=
TSDB_CODE_QRY_OUT_OF_MEMORY
;
code
=
TSDB_CODE_QRY_OUT_OF_MEMORY
;
goto
_complete
;
goto
_complete
;
}
}
(
*
pTaskInfo
)
->
pRoot
=
doCreateOperatorTreeNode
(
pPlan
->
pNode
,
*
pTaskInfo
,
readerHandle
,
queryId
);
(
*
pTaskInfo
)
->
pRoot
=
doCreateOperatorTreeNode
(
pPlan
->
pNode
,
*
pTaskInfo
,
readerHandle
,
queryId
,
taskId
);
if
((
*
pTaskInfo
)
->
pRoot
==
NULL
)
{
if
((
*
pTaskInfo
)
->
pRoot
==
NULL
)
{
code
=
TSDB_CODE_QRY_OUT_OF_MEMORY
;
code
=
TSDB_CODE_QRY_OUT_OF_MEMORY
;
goto
_complete
;
goto
_complete
;
...
@@ -8673,229 +8684,6 @@ FORCE_INLINE bool checkQIdEqual(void *qHandle, uint64_t qId) {
...
@@ -8673,229 +8684,6 @@ FORCE_INLINE bool checkQIdEqual(void *qHandle, uint64_t qId) {
return
((
SQInfo
*
)
qHandle
)
->
qId
==
qId
;
return
((
SQInfo
*
)
qHandle
)
->
qId
==
qId
;
}
}
SQInfo
*
createQInfoImpl
(
SQueryTableReq
*
pQueryMsg
,
SGroupbyExpr
*
pGroupbyExpr
,
SExprInfo
*
pExprs
,
SExprInfo
*
pSecExprs
,
STableGroupInfo
*
pTableGroupInfo
,
SColumnInfo
*
pTagCols
,
SFilterInfo
*
pFilters
,
int32_t
vgId
,
char
*
sql
,
uint64_t
qId
,
struct
SUdfInfo
*
pUdfInfo
)
{
int16_t
numOfCols
=
pQueryMsg
->
numOfCols
;
int16_t
numOfOutput
=
pQueryMsg
->
numOfOutput
;
SQInfo
*
pQInfo
=
(
SQInfo
*
)
calloc
(
1
,
sizeof
(
SQInfo
));
if
(
pQInfo
==
NULL
)
{
goto
_cleanup_qinfo
;
}
pQInfo
->
qId
=
qId
;
pQInfo
->
startExecTs
=
0
;
pQInfo
->
runtimeEnv
.
pUdfInfo
=
pUdfInfo
;
// to make sure third party won't overwrite this structure
pQInfo
->
signature
=
pQInfo
;
STaskAttr
*
pQueryAttr
=
&
pQInfo
->
query
;
pQInfo
->
runtimeEnv
.
pQueryAttr
=
pQueryAttr
;
pQueryAttr
->
tableGroupInfo
=
*
pTableGroupInfo
;
pQueryAttr
->
numOfCols
=
numOfCols
;
pQueryAttr
->
numOfOutput
=
numOfOutput
;
pQueryAttr
->
limit
.
limit
=
pQueryMsg
->
limit
;
pQueryAttr
->
limit
.
offset
=
pQueryMsg
->
offset
;
pQueryAttr
->
order
.
order
=
pQueryMsg
->
order
;
pQueryAttr
->
order
.
col
.
info
.
colId
=
pQueryMsg
->
orderColId
;
pQueryAttr
->
pExpr1
=
pExprs
;
pQueryAttr
->
pExpr2
=
pSecExprs
;
pQueryAttr
->
numOfExpr2
=
pQueryMsg
->
secondStageOutput
;
pQueryAttr
->
pGroupbyExpr
=
pGroupbyExpr
;
memcpy
(
&
pQueryAttr
->
interval
,
&
pQueryMsg
->
interval
,
sizeof
(
pQueryAttr
->
interval
));
pQueryAttr
->
fillType
=
pQueryMsg
->
fillType
;
pQueryAttr
->
numOfTags
=
pQueryMsg
->
numOfTags
;
pQueryAttr
->
tagColList
=
pTagCols
;
pQueryAttr
->
prjInfo
.
vgroupLimit
=
pQueryMsg
->
vgroupLimit
;
pQueryAttr
->
prjInfo
.
ts
=
(
pQueryMsg
->
order
==
TSDB_ORDER_ASC
)
?
INT64_MIN
:
INT64_MAX
;
// pQueryAttr->sw = pQueryMsg->sw;
pQueryAttr
->
vgId
=
vgId
;
pQueryAttr
->
stableQuery
=
pQueryMsg
->
stableQuery
;
pQueryAttr
->
topBotQuery
=
pQueryMsg
->
topBotQuery
;
pQueryAttr
->
groupbyColumn
=
pQueryMsg
->
groupbyColumn
;
pQueryAttr
->
hasTagResults
=
pQueryMsg
->
hasTagResults
;
pQueryAttr
->
timeWindowInterpo
=
pQueryMsg
->
timeWindowInterpo
;
pQueryAttr
->
queryBlockDist
=
pQueryMsg
->
queryBlockDist
;
pQueryAttr
->
stabledev
=
pQueryMsg
->
stabledev
;
pQueryAttr
->
tsCompQuery
=
pQueryMsg
->
tsCompQuery
;
pQueryAttr
->
simpleAgg
=
pQueryMsg
->
simpleAgg
;
pQueryAttr
->
pointInterpQuery
=
pQueryMsg
->
pointInterpQuery
;
pQueryAttr
->
needReverseScan
=
pQueryMsg
->
needReverseScan
;
pQueryAttr
->
stateWindow
=
pQueryMsg
->
stateWindow
;
pQueryAttr
->
vgId
=
vgId
;
// pQueryAttr->pFilters = pFilters;
pQueryAttr
->
tableCols
=
calloc
(
numOfCols
,
sizeof
(
SSingleColumnFilterInfo
));
if
(
pQueryAttr
->
tableCols
==
NULL
)
{
goto
_cleanup
;
}
pQueryAttr
->
srcRowSize
=
0
;
pQueryAttr
->
maxTableColumnWidth
=
0
;
for
(
int16_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
pQueryAttr
->
tableCols
[
i
]
=
pQueryMsg
->
tableCols
[
i
];
// pQueryAttr->tableCols[i].flist.filterInfo = tFilterInfoDup(pQueryMsg->tableCols[i].flist.filterInfo, pQueryAttr->tableCols[i].flist.numOfFilters);
pQueryAttr
->
srcRowSize
+=
pQueryAttr
->
tableCols
[
i
].
bytes
;
if
(
pQueryAttr
->
maxTableColumnWidth
<
pQueryAttr
->
tableCols
[
i
].
bytes
)
{
pQueryAttr
->
maxTableColumnWidth
=
pQueryAttr
->
tableCols
[
i
].
bytes
;
}
}
for
(
int16_t
col
=
0
;
col
<
numOfOutput
;
++
col
)
{
assert
(
pExprs
[
col
].
base
.
resSchema
.
bytes
>
0
);
pQueryAttr
->
resultRowSize
+=
pExprs
[
col
].
base
.
resSchema
.
bytes
;
// keep the tag length
if
(
TSDB_COL_IS_TAG
(
pExprs
[
col
].
base
.
pColumns
->
flag
))
{
pQueryAttr
->
tagLen
+=
pExprs
[
col
].
base
.
resSchema
.
bytes
;
}
// if (pExprs[col].base.flist.filterInfo) {
// ++pQueryAttr->havingNum;
// }
}
doUpdateExprColumnIndex
(
pQueryAttr
);
if
(
pSecExprs
!=
NULL
)
{
int32_t
resultRowSize
=
0
;
// calculate the result row size
for
(
int16_t
col
=
0
;
col
<
pQueryAttr
->
numOfExpr2
;
++
col
)
{
assert
(
pSecExprs
[
col
].
base
.
resSchema
.
bytes
>
0
);
resultRowSize
+=
pSecExprs
[
col
].
base
.
resSchema
.
bytes
;
}
if
(
resultRowSize
>
pQueryAttr
->
resultRowSize
)
{
pQueryAttr
->
resultRowSize
=
resultRowSize
;
}
}
if
(
pQueryAttr
->
fillType
!=
TSDB_FILL_NONE
)
{
pQueryAttr
->
fillVal
=
malloc
(
sizeof
(
int64_t
)
*
pQueryAttr
->
numOfOutput
);
if
(
pQueryAttr
->
fillVal
==
NULL
)
{
goto
_cleanup
;
}
// the first column is the timestamp
memcpy
(
pQueryAttr
->
fillVal
,
(
char
*
)
pQueryMsg
->
fillVal
,
pQueryAttr
->
numOfOutput
*
sizeof
(
int64_t
));
}
size_t
numOfGroups
=
0
;
if
(
pTableGroupInfo
->
pGroupList
!=
NULL
)
{
numOfGroups
=
taosArrayGetSize
(
pTableGroupInfo
->
pGroupList
);
STableGroupInfo
*
pTableqinfo
=
&
pQInfo
->
runtimeEnv
.
tableqinfoGroupInfo
;
pTableqinfo
->
pGroupList
=
taosArrayInit
(
numOfGroups
,
POINTER_BYTES
);
pTableqinfo
->
numOfTables
=
pTableGroupInfo
->
numOfTables
;
pTableqinfo
->
map
=
taosHashInit
(
pTableGroupInfo
->
numOfTables
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_INT
),
true
,
HASH_NO_LOCK
);
}
pQInfo
->
pBuf
=
calloc
(
pTableGroupInfo
->
numOfTables
,
sizeof
(
STableQueryInfo
));
if
(
pQInfo
->
pBuf
==
NULL
)
{
goto
_cleanup
;
}
pQInfo
->
dataReady
=
QUERY_RESULT_NOT_READY
;
pQInfo
->
rspContext
=
NULL
;
pQInfo
->
sql
=
sql
;
pthread_mutex_init
(
&
pQInfo
->
lock
,
NULL
);
tsem_init
(
&
pQInfo
->
ready
,
0
,
0
);
pQueryAttr
->
window
=
pQueryMsg
->
window
;
updateDataCheckOrder
(
pQInfo
,
pQueryMsg
,
pQueryAttr
->
stableQuery
);
STaskRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
STimeWindow
window
=
pQueryAttr
->
window
;
int32_t
index
=
0
;
for
(
int32_t
i
=
0
;
i
<
numOfGroups
;
++
i
)
{
SArray
*
pa
=
taosArrayGetP
(
pQueryAttr
->
tableGroupInfo
.
pGroupList
,
i
);
size_t
s
=
taosArrayGetSize
(
pa
);
SArray
*
p1
=
taosArrayInit
(
s
,
POINTER_BYTES
);
if
(
p1
==
NULL
)
{
goto
_cleanup
;
}
taosArrayPush
(
pRuntimeEnv
->
tableqinfoGroupInfo
.
pGroupList
,
&
p1
);
for
(
int32_t
j
=
0
;
j
<
s
;
++
j
)
{
// STableKeyInfo* info = taosArrayGet(pa, j);
// window.skey = info->lastKey;
//
// void* buf = (char*) pQInfo->pBuf + index * sizeof(STableQueryInfo);
// STableQueryInfo* item = createTableQueryInfo(pQueryAttr, info->pTable, pQueryAttr->groupbyColumn, window, buf);
// if (item == NULL) {
// goto _cleanup;
// }
//
// item->groupIndex = i;
// taosArrayPush(p1, &item);
// STableId* id = TSDB_TABLEID(info->pTable);
// taosHashPut(pRuntimeEnv->tableqinfoGroupInfo.map, &id->tid, sizeof(id->tid), &item, POINTER_BYTES);
// index += 1;
}
}
colIdCheck
(
pQueryAttr
,
pQInfo
->
qId
);
// int32_t functionId = getExprFunctionId(&pExpr[0]);
// pQInfo->query.queryBlockDist = (functionId == FUNCTION_BLKINFO);
//qDebug("qmsg:%p vgId:%d, QInfo:0x%" PRIx64 "-%p created", pQueryMsg, pQInfo->query.vgId, pQInfo->qId, pQInfo);
return
pQInfo
;
_cleanup_qinfo:
// tsdbDestroyTableGroup(pTableGroupInfo);
if
(
pGroupbyExpr
!=
NULL
)
{
taosArrayDestroy
(
pGroupbyExpr
->
columnInfo
);
free
(
pGroupbyExpr
);
}
tfree
(
pTagCols
);
for
(
int32_t
i
=
0
;
i
<
numOfOutput
;
++
i
)
{
SExprInfo
*
pExprInfo
=
&
pExprs
[
i
];
if
(
pExprInfo
->
pExpr
!=
NULL
)
{
tExprTreeDestroy
(
pExprInfo
->
pExpr
,
NULL
);
pExprInfo
->
pExpr
=
NULL
;
}
// if (pExprInfo->base.flist.filterInfo) {
// freeColumnFilterInfo(pExprInfo->base.flist.filterInfo, pExprInfo->base.flist.numOfFilters);
// }
}
tfree
(
pExprs
);
// filterFreeInfo(pFilters);
_cleanup:
doDestroyTask
(
pQInfo
);
return
NULL
;
}
bool
isValidQInfo
(
void
*
param
)
{
SQInfo
*
pQInfo
=
(
SQInfo
*
)
param
;
if
(
pQInfo
==
NULL
)
{
return
false
;
}
/*
* pQInfo->signature may be changed by another thread, so we assign value of signature
* into local variable, then compare by using local variable
*/
uint64_t
sig
=
(
uint64_t
)
pQInfo
->
signature
;
return
(
sig
==
(
uint64_t
)
pQInfo
);
}
int32_t
initQInfo
(
STsBufInfo
*
pTsBufInfo
,
void
*
tsdb
,
void
*
sourceOptr
,
SQInfo
*
pQInfo
,
STaskParam
*
param
,
char
*
start
,
int32_t
initQInfo
(
STsBufInfo
*
pTsBufInfo
,
void
*
tsdb
,
void
*
sourceOptr
,
SQInfo
*
pQInfo
,
STaskParam
*
param
,
char
*
start
,
int32_t
prevResultLen
,
void
*
merger
)
{
int32_t
prevResultLen
,
void
*
merger
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
...
@@ -8957,7 +8745,7 @@ int32_t initQInfo(STsBufInfo* pTsBufInfo, void* tsdb, void* sourceOptr, SQInfo*
...
@@ -8957,7 +8745,7 @@ int32_t initQInfo(STsBufInfo* pTsBufInfo, void* tsdb, void* sourceOptr, SQInfo*
_error:
_error:
// table query ref will be decrease during error handling
// table query ref will be decrease during error handling
doDestroyTask
(
pQInfo
);
//
doDestroyTask(pQInfo);
return
code
;
return
code
;
}
}
...
@@ -9038,113 +8826,16 @@ void* freeColumnInfo(SColumnInfo* pColumnInfo, int32_t numOfCols) {
...
@@ -9038,113 +8826,16 @@ void* freeColumnInfo(SColumnInfo* pColumnInfo, int32_t numOfCols) {
return
NULL
;
return
NULL
;
}
}
void
doDestroyTask
(
SQInfo
*
pQInfo
)
{
void
doDestroyTask
(
SExecTaskInfo
*
pTaskInfo
)
{
if
(
!
isValidQInfo
(
pQInfo
))
{
doDestroyTableQueryInfo
(
&
pTaskInfo
->
tableqinfoGroupInfo
);
return
;
// taosArrayDestroy(pTaskInfo->summary.queryProfEvents);
}
// taosHashCleanup(pTaskInfo->summary.operatorProfResults);
//qDebug("QInfo:0x%"PRIx64" start to free QInfo", pQInfo->qId);
STaskRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
releaseQueryBuf
(
pRuntimeEnv
->
tableqinfoGroupInfo
.
numOfTables
);
doDestroyTableQueryInfo
(
&
pRuntimeEnv
->
tableqinfoGroupInfo
);
teardownQueryRuntimeEnv
(
&
pQInfo
->
runtimeEnv
);
STaskAttr
*
pQueryAttr
=
pQInfo
->
runtimeEnv
.
pQueryAttr
;
freeQueryAttr
(
pQueryAttr
);
// tsdbDestroyTableGroup(&pQueryAttr->tableGroupInfo);
tfree
(
pQInfo
->
pBuf
);
tfree
(
pQInfo
->
sql
);
taosArrayDestroy
(
pQInfo
->
summary
.
queryProfEvents
);
taosHashCleanup
(
pQInfo
->
summary
.
operatorProfResults
);
taosArrayDestroy
(
pRuntimeEnv
->
groupResInfo
.
pRows
);
pQInfo
->
signature
=
0
;
//qDebug("QInfo:0x%"PRIx64" QInfo is freed", pQInfo->qId);
tfree
(
pQInfo
);
}
int32_t
doDumpQueryResult
(
SQInfo
*
pQInfo
,
char
*
data
,
int8_t
compressed
,
int32_t
*
compLen
)
{
// the remained number of retrieved rows, not the interpolated result
STaskRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
STaskAttr
*
pQueryAttr
=
pQInfo
->
runtimeEnv
.
pQueryAttr
;
// load data from file to msg buffer
if
(
pQueryAttr
->
tsCompQuery
)
{
SColumnInfoData
*
pColInfoData
=
taosArrayGet
(
pRuntimeEnv
->
outputBuf
->
pDataBlock
,
0
);
FILE
*
f
=
*
(
FILE
**
)
pColInfoData
->
pData
;
// TODO refactor
// make sure file exist
if
(
f
)
{
off_t
s
=
lseek
(
fileno
(
f
),
0
,
SEEK_END
);
assert
(
s
==
pRuntimeEnv
->
outputBuf
->
info
.
rows
);
//qDebug("QInfo:0x%"PRIx64" ts comp data return, file:%p, size:%"PRId64, pQInfo->qId, f, (uint64_t)s);
if
(
fseek
(
f
,
0
,
SEEK_SET
)
>=
0
)
{
size_t
sz
=
fread
(
data
,
1
,
s
,
f
);
if
(
sz
<
s
)
{
// todo handle error
//qError("fread(f:%p,%d) failed, rsize:%" PRId64 ", expect size:%" PRId64, f, fileno(f), (uint64_t)sz, (uint64_t)s);
assert
(
0
);
}
}
else
{
UNUSED
(
s
);
//qError("fseek(f:%p,%d) failed, error:%s", f, fileno(f), strerror(errno));
assert
(
0
);
}
// dump error info
if
(
s
<=
(
sizeof
(
STSBufFileHeader
)
+
sizeof
(
STSGroupBlockInfo
)
+
6
*
sizeof
(
int32_t
)))
{
// qDump(data, s);
assert
(
0
);
}
fclose
(
f
);
*
(
FILE
**
)
pColInfoData
->
pData
=
NULL
;
}
// all data returned, set query over
if
(
Q_STATUS_EQUAL
(
pRuntimeEnv
->
status
,
TASK_COMPLETED
))
{
// setTaskStatus(pOperator->pTaskInfo, QUERY_OVER);
}
}
else
{
doCopyQueryResultToMsg
(
pQInfo
,
(
int32_t
)
pRuntimeEnv
->
outputBuf
->
info
.
rows
,
data
,
compressed
,
compLen
);
}
//qDebug("QInfo:0x%"PRIx64" current numOfRes rows:%d, total:%" PRId64, pQInfo->qId,
// pRuntimeEnv->outputBuf->info.rows, pRuntimeEnv->resultInfo.total);
if
(
pQueryAttr
->
limit
.
limit
>
0
&&
pQueryAttr
->
limit
.
limit
==
pRuntimeEnv
->
resultInfo
.
total
)
{
//qDebug("QInfo:0x%"PRIx64" results limitation reached, limitation:%"PRId64, pQInfo->qId, pQueryAttr->limit.limit);
// setTaskStatus(pOperator->pTaskInfo, QUERY_OVER);
}
return
TSDB_CODE_SUCCESS
;
}
bool
doBuildResCheck
(
SQInfo
*
pQInfo
)
{
bool
buildRes
=
false
;
pthread_mutex_lock
(
&
pQInfo
->
lock
);
pQInfo
->
dataReady
=
QUERY_RESULT_READY
;
buildRes
=
needBuildResAfterQueryComplete
(
pQInfo
);
// clear qhandle owner, it must be in the secure area. other thread may run ahead before current, after it is
// put into task to be executed.
assert
(
pQInfo
->
owner
==
taosGetSelfPthreadId
());
pQInfo
->
owner
=
0
;
pthread_mutex_unlock
(
&
pQInfo
->
lock
);
tfree
(
pTaskInfo
->
sql
);
tfree
(
pTaskInfo
->
id
.
str
);
qDebug
(
"%s execTask is freed"
,
GET_TASKID
(
pTaskInfo
));
// used in retrieve blocking model.
tfree
(
pTaskInfo
);
tsem_post
(
&
pQInfo
->
ready
);
return
buildRes
;
}
}
static
void
doSetTagValueToResultBuf
(
char
*
output
,
const
char
*
val
,
int16_t
type
,
int16_t
bytes
)
{
static
void
doSetTagValueToResultBuf
(
char
*
output
,
const
char
*
val
,
int16_t
type
,
int16_t
bytes
)
{
...
...
source/libs/executor/test/executorTests.cpp
浏览文件 @
9db65e7a
...
@@ -219,7 +219,7 @@ TEST(testCase, build_executor_tree_Test) {
...
@@ -219,7 +219,7 @@ TEST(testCase, build_executor_tree_Test) {
SExecTaskInfo
*
pTaskInfo
=
nullptr
;
SExecTaskInfo
*
pTaskInfo
=
nullptr
;
DataSinkHandle
sinkHandle
=
nullptr
;
DataSinkHandle
sinkHandle
=
nullptr
;
int32_t
code
=
qCreateExecTask
((
void
*
)
1
,
2
,
NULL
,
(
void
**
)
&
pTaskInfo
,
&
sinkHandle
);
int32_t
code
=
qCreateExecTask
((
void
*
)
1
,
2
,
1
,
NULL
,
(
void
**
)
&
pTaskInfo
,
&
sinkHandle
);
}
}
#pragma GCC diagnostic pop
#pragma GCC diagnostic pop
\ No newline at end of file
source/libs/planner/src/logicPlan.c
浏览文件 @
9db65e7a
...
@@ -413,7 +413,6 @@ static void doDestroyQueryNode(SQueryPlanNode* pQueryNode) {
...
@@ -413,7 +413,6 @@ static void doDestroyQueryNode(SQueryPlanNode* pQueryNode) {
tfree
(
pQueryTableInfo
->
tableName
);
tfree
(
pQueryTableInfo
->
tableName
);
}
}
printf
(
"----------->Free:%p
\n
"
,
pQueryNode
->
pExpr
);
taosArrayDestroy
(
pQueryNode
->
pExpr
);
taosArrayDestroy
(
pQueryNode
->
pExpr
);
tfree
(
pQueryNode
->
pExtInfo
);
tfree
(
pQueryNode
->
pExtInfo
);
...
...
source/libs/planner/src/physicalPlanJson.c
浏览文件 @
9db65e7a
...
@@ -1125,8 +1125,8 @@ int32_t subPlanToString(const SSubplan* subplan, char** str, int32_t* len) {
...
@@ -1125,8 +1125,8 @@ int32_t subPlanToString(const SSubplan* subplan, char** str, int32_t* len) {
*
str
=
cJSON_Print
(
json
);
*
str
=
cJSON_Print
(
json
);
cJSON_Delete
(
json
);
cJSON_Delete
(
json
);
/*printf("====Physical plan:====\n");*/
// printf("====Physical plan:====\n");
/*printf("%s\n", *str);*/
// printf("%s\n", *str);
*
len
=
strlen
(
*
str
)
+
1
;
*
len
=
strlen
(
*
str
)
+
1
;
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
...
source/libs/qworker/inc/qworkerInt.h
浏览文件 @
9db65e7a
...
@@ -137,6 +137,7 @@ typedef struct SQWorkerMgmt {
...
@@ -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
...
@@ -173,17 +174,17 @@ typedef struct SQWorkerMgmt {
...
@@ -173,17 +174,17 @@ typedef struct SQWorkerMgmt {
#define QW_SCH_ELOG(param, ...) qError("QW:%p SID:%"PRIx64" " param, mgmt, sId, __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_SCH_DLOG(param, ...) qDebug("QW:%p SID:%"PRIx64" " param, mgmt, sId, __VA_ARGS__)
#define QW_TASK_ELOG(param, ...) qError("QW:%p QID:0x%"PRIx64",TID:%"PRIx64" " param, mgmt, qId, tId, __VA_ARGS__)
#define QW_TASK_ELOG(param, ...) qError("QW:%p QID:0x%"PRIx64",TID:
0x
%"PRIx64" " param, mgmt, qId, tId, __VA_ARGS__)
#define QW_TASK_WLOG(param, ...) qWarn("QW:%p QID:0x%"PRIx64",TID:%"PRIx64" " param, mgmt, qId, tId, __VA_ARGS__)
#define QW_TASK_WLOG(param, ...) qWarn("QW:%p QID:0x%"PRIx64",TID:
0x
%"PRIx64" " param, mgmt, qId, tId, __VA_ARGS__)
#define QW_TASK_DLOG(param, ...) qDebug("QW:%p QID:0x%"PRIx64",TID:%"PRIx64" " param, mgmt, qId, tId, __VA_ARGS__)
#define QW_TASK_DLOG(param, ...) qDebug("QW:%p QID:0x%"PRIx64",TID:
0x
%"PRIx64" " param, mgmt, qId, tId, __VA_ARGS__)
#define QW_TASK_ELOG_E(param) qError("QW:%p QID:0x%"PRIx64",TID:%"PRIx64" " param, mgmt, qId, tId)
#define QW_TASK_ELOG_E(param) qError("QW:%p QID:0x%"PRIx64",TID:
0x
%"PRIx64" " param, mgmt, qId, tId)
#define QW_TASK_WLOG_E(param) qWarn("QW:%p QID:0x%"PRIx64",TID:%"PRIx64" " param, mgmt, qId, tId)
#define QW_TASK_WLOG_E(param) qWarn("QW:%p QID:0x%"PRIx64",TID:
0x
%"PRIx64" " param, mgmt, qId, tId)
#define QW_TASK_DLOG_E(param) qDebug("QW:%p QID:0x%"PRIx64",TID:%"PRIx64" " param, mgmt, qId, tId)
#define QW_TASK_DLOG_E(param) qDebug("QW:%p QID:0x%"PRIx64",TID:
0x
%"PRIx64" " param, mgmt, qId, tId)
#define QW_SCH_TASK_ELOG(param, ...) qError("QW:%p SID:%"PRIx64",QID:0x%"PRIx64",TID:%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__)
#define QW_SCH_TASK_ELOG(param, ...) qError("QW:%p SID:%"PRIx64",QID:0x%"PRIx64",TID:
0x
%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__)
#define QW_SCH_TASK_WLOG(param, ...) qWarn("QW:%p SID:%"PRIx64",QID:0x%"PRIx64",TID:%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__)
#define QW_SCH_TASK_WLOG(param, ...) qWarn("QW:%p SID:%"PRIx64",QID:0x%"PRIx64",TID:%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__)
#define QW_SCH_TASK_DLOG(param, ...) qDebug("QW:%p SID:%"PRIx64",QID:0x%"PRIx64",TID:%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__)
#define QW_SCH_TASK_DLOG(param, ...) qDebug("QW:%p SID:%"PRIx64",QID:0x%"PRIx64",TID:
0x
%"PRIx64" " param, mgmt, sId, qId, tId, __VA_ARGS__)
#define QW_LOCK_DEBUG(...) do { if (gQWDebug.lockDebug) { qDebug(__VA_ARGS__); } } while (0)
#define QW_LOCK_DEBUG(...) do { if (gQWDebug.lockDebug) { qDebug(__VA_ARGS__); } } while (0)
...
...
source/libs/qworker/inc/qworkerMsg.h
浏览文件 @
9db65e7a
...
@@ -32,7 +32,7 @@ int32_t qwProcessDrop(SQWorkerMgmt *mgmt, uint64_t sId, uint64_t qId, uint64_t t
...
@@ -32,7 +32,7 @@ int32_t qwProcessDrop(SQWorkerMgmt *mgmt, uint64_t sId, uint64_t qId, uint64_t t
int32_t
qwBuildAndSendDropRsp
(
void
*
connection
,
int32_t
code
);
int32_t
qwBuildAndSendDropRsp
(
void
*
connection
,
int32_t
code
);
int32_t
qwBuildAndSendCancelRsp
(
SRpcMsg
*
pMsg
,
int32_t
code
);
int32_t
qwBuildAndSendCancelRsp
(
SRpcMsg
*
pMsg
,
int32_t
code
);
int32_t
qwBuildAndSendFetchRsp
(
void
*
connection
,
SRetrieveTableRsp
*
pRsp
,
int32_t
dataLength
,
int32_t
code
);
int32_t
qwBuildAndSendFetchRsp
(
void
*
connection
,
SRetrieveTableRsp
*
pRsp
,
int32_t
dataLength
,
int32_t
code
);
void
qwBuildFetchRsp
(
void
*
msg
,
SOutputData
*
input
,
int32_t
len
);
void
qwBuildFetchRsp
(
void
*
msg
,
SOutputData
*
input
,
int32_t
len
,
bool
qComplete
);
int32_t
qwBuildAndSendCQueryMsg
(
SQWorkerMgmt
*
mgmt
,
uint64_t
sId
,
uint64_t
qId
,
uint64_t
tId
,
void
*
connection
);
int32_t
qwBuildAndSendCQueryMsg
(
SQWorkerMgmt
*
mgmt
,
uint64_t
sId
,
uint64_t
qId
,
uint64_t
tId
,
void
*
connection
);
int32_t
qwBuildAndSendSchSinkMsg
(
SQWorkerMgmt
*
mgmt
,
uint64_t
sId
,
uint64_t
qId
,
uint64_t
tId
,
void
*
connection
);
int32_t
qwBuildAndSendSchSinkMsg
(
SQWorkerMgmt
*
mgmt
,
uint64_t
sId
,
uint64_t
qId
,
uint64_t
tId
,
void
*
connection
);
int32_t
qwBuildAndSendReadyRsp
(
void
*
connection
,
int32_t
code
);
int32_t
qwBuildAndSendReadyRsp
(
void
*
connection
,
int32_t
code
);
...
...
source/libs/qworker/src/qworker.c
浏览文件 @
9db65e7a
...
@@ -456,7 +456,7 @@ _return:
...
@@ -456,7 +456,7 @@ _return:
QW_RET
(
code
);
QW_RET
(
code
);
}
}
int32_t
qwExecTask
(
QW_FPARAMS_DEF
,
SQWTaskCtx
*
ctx
)
{
int32_t
qwExecTask
(
QW_FPARAMS_DEF
,
SQWTaskCtx
*
ctx
,
bool
*
queryEnd
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
bool
qcontinue
=
true
;
bool
qcontinue
=
true
;
SSDataBlock
*
pRes
=
NULL
;
SSDataBlock
*
pRes
=
NULL
;
...
@@ -467,11 +467,11 @@ int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx) {
...
@@ -467,11 +467,11 @@ int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx) {
DataSinkHandle
sinkHandle
=
ctx
->
sinkHandle
;
DataSinkHandle
sinkHandle
=
ctx
->
sinkHandle
;
while
(
true
)
{
while
(
true
)
{
QW_TASK_DLOG
(
"start to execTask
in executor
, loopIdx:%d"
,
i
++
);
QW_TASK_DLOG
(
"start to execTask, loopIdx:%d"
,
i
++
);
code
=
qExecTask
(
*
taskHandle
,
&
pRes
,
&
useconds
);
code
=
qExecTask
(
*
taskHandle
,
&
pRes
,
&
useconds
);
if
(
code
)
{
if
(
code
)
{
QW_TASK_ELOG
(
"qExecTask failed, code:%
x"
,
code
);
QW_TASK_ELOG
(
"qExecTask failed, code:%
s"
,
tstrerror
(
code
)
);
QW_ERR_JRET
(
code
);
QW_ERR_JRET
(
code
);
}
}
...
@@ -485,6 +485,10 @@ int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx) {
...
@@ -485,6 +485,10 @@ int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx) {
if
(
TASK_TYPE_TEMP
==
ctx
->
taskType
)
{
if
(
TASK_TYPE_TEMP
==
ctx
->
taskType
)
{
qwFreeTaskHandle
(
QW_FPARAMS
(),
taskHandle
);
qwFreeTaskHandle
(
QW_FPARAMS
(),
taskHandle
);
}
}
if
(
queryEnd
)
{
*
queryEnd
=
true
;
}
break
;
break
;
}
}
...
@@ -492,7 +496,7 @@ int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx) {
...
@@ -492,7 +496,7 @@ int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx) {
SInputData
inputData
=
{.
pData
=
pRes
,
.
pTableRetrieveTsMap
=
NULL
};
SInputData
inputData
=
{.
pData
=
pRes
,
.
pTableRetrieveTsMap
=
NULL
};
code
=
dsPutDataBlock
(
sinkHandle
,
&
inputData
,
&
qcontinue
);
code
=
dsPutDataBlock
(
sinkHandle
,
&
inputData
,
&
qcontinue
);
if
(
code
)
{
if
(
code
)
{
QW_TASK_ELOG
(
"dsPutDataBlock failed, code:%
x"
,
code
);
QW_TASK_ELOG
(
"dsPutDataBlock failed, code:%
s"
,
tstrerror
(
code
)
);
QW_ERR_JRET
(
code
);
QW_ERR_JRET
(
code
);
}
}
...
@@ -587,12 +591,7 @@ int32_t qwGetResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen, void
...
@@ -587,12 +591,7 @@ int32_t qwGetResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen, void
QW_ERR_RET
(
code
);
QW_ERR_RET
(
code
);
}
}
queryEnd
=
pOutput
->
queryEnd
;
if
(
DS_BUF_EMPTY
==
pOutput
->
bufStatus
&&
pOutput
->
queryEnd
)
{
pOutput
->
queryEnd
=
false
;
if
(
DS_BUF_EMPTY
==
pOutput
->
bufStatus
&&
queryEnd
)
{
pOutput
->
queryEnd
=
true
;
QW_SCH_TASK_DLOG
(
"task all fetched, status:%d"
,
JOB_TASK_STATUS_SUCCEED
);
QW_SCH_TASK_DLOG
(
"task all fetched, status:%d"
,
JOB_TASK_STATUS_SUCCEED
);
QW_ERR_RET
(
qwUpdateTaskStatus
(
QW_FPARAMS
(),
JOB_TASK_STATUS_SUCCEED
));
QW_ERR_RET
(
qwUpdateTaskStatus
(
QW_FPARAMS
(),
JOB_TASK_STATUS_SUCCEED
));
}
}
...
@@ -974,7 +973,7 @@ int32_t qwProcessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg, int8_t taskType) {
...
@@ -974,7 +973,7 @@ int32_t qwProcessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg, int8_t taskType) {
QW_ERR_JRET
(
code
);
QW_ERR_JRET
(
code
);
}
}
code
=
qCreateExecTask
(
qwMsg
->
node
,
0
,
(
struct
SSubplan
*
)
plan
,
&
pTaskInfo
,
&
sinkHandle
);
code
=
qCreateExecTask
(
qwMsg
->
node
,
0
,
tId
,
(
struct
SSubplan
*
)
plan
,
&
pTaskInfo
,
&
sinkHandle
);
if
(
code
)
{
if
(
code
)
{
QW_TASK_ELOG
(
"qCreateExecTask failed, code:%s"
,
tstrerror
(
code
));
QW_TASK_ELOG
(
"qCreateExecTask failed, code:%s"
,
tstrerror
(
code
));
QW_ERR_JRET
(
code
);
QW_ERR_JRET
(
code
);
...
@@ -996,7 +995,7 @@ int32_t qwProcessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg, int8_t taskType) {
...
@@ -996,7 +995,7 @@ int32_t qwProcessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg, int8_t taskType) {
atomic_store_ptr
(
&
ctx
->
sinkHandle
,
sinkHandle
);
atomic_store_ptr
(
&
ctx
->
sinkHandle
,
sinkHandle
);
if
(
pTaskInfo
&&
sinkHandle
)
{
if
(
pTaskInfo
&&
sinkHandle
)
{
QW_ERR_JRET
(
qwExecTask
(
QW_FPARAMS
(),
ctx
));
QW_ERR_JRET
(
qwExecTask
(
QW_FPARAMS
(),
ctx
,
NULL
));
}
}
_return:
_return:
...
@@ -1083,6 +1082,7 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
...
@@ -1083,6 +1082,7 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
SQWPhaseOutput
output
=
{
0
};
SQWPhaseOutput
output
=
{
0
};
void
*
rsp
=
NULL
;
void
*
rsp
=
NULL
;
int32_t
dataLen
=
0
;
int32_t
dataLen
=
0
;
bool
queryEnd
=
false
;
do
{
do
{
QW_ERR_JRET
(
qwHandlePrePhaseEvents
(
QW_FPARAMS
(),
QW_PHASE_PRE_CQUERY
,
&
input
,
&
output
));
QW_ERR_JRET
(
qwHandlePrePhaseEvents
(
QW_FPARAMS
(),
QW_PHASE_PRE_CQUERY
,
&
input
,
&
output
));
...
@@ -1102,7 +1102,7 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
...
@@ -1102,7 +1102,7 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
DataSinkHandle
sinkHandle
=
ctx
->
sinkHandle
;
DataSinkHandle
sinkHandle
=
ctx
->
sinkHandle
;
QW_ERR_JRET
(
qwExecTask
(
QW_FPARAMS
(),
ctx
));
QW_ERR_JRET
(
qwExecTask
(
QW_FPARAMS
(),
ctx
,
&
queryEnd
));
if
(
QW_IS_EVENT_RECEIVED
(
ctx
,
QW_EVENT_FETCH
))
{
if
(
QW_IS_EVENT_RECEIVED
(
ctx
,
QW_EVENT_FETCH
))
{
SOutputData
sOutput
=
{
0
};
SOutputData
sOutput
=
{
0
};
...
@@ -1114,13 +1114,10 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
...
@@ -1114,13 +1114,10 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
// RC WARNING
// RC WARNING
atomic_store_8
(
&
ctx
->
queryContinue
,
1
);
atomic_store_8
(
&
ctx
->
queryContinue
,
1
);
}
}
if
(
sOutput
.
queryEnd
)
{
needStop
=
true
;
}
if
(
rsp
)
{
if
(
rsp
)
{
qwBuildFetchRsp
(
rsp
,
&
sOutput
,
dataLen
);
bool
qComplete
=
(
DS_BUF_EMPTY
==
sOutput
.
bufStatus
&&
sOutput
.
queryEnd
);
qwBuildFetchRsp
(
rsp
,
&
sOutput
,
dataLen
,
qComplete
);
QW_SET_EVENT_PROCESSED
(
ctx
,
QW_EVENT_FETCH
);
QW_SET_EVENT_PROCESSED
(
ctx
,
QW_EVENT_FETCH
);
...
@@ -1131,6 +1128,10 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
...
@@ -1131,6 +1128,10 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
}
}
}
}
if
(
queryEnd
)
{
needStop
=
true
;
}
_return:
_return:
if
(
NULL
==
ctx
)
{
if
(
NULL
==
ctx
)
{
...
@@ -1196,7 +1197,8 @@ int32_t qwProcessFetch(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
...
@@ -1196,7 +1197,8 @@ int32_t qwProcessFetch(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
if
(
NULL
==
rsp
)
{
if
(
NULL
==
rsp
)
{
QW_SET_EVENT_RECEIVED
(
ctx
,
QW_EVENT_FETCH
);
QW_SET_EVENT_RECEIVED
(
ctx
,
QW_EVENT_FETCH
);
}
else
{
}
else
{
qwBuildFetchRsp
(
rsp
,
&
sOutput
,
dataLen
);
bool
qComplete
=
(
DS_BUF_EMPTY
==
sOutput
.
bufStatus
&&
sOutput
.
queryEnd
);
qwBuildFetchRsp
(
rsp
,
&
sOutput
,
dataLen
,
qComplete
);
}
}
if
((
!
sOutput
.
queryEnd
)
&&
(
DS_BUF_LOW
==
sOutput
.
bufStatus
||
DS_BUF_EMPTY
==
sOutput
.
bufStatus
))
{
if
((
!
sOutput
.
queryEnd
)
&&
(
DS_BUF_LOW
==
sOutput
.
bufStatus
||
DS_BUF_EMPTY
==
sOutput
.
bufStatus
))
{
...
@@ -1311,12 +1313,13 @@ _return:
...
@@ -1311,12 +1313,13 @@ _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
);
}
}
SQWorkerMgmt
*
mgmt
=
calloc
(
1
,
sizeof
(
SQWorkerMgmt
));
SQWorkerMgmt
*
mgmt
=
calloc
(
1
,
sizeof
(
SQWorkerMgmt
));
if
(
NULL
==
mgmt
)
{
if
(
NULL
==
mgmt
)
{
qError
(
"calloc %d failed"
,
(
int32_t
)
sizeof
(
SQWorkerMgmt
));
qError
(
"calloc %d failed"
,
(
int32_t
)
sizeof
(
SQWorkerMgmt
));
...
@@ -1359,7 +1362,8 @@ int32_t qWorkerInit(int8_t nodeType, int32_t nodeId, SQWorkerCfg *cfg, void **qW
...
@@ -1359,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
;
...
...
source/libs/qworker/src/qworkerMsg.c
浏览文件 @
9db65e7a
...
@@ -26,11 +26,11 @@ int32_t qwMallocFetchRsp(int32_t length, SRetrieveTableRsp **rsp) {
...
@@ -26,11 +26,11 @@ int32_t qwMallocFetchRsp(int32_t length, SRetrieveTableRsp **rsp) {
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
void
qwBuildFetchRsp
(
void
*
msg
,
SOutputData
*
input
,
int32_t
len
)
{
void
qwBuildFetchRsp
(
void
*
msg
,
SOutputData
*
input
,
int32_t
len
,
bool
qComplete
)
{
SRetrieveTableRsp
*
rsp
=
(
SRetrieveTableRsp
*
)
msg
;
SRetrieveTableRsp
*
rsp
=
(
SRetrieveTableRsp
*
)
msg
;
rsp
->
useconds
=
htobe64
(
input
->
useconds
);
rsp
->
useconds
=
htobe64
(
input
->
useconds
);
rsp
->
completed
=
input
->
queryEnd
;
rsp
->
completed
=
qComplete
;
rsp
->
precision
=
input
->
precision
;
rsp
->
precision
=
input
->
precision
;
rsp
->
compressed
=
input
->
compressed
;
rsp
->
compressed
=
input
->
compressed
;
rsp
->
compLen
=
htonl
(
len
);
rsp
->
compLen
=
htonl
(
len
);
...
@@ -258,12 +258,12 @@ int32_t qwBuildAndSendCQueryMsg(SQWorkerMgmt *mgmt, uint64_t sId, uint64_t qId,
...
@@ -258,12 +258,12 @@ int32_t qwBuildAndSendCQueryMsg(SQWorkerMgmt *mgmt, uint64_t sId, uint64_t qId,
int32_t
code
=
(
*
mgmt
->
putToQueueFp
)(
mgmt
->
nodeObj
,
&
pNewMsg
);
int32_t
code
=
(
*
mgmt
->
putToQueueFp
)(
mgmt
->
nodeObj
,
&
pNewMsg
);
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
QW_SCH_TASK_ELOG
(
"put query continue msg to queue failed,
code:%x"
,
code
);
QW_SCH_TASK_ELOG
(
"put query continue msg to queue failed,
vgId:%d, code:%s"
,
mgmt
->
nodeId
,
tstrerror
(
code
)
);
rpcFreeCont
(
req
);
rpcFreeCont
(
req
);
QW_ERR_RET
(
code
);
QW_ERR_RET
(
code
);
}
}
QW_SCH_TASK_DLOG
(
"put
query continue
msg to query queue, vgId:%d"
,
mgmt
->
nodeId
);
QW_SCH_TASK_DLOG
(
"put
task continue exec
msg to query queue, vgId:%d"
,
mgmt
->
nodeId
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
@@ -421,6 +421,11 @@ int32_t qWorkerProcessFetchMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg) {
...
@@ -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
;
...
...
source/libs/qworker/test/qworkerTests.cpp
浏览文件 @
9db65e7a
...
@@ -1081,7 +1081,7 @@ TEST(rcTest, shortExecshortDelay) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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
;
...
...
source/libs/transport/inc/transComm.h
浏览文件 @
9db65e7a
...
@@ -182,7 +182,7 @@ typedef struct {
...
@@ -182,7 +182,7 @@ typedef struct {
#define TRANS_RESERVE_SIZE (sizeof(STranConnCtx))
#define TRANS_RESERVE_SIZE (sizeof(STranConnCtx))
#define TRANS_MSG_OVERHEAD (sizeof(STransMsgHead)
+ sizeof(STransDigestMsg)
)
#define TRANS_MSG_OVERHEAD (sizeof(STransMsgHead))
#define transHeadFromCont(cont) ((STransMsgHead*)((char*)cont - sizeof(STransMsgHead)))
#define transHeadFromCont(cont) ((STransMsgHead*)((char*)cont - sizeof(STransMsgHead)))
#define transContFromHead(msg) (msg + sizeof(STransMsgHead))
#define transContFromHead(msg) (msg + sizeof(STransMsgHead))
#define transMsgLenFromCont(contLen) (contLen + sizeof(STransMsgHead))
#define transMsgLenFromCont(contLen) (contLen + sizeof(STransMsgHead))
...
@@ -201,6 +201,9 @@ bool transDecompressMsg(char* msg, int32_t len, int32_t* flen);
...
@@ -201,6 +201,9 @@ bool transDecompressMsg(char* msg, int32_t len, int32_t* flen);
void
transConnCtxDestroy
(
STransConnCtx
*
ctx
);
void
transConnCtxDestroy
(
STransConnCtx
*
ctx
);
void
transFreeMsg
(
void
*
msg
);
//
typedef
struct
SConnBuffer
{
typedef
struct
SConnBuffer
{
char
*
buf
;
char
*
buf
;
int
len
;
int
len
;
...
@@ -208,4 +211,9 @@ typedef struct SConnBuffer {
...
@@ -208,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
source/libs/transport/src/rpcMain.c
浏览文件 @
9db65e7a
...
@@ -242,11 +242,14 @@ void *rpcOpen(const SRpcInit *pInit) {
...
@@ -242,11 +242,14 @@ void *rpcOpen(const SRpcInit *pInit) {
pRpc
=
(
SRpcInfo
*
)
calloc
(
1
,
sizeof
(
SRpcInfo
));
pRpc
=
(
SRpcInfo
*
)
calloc
(
1
,
sizeof
(
SRpcInfo
));
if
(
pRpc
==
NULL
)
return
NULL
;
if
(
pRpc
==
NULL
)
return
NULL
;
if
(
pInit
->
label
)
tstrncpy
(
pRpc
->
label
,
pInit
->
label
,
strl
en
(
pInit
->
label
));
if
(
pInit
->
label
)
tstrncpy
(
pRpc
->
label
,
pInit
->
label
,
tListL
en
(
pInit
->
label
));
pRpc
->
connType
=
pInit
->
connType
;
pRpc
->
connType
=
pInit
->
connType
;
if
(
pRpc
->
connType
==
TAOS_CONN_CLIENT
)
{
if
(
pRpc
->
connType
==
TAOS_CONN_CLIENT
)
{
pRpc
->
numOfThreads
=
pInit
->
numOfThreads
;
pRpc
->
numOfThreads
=
pInit
->
numOfThreads
;
if
(
pRpc
->
numOfThreads
>=
10
)
{
pRpc
->
numOfThreads
=
10
;
}
}
else
{
}
else
{
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
;
}
}
...
@@ -769,8 +772,8 @@ static SRpcConn *rpcAllocateServerConn(SRpcInfo *pRpc, SRecvInfo *pRecv) {
...
@@ -769,8 +772,8 @@ static SRpcConn *rpcAllocateServerConn(SRpcInfo *pRpc, SRecvInfo *pRecv) {
}
}
taosHashPut
(
pRpc
->
hash
,
hashstr
,
size
,
(
char
*
)
&
pConn
,
POINTER_BYTES
);
taosHashPut
(
pRpc
->
hash
,
hashstr
,
size
,
(
char
*
)
&
pConn
,
POINTER_BYTES
);
tDebug
(
"%s %p server connection is allocated, uid:0x%x sid:%d key:%s spi:%d"
,
pRpc
->
label
,
pConn
,
pConn
->
linkUid
,
sid
,
tDebug
(
"%s %p server connection is allocated, uid:0x%x sid:%d key:%s spi:%d"
,
pRpc
->
label
,
pConn
,
pConn
->
linkUid
,
hashstr
,
pConn
->
spi
);
sid
,
hashstr
,
pConn
->
spi
);
}
}
return
pConn
;
return
pConn
;
...
@@ -1357,9 +1360,14 @@ static void rpcSendMsgToPeer(SRpcConn *pConn, void *msg, int msgLen) {
...
@@ -1357,9 +1360,14 @@ static void rpcSendMsgToPeer(SRpcConn *pConn, void *msg, int msgLen) {
tDebug
(
"%s, %s is sent to %s:%hu, len:%d sig:0x%08x:0x%08x:%d"
,
pConn
->
info
,
TMSG_INFO
(
pHead
->
msgType
),
tDebug
(
"%s, %s is sent to %s:%hu, len:%d sig:0x%08x:0x%08x:%d"
,
pConn
->
info
,
TMSG_INFO
(
pHead
->
msgType
),
pConn
->
peerFqdn
,
pConn
->
peerPort
,
msgLen
,
pHead
->
sourceId
,
pHead
->
destId
,
pHead
->
tranId
);
pConn
->
peerFqdn
,
pConn
->
peerPort
,
msgLen
,
pHead
->
sourceId
,
pHead
->
destId
,
pHead
->
tranId
);
}
else
{
}
else
{
if
(
pHead
->
code
==
0
)
pConn
->
secured
=
1
;
// for success response, set link as secured
if
(
pHead
->
code
==
0
)
{
tDebug
(
"%s, %s is sent to 0x%x:%hu, code:0x%x len:%d sig:0x%08x:0x%08x:%d"
,
pConn
->
info
,
TMSG_INFO
(
pHead
->
msgType
),
pConn
->
secured
=
1
;
// for success response, set link as secured
pConn
->
peerIp
,
pConn
->
peerPort
,
htonl
(
pHead
->
code
),
msgLen
,
pHead
->
sourceId
,
pHead
->
destId
,
pHead
->
tranId
);
}
char
ipport
[
40
]
=
{
0
};
taosIpPort2String
(
pConn
->
peerIp
,
pConn
->
peerPort
,
ipport
);
tDebug
(
"%s, %s is sent to %s, code:0x%x len:%d sig:0x%08x:0x%08x:%d"
,
pConn
->
info
,
TMSG_INFO
(
pHead
->
msgType
),
ipport
,
htonl
(
pHead
->
code
),
msgLen
,
pHead
->
sourceId
,
pHead
->
destId
,
pHead
->
tranId
);
}
}
// tTrace("connection type is: %d", pConn->connType);
// tTrace("connection type is: %d", pConn->connType);
...
...
source/libs/transport/src/trans.c
浏览文件 @
9db65e7a
...
@@ -30,7 +30,8 @@ void* rpcOpen(const SRpcInit* pInit) {
...
@@ -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) {
...
@@ -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
)
{}
...
...
source/libs/transport/src/transCli.c
浏览文件 @
9db65e7a
...
@@ -31,6 +31,7 @@ typedef struct SCliConn {
...
@@ -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
{
...
@@ -105,15 +106,28 @@ static void* clientThread(void* arg);
...
@@ -105,15 +106,28 @@ static void* clientThread(void* arg);
static
void
clientHandleResp
(
SCliConn
*
conn
)
{
static
void
clientHandleResp
(
SCliConn
*
conn
)
{
STransConnCtx
*
pCtx
=
((
SCliMsg
*
)
conn
->
data
)
->
ctx
;
STransConnCtx
*
pCtx
=
((
SCliMsg
*
)
conn
->
data
)
->
ctx
;
SRpcInfo
*
pRpc
=
pCtx
->
pTransInst
;
SRpcInfo
*
pRpc
=
pCtx
->
pTransInst
;
SRpcMsg
rpcMsg
;
rpcMsg
.
pCont
=
conn
->
readBuf
.
buf
;
STransMsgHead
*
pHead
=
(
STransMsgHead
*
)(
conn
->
readBuf
.
buf
);
rpcMsg
.
contLen
=
conn
->
readBuf
.
len
;
pHead
->
code
=
htonl
(
pHead
->
code
);
pHead
->
msgLen
=
htonl
(
pHead
->
msgLen
);
SRpcMsg
rpcMsg
;
rpcMsg
.
contLen
=
transContLenFromMsg
(
pHead
->
msgLen
);
rpcMsg
.
pCont
=
transContFromHead
((
char
*
)
pHead
);
rpcMsg
.
code
=
pHead
->
code
;
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
;
SCliThrdObj
*
pThrd
=
conn
->
hostThrd
;
SCliThrdObj
*
pThrd
=
conn
->
hostThrd
;
tfree
(
conn
->
data
);
// buf alread translated to rpcMsg.pCont
transClearBuffer
(
&
conn
->
readBuf
);
uv_read_start
((
uv_stream_t
*
)
conn
->
stream
,
clientAllocBufferCb
,
clientReadCb
);
addConnToPool
(
pThrd
->
pool
,
pCtx
->
ip
,
pCtx
->
port
,
conn
);
addConnToPool
(
pThrd
->
pool
,
pCtx
->
ip
,
pCtx
->
port
,
conn
);
// start thread's timer of conn pool if not active
// start thread's timer of conn pool if not active
...
@@ -123,16 +137,24 @@ static void clientHandleResp(SCliConn* conn) {
...
@@ -123,16 +137,24 @@ static void clientHandleResp(SCliConn* conn) {
destroyTransConnCtx
(
pCtx
);
destroyTransConnCtx
(
pCtx
);
}
}
static
void
clientHandleExcept
(
SCliConn
*
pConn
)
{
static
void
clientHandleExcept
(
SCliConn
*
pConn
)
{
if
(
pConn
->
data
==
NULL
)
{
clientConnDestroy
(
pConn
,
true
);
return
;
}
tDebug
(
"conn %p destroy"
,
pConn
);
SCliMsg
*
pMsg
=
pConn
->
data
;
SCliMsg
*
pMsg
=
pConn
->
data
;
transFreeMsg
((
pMsg
->
msg
.
pCont
));
pMsg
->
msg
.
pCont
=
NULL
;
STransConnCtx
*
pCtx
=
pMsg
->
ctx
;
STransConnCtx
*
pCtx
=
pMsg
->
ctx
;
SRpcInfo
*
pRpc
=
pCtx
->
pTransInst
;
SRpcInfo
*
pRpc
=
pCtx
->
pTransInst
;
SRpcMsg
rpcMsg
;
SRpcMsg
rpcMsg
=
{
0
}
;
rpcMsg
.
ahandle
=
pCtx
->
ahandle
;
rpcMsg
.
ahandle
=
pCtx
->
ahandle
;
rpcMsg
.
code
=
-
1
;
// SRpcInfo* pRpc = pMsg->ctx->pRpc;
// SRpcInfo* pRpc = pMsg->ctx->pRpc;
(
pRpc
->
cfp
)(
NULL
,
&
rpcMsg
,
NULL
);
(
pRpc
->
cfp
)(
NULL
,
&
rpcMsg
,
NULL
);
tfree
(
pConn
->
data
);
pConn
->
notifyCount
+=
1
;
pConn
->
notifyCount
+=
1
;
destroyTransConnCtx
(
pCtx
);
destroyTransConnCtx
(
pCtx
);
clientConnDestroy
(
pConn
,
true
);
clientConnDestroy
(
pConn
,
true
);
...
@@ -201,12 +223,17 @@ static SCliConn* getConnFromPool(void* pool, char* ip, uint32_t port) {
...
@@ -201,12 +223,17 @@ 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
);
...
@@ -225,40 +252,18 @@ static bool clientReadComplete(SConnBuffer* data) {
...
@@ -225,40 +252,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
...
@@ -267,6 +272,7 @@ static void clientReadCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf
...
@@ -267,6 +272,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
{
...
@@ -276,10 +282,9 @@ static void clientReadCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf
...
@@ -276,10 +282,9 @@ 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
);
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
);
}
}
...
@@ -288,39 +293,46 @@ static void clientReadCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf
...
@@ -288,39 +293,46 @@ 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
);
//
if
(
clear
)
{
conn
->
ref
--
;
uv_close
((
uv_handle_t
*
)
conn
->
stream
,
NULL
);
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
)
{
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
;
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
)
{
transFreeMsg
((
pMsg
->
msg
.
pCont
));
pMsg
->
msg
.
pCont
=
NULL
;
}
}
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
)
{
...
@@ -365,14 +377,11 @@ static void clientHandleReq(SCliMsg* pMsg, SCliThrdObj* pThrd) {
...
@@ -365,14 +377,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
));
...
@@ -381,6 +390,7 @@ static void clientHandleReq(SCliMsg* pMsg, SCliThrdObj* pThrd) {
...
@@ -381,6 +390,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
;
...
...
source/libs/transport/src/transComm.c
浏览文件 @
9db65e7a
...
@@ -191,4 +191,58 @@ void transConnCtxDestroy(STransConnCtx* ctx) {
...
@@ -191,4 +191,58 @@ void transConnCtxDestroy(STransConnCtx* ctx) {
free
(
ctx
->
ip
);
free
(
ctx
->
ip
);
free
(
ctx
);
free
(
ctx
);
}
}
void
transFreeMsg
(
void
*
msg
)
{
if
(
msg
==
NULL
)
{
return
;
}
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
source/libs/transport/src/transSrv.c
浏览文件 @
9db65e7a
...
@@ -17,7 +17,7 @@
...
@@ -17,7 +17,7 @@
#include "transComm.h"
#include "transComm.h"
typedef
struct
SConn
{
typedef
struct
S
Srv
Conn
{
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 {
...
@@ -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
conn
Buf
;
// read buf,
SConnBuffer
read
Buf
;
// 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 {
...
@@ -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 {
...
@@ -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
conn
Mtx
;
pthread_mutex_t
msg
Mtx
;
void
*
pTransInst
;
void
*
pTransInst
;
}
SWorkThrdObj
;
}
SWorkThrdObj
;
...
@@ -68,9 +75,9 @@ typedef struct SServerObj {
...
@@ -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
(
S
Srv
Conn
*
pConn
,
char
*
msg
,
int
msgLen
);
static
int
uvAuthMsg
(
SConn
*
pConn
,
char
*
msg
,
int
msgLen
);
static
int
uvAuthMsg
(
S
Srv
Conn
*
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);
...
@@ -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
destroySrvMsg
(
SSrvConn
*
conn
);
// 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
S
Srv
Conn
*
createConn
();
static
void
destroyConn
(
S
Conn
*
conn
,
bool
clear
/*clear handle or not*/
);
static
void
destroyConn
(
SSrv
Conn
*
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
...
@@ -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) {
...
@@ -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;
// S
Srv
Conn* 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) {
...
@@ -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
(
S
Srv
Conn
*
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) {
...
@@ -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
;
S
Srv
Conn
*
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
(
S
Srv
Conn
*
pConn
)
{
SRecvInfo
info
;
SRecvInfo
info
;
SRecvInfo
*
p
=
&
info
;
SRecvInfo
*
p
=
&
info
;
SConnBuffer
*
pBuf
=
&
pConn
->
conn
Buf
;
SConnBuffer
*
pBuf
=
&
pConn
->
read
Buf
;
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) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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) {
...
@@ -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
S
Conn
*
conn
=
cli
->
data
;
S
SrvConn
*
conn
=
cli
->
data
;
SConnBuffer
*
pBuf
=
&
conn
->
conn
Buf
;
SConnBuffer
*
pBuf
=
&
conn
->
read
Buf
;
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) {
...
@@ -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,21 +299,21 @@ void uvAllocConnBufferCb(uv_handle_t* handle, size_t suggested_size, uv_buf_t* b
...
@@ -310,21 +299,21 @@ 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
;
S
Srv
Conn
*
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
;
SSrvMsg
*
smsg
=
conn
->
pSrvMsg
;
destroySrvMsg
(
conn
);
SConnBuffer
*
buf
=
&
conn
->
connBuf
;
transClearBuffer
(
&
conn
->
readBuf
);
buf
->
len
=
0
;
memset
(
buf
->
buf
,
0
,
buf
->
cap
);
buf
->
left
=
-
1
;
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
...
@@ -337,16 +326,16 @@ static void uvOnPipeWriteCb(uv_write_t* req, int status) {
...
@@ -337,16 +326,16 @@ static void uvOnPipeWriteCb(uv_write_t* req, int status) {
}
}
}
}
static
void
uvPrepareSendData
(
S
Conn
*
conn
,
uv_buf_t
*
wb
)
{
static
void
uvPrepareSendData
(
S
SrvMsg
*
smsg
,
uv_buf_t
*
wb
)
{
// impl later;
// impl later;
tDebug
(
"conn %p prepare to send resp"
,
c
onn
);
tDebug
(
"conn %p prepare to send resp"
,
smsg
->
pC
onn
);
SRpcMsg
*
pMsg
=
&
conn
->
sendM
sg
;
SRpcMsg
*
pMsg
=
&
smsg
->
m
sg
;
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
=
c
onn
->
inType
+
1
;
pHead
->
msgType
=
smsg
->
pC
onn
->
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
);
...
@@ -357,28 +346,55 @@ static void uvPrepareSendData(SConn* conn, uv_buf_t* wb) {
...
@@ -357,28 +346,55 @@ 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
destroySrvMsg
(
SSrvConn
*
conn
)
{
SSrvMsg
*
smsg
=
conn
->
pSrvMsg
;
if
(
smsg
==
NULL
)
{
return
;
}
transFreeMsg
(
smsg
->
msg
.
pCont
);
free
(
conn
->
pSrvMsg
);
conn
->
pSrvMsg
=
NULL
;
}
void
uvWorkerAsyncCb
(
uv_async_t
*
handle
)
{
void
uvWorkerAsyncCb
(
uv_async_t
*
handle
)
{
SWorkThrdObj
*
pThrd
=
handle
->
data
;
SWorkThrdObj
*
pThrd
=
handle
->
data
;
S
Conn
*
conn
=
NULL
;
S
SrvConn
*
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
->
conn
Mtx
);
pthread_mutex_lock
(
&
pThrd
->
msg
Mtx
);
QUEUE_MOVE
(
&
pThrd
->
conn
,
&
wq
);
QUEUE_MOVE
(
&
pThrd
->
msg
,
&
wq
);
pthread_mutex_unlock
(
&
pThrd
->
conn
Mtx
);
pthread_mutex_unlock
(
&
pThrd
->
msg
Mtx
);
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
)
{
SSrvMsg
*
msg
=
QUEUE_DATA
(
head
,
SSrvMsg
,
q
);
tError
(
"except occurred, do nothing"
);
if
(
msg
==
NULL
)
{
return
;
tError
(
"except occurred, continue"
);
continue
;
}
}
uv_buf_t
wb
;
uvStartSendResp
(
msg
);
uvPrepareSendData
(
conn
,
&
wb
);
// uv_buf_t wb;
uv_timer_stop
(
conn
->
pTimer
);
// uvPrepareSendData(msg, &wb);
// uv_timer_stop(conn->pTimer);
uv_write
(
conn
->
pWriter
,
(
uv_stream_t
*
)
conn
->
pTcp
,
&
wb
,
1
,
uvOnWriteCb
);
//
uv_write(conn->pWriter, (uv_stream_t*)conn->pTcp, &wb, 1, uvOnWriteCb);
}
}
}
}
...
@@ -431,7 +447,7 @@ void uvOnConnectionCb(uv_stream_t* q, ssize_t nread, const uv_buf_t* buf) {
...
@@ -431,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
();
S
Srv
Conn
*
pConn
=
createConn
();
pConn
->
pTransInst
=
pThrd
->
pTransInst
;
pConn
->
pTransInst
=
pThrd
->
pTransInst
;
/* init conn timer*/
/* init conn timer*/
...
@@ -480,8 +496,8 @@ static bool addHandleToWorkloop(void* arg) {
...
@@ -480,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
->
conn
Mtx
,
NULL
);
pthread_mutex_init
(
&
pThrd
->
msg
Mtx
,
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
);
...
@@ -519,34 +535,42 @@ void* workerThread(void* arg) {
...
@@ -519,34 +535,42 @@ 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
(
S
Srv
Conn
*
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
);
destroySrvMsg
(
conn
);
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
)
{
...
@@ -628,6 +652,7 @@ void destroyWorkThrd(SWorkThrdObj* pThrd) {
...
@@ -628,6 +652,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
)
{
...
@@ -644,17 +669,20 @@ void taosCloseServer(void* arg) {
...
@@ -644,17 +669,20 @@ void taosCloseServer(void* arg) {
}
}
void
rpcSendResponse
(
const
SRpcMsg
*
pMsg
)
{
void
rpcSendResponse
(
const
SRpcMsg
*
pMsg
)
{
S
Conn
*
pConn
=
pMsg
->
handle
;
S
SrvConn
*
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
(
p
Conn
->
pW
orkerAsync
);
uv_async_send
(
p
Thrd
->
w
orkerAsync
);
}
}
#endif
#endif
source/libs/transport/test/rclient.c
浏览文件 @
9db65e7a
...
@@ -64,6 +64,7 @@ static void *sendRequest(void *param) {
...
@@ -64,6 +64,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);
}
}
...
...
source/util/src/tqueue.c
浏览文件 @
9db65e7a
...
@@ -13,35 +13,36 @@
...
@@ -13,35 +13,36 @@
* 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
;
STaosQnode
*
head
;
int32_t
threadId
;
STaosQnode
*
tail
;
STaosQnode
*
head
;
STaosQueue
*
next
;
// for queue set
STaosQnode
*
tail
;
STaosQset
*
qset
;
// for queue set
STaosQueue
*
next
;
// for queue set
void
*
ahandle
;
// for queue set
STaosQset
*
qset
;
// for queue set
FProcessItem
itemFp
;
void
*
ahandle
;
// for queue set
FProcessItems
itemsFp
;
FItem
itemFp
;
FItems
itemsFp
;
pthread_mutex_t
mutex
;
pthread_mutex_t
mutex
;
}
STaosQueue
;
}
STaosQueue
;
typedef
struct
STaosQset
{
typedef
struct
STaosQset
{
STaosQueue
*
head
;
STaosQueue
*
head
;
STaosQueue
*
current
;
STaosQueue
*
current
;
pthread_mutex_t
mutex
;
pthread_mutex_t
mutex
;
int32_t
numOfQueues
;
int32_t
numOfQueues
;
int32_t
numOfItems
;
int32_t
numOfItems
;
...
@@ -56,19 +57,23 @@ typedef struct STaosQall {
...
@@ -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
,
F
ProcessItem
itemFp
,
FProcess
Items
itemsFp
)
{
void
taosSetQueueFp
(
STaosQueue
*
queue
,
F
Item
itemFp
,
F
Items
itemsFp
)
{
if
(
queue
==
NULL
)
return
;
if
(
queue
==
NULL
)
return
;
queue
->
itemFp
=
itemFp
;
queue
->
itemFp
=
itemFp
;
queue
->
itemsFp
=
itemsFp
;
queue
->
itemsFp
=
itemsFp
;
...
@@ -77,7 +82,7 @@ void taosSetQueueFp(STaosQueue *queue, FProcessItem itemFp, FProcessItems itemsF
...
@@ -77,7 +82,7 @@ void taosSetQueueFp(STaosQueue *queue, FProcessItem itemFp, FProcessItems itemsF
void
taosCloseQueue
(
STaosQueue
*
queue
)
{
void
taosCloseQueue
(
STaosQueue
*
queue
)
{
if
(
queue
==
NULL
)
return
;
if
(
queue
==
NULL
)
return
;
STaosQnode
*
pTemp
;
STaosQnode
*
pTemp
;
STaosQset
*
qset
;
STaosQset
*
qset
;
pthread_mutex_lock
(
&
queue
->
mutex
);
pthread_mutex_lock
(
&
queue
->
mutex
);
STaosQnode
*
pNode
=
queue
->
head
;
STaosQnode
*
pNode
=
queue
->
head
;
...
@@ -85,7 +90,9 @@ void taosCloseQueue(STaosQueue *queue) {
...
@@ -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) {
...
@@ -96,7 +103,7 @@ void taosCloseQueue(STaosQueue *queue) {
pthread_mutex_destroy
(
&
queue
->
mutex
);
pthread_mutex_destroy
(
&
queue
->
mutex
);
free
(
queue
);
free
(
queue
);
u
Trace
(
"queue:%p is closed"
,
queue
);
u
Debug
(
"queue:%p is closed"
,
queue
);
}
}
bool
taosQueueEmpty
(
STaosQueue
*
queue
)
{
bool
taosQueueEmpty
(
STaosQueue
*
queue
)
{
...
@@ -120,19 +127,23 @@ int32_t taosQueueSize(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
*
p
ara
m
)
{
void
taosFreeQitem
(
void
*
p
Ite
m
)
{
if
(
p
ara
m
==
NULL
)
return
;
if
(
p
Ite
m
==
NULL
)
return
;
char
*
temp
=
(
char
*
)
para
m
;
char
*
temp
=
pIte
m
;
temp
-=
sizeof
(
STaosQnode
);
temp
-=
sizeof
(
STaosQnode
);
uTrace
(
"item:%p, node:%p is freed"
,
p
ara
m
,
temp
);
uTrace
(
"item:%p, node:%p is freed"
,
p
Ite
m
,
temp
);
free
(
temp
);
free
(
temp
);
}
}
...
@@ -175,7 +186,7 @@ int32_t taosReadQitem(STaosQueue *queue, void **ppItem) {
...
@@ -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
;
u
Debug
(
"item:%p is read out from queue:%p, items:%d"
,
*
ppItem
,
queue
,
queue
->
numOfItems
);
u
Trace
(
"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) {
...
@@ -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) {
...
@@ -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() {
...
@@ -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
);
u
Trace
(
"qset:%p is opened"
,
qset
);
u
Debug
(
"qset:%p is opened"
,
qset
);
return
qset
;
return
qset
;
}
}
...
@@ -268,7 +279,7 @@ void taosCloseQset(STaosQset *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
);
u
Trace
(
"qset:%p is closed"
,
qset
);
u
Debug
(
"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) {
...
@@ -338,12 +349,12 @@ void taosRemoveFromQset(STaosQset *qset, STaosQueue *queue) {
pthread_mutex_unlock
(
&
qset
->
mutex
);
pthread_mutex_unlock
(
&
qset
->
mutex
);
u
Trace
(
"queue:%p is removed from qset:%p"
,
queue
,
qset
);
u
Debug
(
"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
,
F
Process
Item
*
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
...
@@ -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
...
@@ -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
,
F
Process
Items
*
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
...
@@ -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
...
@@ -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
;
...
...
source/util/src/tworker.c
浏览文件 @
9db65e7a
...
@@ -14,38 +14,46 @@
...
@@ -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
t
WorkerInit
(
S
WorkerPool
*
pool
)
{
int32_t
t
QWorkerInit
(
SQ
WorkerPool
*
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
;
}
}
u
Info
(
"worker:%s is initialized, min:%d max:%d"
,
pool
->
name
,
pool
->
min
,
pool
->
max
);
u
Debug
(
"worker:%s is initialized, min:%d max:%d"
,
pool
->
name
,
pool
->
min
,
pool
->
max
);
return
0
;
return
0
;
}
}
void
t
WorkerCleanup
(
S
WorkerPool
*
pool
)
{
void
t
QWorkerCleanup
(
SQ
WorkerPool
*
pool
)
{
for
(
int
i
=
0
;
i
<
pool
->
max
;
++
i
)
{
for
(
int
32_t
i
=
0
;
i
<
pool
->
max
;
++
i
)
{
SWorker
*
worker
=
pool
->
workers
+
i
;
S
Q
Worker
*
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
(
int
32_t
i
=
0
;
i
<
pool
->
max
;
++
i
)
{
SWorker
*
worker
=
pool
->
workers
+
i
;
S
Q
Worker
*
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,15 +64,15 @@ void tWorkerCleanup(SWorkerPool *pool) {
...
@@ -56,15 +64,15 @@ void tWorkerCleanup(SWorkerPool *pool) {
taosCloseQset
(
pool
->
qset
);
taosCloseQset
(
pool
->
qset
);
pthread_mutex_destroy
(
&
pool
->
mutex
);
pthread_mutex_destroy
(
&
pool
->
mutex
);
u
Info
(
"worker:%s is closed"
,
pool
->
name
);
u
Debug
(
"worker:%s is closed"
,
pool
->
name
);
}
}
static
void
*
t
WorkerThreadFp
(
S
Worker
*
worker
)
{
static
void
*
t
QWorkerThreadFp
(
SQ
Worker
*
worker
)
{
SWorkerPool
*
pool
=
worker
->
pool
;
S
Q
WorkerPool
*
pool
=
worker
->
pool
;
F
ProcessItem
fp
=
NULL
;
F
Item
fp
=
NULL
;
void
*
msg
=
NULL
;
void
*
msg
=
NULL
;
void
*
ahandle
=
NULL
;
void
*
ahandle
=
NULL
;
int32_t
code
=
0
;
int32_t
code
=
0
;
taosBlockSIGPIPE
();
taosBlockSIGPIPE
();
...
@@ -77,7 +85,7 @@ static void *tWorkerThreadFp(SWorker *worker) {
...
@@ -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) {
...
@@ -85,11 +93,12 @@ static void *tWorkerThreadFp(SWorker *worker) {
return
NULL
;
return
NULL
;
}
}
STaosQueue
*
tWorkerAllocQueue
(
S
WorkerPool
*
pool
,
void
*
ahandle
,
FProcessItem
f
p
)
{
STaosQueue
*
tWorkerAllocQueue
(
S
QWorkerPool
*
pool
,
void
*
ahandle
,
FItem
fp
,
ThreadFp
threadF
p
)
{
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)
...
@@ -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
;
S
Q
Worker
*
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
)
tWorkerT
hreadFp
,
worker
)
!=
0
)
{
if
(
pthread_create
(
&
worker
->
thread
,
&
thAttr
,
t
hreadFp
,
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)
...
@@ -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
);
}
void
tFWorkerCleanup
(
SFWorkerPool
*
pool
)
{
tQWorkerCleanup
(
pool
);
}
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
->
nextId
=
0
;
pool
->
workers
=
calloc
(
sizeof
(
SMWorker
),
pool
->
max
);
pool
->
workers
=
calloc
(
sizeof
(
SWWorker
),
pool
->
max
);
if
(
pool
->
workers
==
NULL
)
return
-
1
;
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
)
{
S
M
Worker
*
worker
=
pool
->
workers
+
i
;
S
W
Worker
*
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) {
...
@@ -144,16 +211,18 @@ int32_t tMWorkerInit(SMWorkerPool *pool) {
return
0
;
return
0
;
}
}
void
t
MWorkerCleanup
(
SM
WorkerPool
*
pool
)
{
void
t
WWorkerCleanup
(
SW
WorkerPool
*
pool
)
{
for
(
int32_t
i
=
0
;
i
<
pool
->
max
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
pool
->
max
;
++
i
)
{
S
M
Worker
*
worker
=
pool
->
workers
+
i
;
S
W
Worker
*
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
)
{
S
M
Worker
*
worker
=
pool
->
workers
+
i
;
S
W
Worker
*
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,12 +236,12 @@ void tMWorkerCleanup(SMWorkerPool *pool) {
...
@@ -167,12 +236,12 @@ void tMWorkerCleanup(SMWorkerPool *pool) {
uInfo
(
"worker:%s is closed"
,
pool
->
name
);
uInfo
(
"worker:%s is closed"
,
pool
->
name
);
}
}
static
void
*
tW
riteWorkerThreadFp
(
SM
Worker
*
worker
)
{
static
void
*
tW
WorkerThreadFp
(
SW
Worker
*
worker
)
{
S
M
WorkerPool
*
pool
=
worker
->
pool
;
S
W
WorkerPool
*
pool
=
worker
->
pool
;
F
ProcessItems
fp
=
NULL
;
F
Items
fp
=
NULL
;
void
*
msg
=
NULL
;
void
*
msg
=
NULL
;
void
*
ahandle
=
NULL
;
void
*
ahandle
=
NULL
;
int32_t
numOfMsgs
=
0
;
int32_t
numOfMsgs
=
0
;
int32_t
qtype
=
0
;
int32_t
qtype
=
0
;
...
@@ -187,7 +256,7 @@ static void *tWriteWorkerThreadFp(SMWorker *worker) {
...
@@ -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) {
...
@@ -195,13 +264,14 @@ static void *tWriteWorkerThreadFp(SMWorker *worker) {
return
NULL
;
return
NULL
;
}
}
STaosQueue
*
t
MWorkerAllocQueue
(
SMWorkerPool
*
pool
,
void
*
ahandle
,
FProcess
Items
fp
)
{
STaosQueue
*
t
WWorkerAllocQueue
(
SWWorkerPool
*
pool
,
void
*
ahandle
,
F
Items
fp
)
{
pthread_mutex_lock
(
&
pool
->
mutex
);
pthread_mutex_lock
(
&
pool
->
mutex
);
S
M
Worker
*
worker
=
pool
->
workers
+
pool
->
nextId
;
S
W
Worker
*
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
...
@@ -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
)
tW
rite
WorkerThreadFp
,
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
...
@@ -250,7 +322,7 @@ STaosQueue *tMWorkerAllocQueue(SMWorkerPool *pool, void *ahandle, FProcessItems
return
queue
;
return
queue
;
}
}
void
t
MWorkerFreeQueue
(
SM
WorkerPool
*
pool
,
STaosQueue
*
queue
)
{
void
t
WWorkerFreeQueue
(
SW
WorkerPool
*
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
);
}
}
tests/script/tsim/dnode/basic1.sim
浏览文件 @
9db65e7a
...
@@ -178,9 +178,9 @@ if $rows != 3 then
...
@@ -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;
...
...
tests/script/tsim/table/basic1.sim
浏览文件 @
9db65e7a
...
@@ -139,9 +139,9 @@ endi
...
@@ -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
...
@@ -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
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录