Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
3edb51d1
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
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看板
提交
3edb51d1
编写于
1月 07, 2022
作者:
D
dapan1121
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feature/qnode
上级
d37352dd
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
126 addition
and
147 deletion
+126
-147
source/libs/scheduler/inc/schedulerInt.h
source/libs/scheduler/inc/schedulerInt.h
+0
-1
source/libs/scheduler/src/scheduler.c
source/libs/scheduler/src/scheduler.c
+126
-146
未找到文件。
source/libs/scheduler/inc/schedulerInt.h
浏览文件 @
3edb51d1
...
...
@@ -84,7 +84,6 @@ typedef struct SSchJobAttr {
typedef
struct
SSchJob
{
uint64_t
queryId
;
SSchJobAttr
attr
;
int32_t
levelNum
;
void
*
transport
;
SArray
*
nodeList
;
// qnode/vnode list, element is SQueryNodeAddr
...
...
source/libs/scheduler/src/scheduler.c
浏览文件 @
3edb51d1
...
...
@@ -20,109 +20,106 @@
static
SSchedulerMgmt
schMgmt
=
{
0
};
int32_t
schBuildTaskRalation
(
SSchJob
*
j
ob
,
SHashObj
*
planToTask
)
{
for
(
int32_t
i
=
0
;
i
<
j
ob
->
levelNum
;
++
i
)
{
SSchLevel
*
level
=
taosArrayGet
(
j
ob
->
levels
,
i
);
static
int32_t
schBuildTaskRalation
(
SSchJob
*
pJ
ob
,
SHashObj
*
planToTask
)
{
for
(
int32_t
i
=
0
;
i
<
pJ
ob
->
levelNum
;
++
i
)
{
SSchLevel
*
pLevel
=
taosArrayGet
(
pJ
ob
->
levels
,
i
);
for
(
int32_t
m
=
0
;
m
<
l
evel
->
taskNum
;
++
m
)
{
SSchTask
*
task
=
taosArrayGet
(
l
evel
->
subTasks
,
m
);
SSubplan
*
p
lan
=
t
ask
->
plan
;
int32_t
childNum
=
p
lan
->
pChildren
?
(
int32_t
)
taosArrayGetSize
(
p
lan
->
pChildren
)
:
0
;
int32_t
parentNum
=
p
lan
->
pParents
?
(
int32_t
)
taosArrayGetSize
(
p
lan
->
pParents
)
:
0
;
for
(
int32_t
m
=
0
;
m
<
pL
evel
->
taskNum
;
++
m
)
{
SSchTask
*
pTask
=
taosArrayGet
(
pL
evel
->
subTasks
,
m
);
SSubplan
*
p
Plan
=
pT
ask
->
plan
;
int32_t
childNum
=
p
Plan
->
pChildren
?
(
int32_t
)
taosArrayGetSize
(
pP
lan
->
pChildren
)
:
0
;
int32_t
parentNum
=
p
Plan
->
pParents
?
(
int32_t
)
taosArrayGetSize
(
pP
lan
->
pParents
)
:
0
;
if
(
childNum
>
0
)
{
t
ask
->
children
=
taosArrayInit
(
childNum
,
POINTER_BYTES
);
if
(
NULL
==
t
ask
->
children
)
{
qError
(
"taosArrayInit %d
failed"
,
childNum
);
pT
ask
->
children
=
taosArrayInit
(
childNum
,
POINTER_BYTES
);
if
(
NULL
==
pT
ask
->
children
)
{
SCH_TASK_ELOG
(
"taosArrayInit %d children
failed"
,
childNum
);
SCH_ERR_RET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
}
for
(
int32_t
n
=
0
;
n
<
childNum
;
++
n
)
{
SSubplan
**
child
=
taosArrayGet
(
plan
->
pChildren
,
n
);
SSubplan
**
child
=
taosArrayGet
(
p
P
lan
->
pChildren
,
n
);
SSchTask
**
childTask
=
taosHashGet
(
planToTask
,
child
,
POINTER_BYTES
);
if
(
NULL
==
childTask
||
NULL
==
*
childTask
)
{
qError
(
"subpla
n relationship error, level:%d, taskIdx:%d, childIdx:%d"
,
i
,
m
,
n
);
SCH_TASK_ELOG
(
"subplan childre
n relationship error, level:%d, taskIdx:%d, childIdx:%d"
,
i
,
m
,
n
);
SCH_ERR_RET
(
TSDB_CODE_SCH_INTERNAL_ERROR
);
}
if
(
NULL
==
taosArrayPush
(
t
ask
->
children
,
childTask
))
{
qError
(
"taosArrayPush failed"
);
if
(
NULL
==
taosArrayPush
(
pT
ask
->
children
,
childTask
))
{
SCH_TASK_ELOG
(
"taosArrayPush childTask failed, level:%d, taskIdx:%d, childIdx:%d"
,
i
,
m
,
n
);
SCH_ERR_RET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
}
if
(
parentNum
>
0
)
{
t
ask
->
parents
=
taosArrayInit
(
parentNum
,
POINTER_BYTES
);
if
(
NULL
==
t
ask
->
parents
)
{
qError
(
"taosArrayInit %d
failed"
,
parentNum
);
pT
ask
->
parents
=
taosArrayInit
(
parentNum
,
POINTER_BYTES
);
if
(
NULL
==
pT
ask
->
parents
)
{
SCH_TASK_ELOG
(
"taosArrayInit %d parents
failed"
,
parentNum
);
SCH_ERR_RET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
}
for
(
int32_t
n
=
0
;
n
<
parentNum
;
++
n
)
{
SSubplan
**
parent
=
taosArrayGet
(
plan
->
pParents
,
n
);
SSubplan
**
parent
=
taosArrayGet
(
p
P
lan
->
pParents
,
n
);
SSchTask
**
parentTask
=
taosHashGet
(
planToTask
,
parent
,
POINTER_BYTES
);
if
(
NULL
==
parentTask
||
NULL
==
*
parentTask
)
{
qError
(
"subplan
relationship error, level:%d, taskIdx:%d, childIdx:%d"
,
i
,
m
,
n
);
SCH_TASK_ELOG
(
"subplan parent
relationship error, level:%d, taskIdx:%d, childIdx:%d"
,
i
,
m
,
n
);
SCH_ERR_RET
(
TSDB_CODE_SCH_INTERNAL_ERROR
);
}
if
(
NULL
==
taosArrayPush
(
t
ask
->
parents
,
parentTask
))
{
qError
(
"taosArrayPush failed"
);
if
(
NULL
==
taosArrayPush
(
pT
ask
->
parents
,
parentTask
))
{
SCH_TASK_ELOG
(
"taosArrayPush parentTask failed, level:%d, taskIdx:%d, childIdx:%d"
,
i
,
m
,
n
);
SCH_ERR_RET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
}
}
SCH_TASK_DLOG
(
"level:%d, parentNum:%d, childNum:%d"
,
i
,
parentNum
,
childNum
);
}
}
SSchLevel
*
level
=
taosArrayGet
(
j
ob
->
levels
,
0
);
if
(
job
->
attr
.
queryJob
&&
l
evel
->
taskNum
>
1
)
{
qError
(
"invalid plan info, level 0, taskNum:%d"
,
l
evel
->
taskNum
);
SSchLevel
*
pLevel
=
taosArrayGet
(
pJ
ob
->
levels
,
0
);
if
(
pJob
->
attr
.
queryJob
&&
pL
evel
->
taskNum
>
1
)
{
SCH_JOB_ELOG
(
"invalid query plan, level:0, taskNum:%d"
,
pL
evel
->
taskNum
);
SCH_ERR_RET
(
TSDB_CODE_SCH_INTERNAL_ERROR
);
}
SSchTask
*
task
=
taosArrayGet
(
level
->
subTasks
,
0
);
if
(
task
->
parents
&&
taosArrayGetSize
(
task
->
parents
)
>
0
)
{
qError
(
"invalid plan info, level 0, parentNum:%d"
,
(
int32_t
)
taosArrayGetSize
(
task
->
parents
));
SCH_ERR_RET
(
TSDB_CODE_SCH_INTERNAL_ERROR
);
for
(
int32_t
i
=
0
;
i
<
pLevel
->
taskNum
;
++
i
)
{
SSchTask
*
pTask
=
taosArrayGet
(
pLevel
->
subTasks
,
i
);
if
(
pTask
->
parents
&&
taosArrayGetSize
(
pTask
->
parents
)
>
0
)
{
SCH_TASK_ELOG
(
"invalid task info, level:0, parentNum:%d"
,
(
int32_t
)
taosArrayGetSize
(
pTask
->
parents
));
SCH_ERR_RET
(
TSDB_CODE_SCH_INTERNAL_ERROR
);
}
}
return
TSDB_CODE_SUCCESS
;
}
static
SSchTask
initTask
(
SSchJob
*
pJob
,
SSubplan
*
plan
,
SSchLevel
*
pLevel
)
{
SSchTask
task
=
{
0
};
if
(
plan
->
type
==
QUERY_TYPE_MODIFY
)
{
pJob
->
attr
.
needFetch
=
false
;
}
else
{
pJob
->
attr
.
queryJob
=
true
;
}
task
.
plan
=
plan
;
task
.
level
=
pLevel
;
task
.
status
=
JOB_TASK_STATUS_NOT_START
;
task
.
taskId
=
atomic_add_fetch_64
(
&
schMgmt
.
taskId
,
1
);
static
int32_t
schInitTask
(
SSchJob
*
pJob
,
SSchTask
*
pTask
,
SSubplan
*
pPlan
,
SSchLevel
*
pLevel
)
{
pTask
->
plan
=
pPlan
;
pTask
->
level
=
pLevel
;
pTask
->
status
=
JOB_TASK_STATUS_NOT_START
;
pTask
->
taskId
=
atomic_add_fetch_64
(
&
schMgmt
.
taskId
,
1
);
return
task
;
return
TSDB_CODE_SUCCESS
;
}
static
void
cleanup
Task
(
SSchTask
*
pTask
)
{
static
void
schFree
Task
(
SSchTask
*
pTask
)
{
taosArrayDestroy
(
pTask
->
candidateAddrs
);
}
int32_t
schValidateAndBuildJob
(
SQueryDag
*
dag
,
SSchJob
*
j
ob
)
{
static
int32_t
schValidateAndBuildJob
(
SQueryDag
*
pDag
,
SSchJob
*
pJ
ob
)
{
int32_t
code
=
0
;
job
->
queryId
=
d
ag
->
queryId
;
pJob
->
queryId
=
pD
ag
->
queryId
;
if
(
d
ag
->
numOfSubplans
<=
0
)
{
SCH_JOB_ELOG
(
"invalid subplan num:%d"
,
d
ag
->
numOfSubplans
);
if
(
pD
ag
->
numOfSubplans
<=
0
)
{
SCH_JOB_ELOG
(
"invalid subplan num:%d"
,
pD
ag
->
numOfSubplans
);
SCH_ERR_RET
(
TSDB_CODE_QRY_INVALID_INPUT
);
}
int32_t
levelNum
=
(
int32_t
)
taosArrayGetSize
(
d
ag
->
pSubplans
);
int32_t
levelNum
=
(
int32_t
)
taosArrayGetSize
(
pD
ag
->
pSubplans
);
if
(
levelNum
<=
0
)
{
SCH_JOB_ELOG
(
"invalid level num:%d"
,
levelNum
);
SCH_ERR_RET
(
TSDB_CODE_QRY_INVALID_INPUT
);
...
...
@@ -134,18 +131,16 @@ int32_t schValidateAndBuildJob(SQueryDag *dag, SSchJob *job) {
SCH_ERR_RET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
j
ob
->
levels
=
taosArrayInit
(
levelNum
,
sizeof
(
SSchLevel
));
if
(
NULL
==
j
ob
->
levels
)
{
pJ
ob
->
levels
=
taosArrayInit
(
levelNum
,
sizeof
(
SSchLevel
));
if
(
NULL
==
pJ
ob
->
levels
)
{
SCH_JOB_ELOG
(
"taosArrayInit %d failed"
,
levelNum
);
SCH_ERR_JRET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
job
->
attr
.
needFetch
=
true
;
job
->
levelNum
=
levelNum
;
job
->
levelIdx
=
levelNum
-
1
;
pJob
->
levelNum
=
levelNum
;
pJob
->
levelIdx
=
levelNum
-
1
;
job
->
subPlans
=
d
ag
->
pSubplans
;
pJob
->
subPlans
=
pD
ag
->
pSubplans
;
SSchLevel
level
=
{
0
};
SArray
*
plans
=
NULL
;
...
...
@@ -155,16 +150,16 @@ int32_t schValidateAndBuildJob(SQueryDag *dag, SSchJob *job) {
level
.
status
=
JOB_TASK_STATUS_NOT_START
;
for
(
int32_t
i
=
0
;
i
<
levelNum
;
++
i
)
{
if
(
NULL
==
taosArrayPush
(
j
ob
->
levels
,
&
level
))
{
if
(
NULL
==
taosArrayPush
(
pJ
ob
->
levels
,
&
level
))
{
SCH_JOB_ELOG
(
"taosArrayPush level failed, level:%d"
,
i
);
SCH_ERR_JRET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
pLevel
=
taosArrayGet
(
j
ob
->
levels
,
i
);
pLevel
=
taosArrayGet
(
pJ
ob
->
levels
,
i
);
pLevel
->
level
=
i
;
plans
=
taosArrayGetP
(
d
ag
->
pSubplans
,
i
);
plans
=
taosArrayGetP
(
pD
ag
->
pSubplans
,
i
);
if
(
NULL
==
plans
)
{
SCH_JOB_ELOG
(
"empty level plan, level:%d"
,
i
);
SCH_ERR_JRET
(
TSDB_CODE_QRY_INVALID_INPUT
);
...
...
@@ -186,38 +181,34 @@ int32_t schValidateAndBuildJob(SQueryDag *dag, SSchJob *job) {
for
(
int32_t
n
=
0
;
n
<
taskNum
;
++
n
)
{
SSubplan
*
plan
=
taosArrayGetP
(
plans
,
n
);
if
(
plan
->
type
==
QUERY_TYPE_MODIFY
)
{
job
->
attr
.
needFetch
=
false
;
}
else
{
job
->
attr
.
queryJob
=
true
;
}
SSchTask
task
=
initTask
(
job
,
plan
,
pLevel
);
SCH_SET_JOB_TYPE
(
&
pJob
->
attr
,
plan
->
type
);
SSchTask
task
=
{
0
};
SSchTask
*
pTask
=
&
task
;
schInitTask
(
pJob
,
&
task
,
plan
,
pLevel
);
void
*
p
=
taosArrayPush
(
pLevel
->
subTasks
,
&
task
);
if
(
NULL
==
p
)
{
qError
(
"taosArrayPush failed"
);
SCH_TASK_ELOG
(
"taosArrayPush task to level failed, level:%d, taskIdx:%d"
,
pLevel
->
level
,
n
);
SCH_ERR_JRET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
if
(
0
!=
taosHashPut
(
planToTask
,
&
plan
,
POINTER_BYTES
,
&
p
,
POINTER_BYTES
))
{
qError
(
"taosHashPut failed"
);
SCH_TASK_ELOG
(
"taosHashPut to planToTaks failed, taskIdx:%d"
,
n
);
SCH_ERR_JRET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
}
}
SCH_ERR_JRET
(
schBuildTaskRalation
(
job
,
planToTask
));
SCH_TASK_DLOG
(
"task initialized, level:%d"
,
pLevel
->
level
);
}
if
(
planToTask
)
{
taosHashCleanup
(
planToTask
);
SCH_JOB_DLOG
(
"level initialized, taskNum:%d"
,
taskNum
);
}
return
TSDB_CODE_SUCCESS
;
SCH_ERR_JRET
(
schBuildTaskRalation
(
pJob
,
planToTask
))
;
_return:
if
(
pLevel
->
subTasks
)
{
taosArrayDestroy
(
pLevel
->
subTasks
);
}
if
(
planToTask
)
{
taosHashCleanup
(
planToTask
);
...
...
@@ -226,7 +217,7 @@ _return:
SCH_RET
(
code
);
}
int32_t
schSetTaskCandidateAddrs
(
SSchJob
*
job
,
SSchTask
*
task
)
{
static
int32_t
schSetTaskCandidateAddrs
(
SSchJob
*
job
,
SSchTask
*
task
)
{
if
(
task
->
candidateAddrs
)
{
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -273,7 +264,7 @@ int32_t schSetTaskCandidateAddrs(SSchJob *job, SSchTask *task) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
schPushTaskToExecList
(
SSchJob
*
pJob
,
SSchTask
*
pTask
)
{
static
int32_t
schPushTaskToExecList
(
SSchJob
*
pJob
,
SSchTask
*
pTask
)
{
if
(
0
!=
taosHashPut
(
pJob
->
execTasks
,
&
pTask
->
taskId
,
sizeof
(
pTask
->
taskId
),
&
pTask
,
POINTER_BYTES
))
{
qError
(
"failed to add new task, taskId:0x%"
PRIx64
", reqId:0x"
PRIx64
", out of memory"
,
pJob
->
queryId
);
SCH_ERR_RET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
...
...
@@ -284,7 +275,7 @@ int32_t schPushTaskToExecList(SSchJob *pJob, SSchTask *pTask) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
schMoveTaskToSuccList
(
SSchJob
*
job
,
SSchTask
*
task
,
bool
*
moved
)
{
static
int32_t
schMoveTaskToSuccList
(
SSchJob
*
job
,
SSchTask
*
task
,
bool
*
moved
)
{
if
(
0
!=
taosHashRemove
(
job
->
execTasks
,
&
task
->
taskId
,
sizeof
(
task
->
taskId
)))
{
qError
(
"remove task taskId:0x%"
PRIx64
" from execTasks failed, reqId:0x%"
PRIx64
,
task
->
taskId
,
job
->
queryId
);
return
TSDB_CODE_SUCCESS
;
...
...
@@ -300,7 +291,7 @@ int32_t schMoveTaskToSuccList(SSchJob *job, SSchTask *task, bool *moved) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
schMoveTaskToFailList
(
SSchJob
*
job
,
SSchTask
*
task
,
bool
*
moved
)
{
static
int32_t
schMoveTaskToFailList
(
SSchJob
*
job
,
SSchTask
*
task
,
bool
*
moved
)
{
if
(
0
!=
taosHashRemove
(
job
->
execTasks
,
&
task
->
taskId
,
sizeof
(
task
->
taskId
)))
{
qWarn
(
"remove task[%"
PRIx64
"] from execTasks failed, it may not exist"
,
task
->
taskId
);
}
...
...
@@ -315,7 +306,7 @@ int32_t schMoveTaskToFailList(SSchJob *job, SSchTask *task, bool *moved) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
schTaskCheckAndSetRetry
(
SSchJob
*
job
,
SSchTask
*
task
,
int32_t
errCode
,
bool
*
needRetry
)
{
static
int32_t
schTaskCheckAndSetRetry
(
SSchJob
*
job
,
SSchTask
*
task
,
int32_t
errCode
,
bool
*
needRetry
)
{
// TODO set retry or not based on task type/errCode/retry times/job status/available eps...
// TODO if needRetry, set task retry info
...
...
@@ -325,7 +316,7 @@ int32_t schTaskCheckAndSetRetry(SSchJob *job, SSchTask *task, int32_t errCode, b
}
int32_t
schFetchFromRemote
(
SSchJob
*
job
)
{
static
int32_t
schFetchFromRemote
(
SSchJob
*
job
)
{
int32_t
code
=
0
;
if
(
atomic_val_compare_exchange_32
(
&
job
->
remoteFetch
,
0
,
1
)
!=
0
)
{
...
...
@@ -344,11 +335,11 @@ _return:
}
int32_t
schProcessOnJobPartialSuccess
(
SSchJob
*
job
)
{
static
int32_t
schProcessOnJobPartialSuccess
(
SSchJob
*
job
)
{
job
->
status
=
JOB_TASK_STATUS_PARTIAL_SUCCEED
;
bool
needFetch
=
job
->
userFetch
;
if
((
!
job
->
attr
.
needFetch
)
&&
job
->
attr
.
syncSchedule
)
{
if
((
!
SCH_JOB_NEED_FETCH
(
&
job
->
attr
)
)
&&
job
->
attr
.
syncSchedule
)
{
tsem_post
(
&
job
->
rspSem
);
}
...
...
@@ -359,27 +350,27 @@ int32_t schProcessOnJobPartialSuccess(SSchJob *job) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
schProcessOnJobFailure
(
SSchJob
*
job
,
int32_t
errCode
)
{
static
int32_t
schProcessOnJobFailure
(
SSchJob
*
job
,
int32_t
errCode
)
{
job
->
status
=
JOB_TASK_STATUS_FAILED
;
job
->
errCode
=
errCode
;
atomic_val_compare_exchange_32
(
&
job
->
remoteFetch
,
1
,
0
);
if
(
job
->
userFetch
||
((
!
job
->
attr
.
needFetch
)
&&
job
->
attr
.
syncSchedule
))
{
if
(
job
->
userFetch
||
((
!
SCH_JOB_NEED_FETCH
(
&
job
->
attr
)
)
&&
job
->
attr
.
syncSchedule
))
{
tsem_post
(
&
job
->
rspSem
);
}
return
TSDB_CODE_SUCCESS
;
}
int32_t
schProcessOnDataFetched
(
SSchJob
*
job
)
{
static
int32_t
schProcessOnDataFetched
(
SSchJob
*
job
)
{
atomic_val_compare_exchange_32
(
&
job
->
remoteFetch
,
1
,
0
);
tsem_post
(
&
job
->
rspSem
);
}
int32_t
schProcessOnTaskSuccess
(
SSchJob
*
job
,
SSchTask
*
task
)
{
static
int32_t
schProcessOnTaskSuccess
(
SSchJob
*
job
,
SSchTask
*
task
)
{
bool
moved
=
false
;
SCH_ERR_RET
(
schMoveTaskToSuccList
(
job
,
task
,
&
moved
));
...
...
@@ -451,7 +442,7 @@ int32_t schProcessOnTaskSuccess(SSchJob *job, SSchTask *task) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
schProcessOnTaskFailure
(
SSchJob
*
job
,
SSchTask
*
task
,
int32_t
errCode
)
{
static
int32_t
schProcessOnTaskFailure
(
SSchJob
*
job
,
SSchTask
*
task
,
int32_t
errCode
)
{
bool
needRetry
=
false
;
bool
moved
=
false
;
int32_t
taskDone
=
0
;
...
...
@@ -488,7 +479,7 @@ int32_t schProcessOnTaskFailure(SSchJob *job, SSchTask *task, int32_t errCode) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
schProcessRspMsg
(
SSchJob
*
job
,
SSchTask
*
task
,
int32_t
msgType
,
char
*
msg
,
int32_t
msgSize
,
int32_t
rspCode
)
{
static
int32_t
schProcessRspMsg
(
SSchJob
*
job
,
SSchTask
*
task
,
int32_t
msgType
,
char
*
msg
,
int32_t
msgSize
,
int32_t
rspCode
)
{
int32_t
code
=
0
;
switch
(
msgType
)
{
...
...
@@ -576,7 +567,7 @@ _return:
}
int32_t
schHandleCallback
(
void
*
param
,
const
SDataBuf
*
pMsg
,
int32_t
msgType
,
int32_t
rspCode
)
{
static
int32_t
schHandleCallback
(
void
*
param
,
const
SDataBuf
*
pMsg
,
int32_t
msgType
,
int32_t
rspCode
)
{
int32_t
code
=
0
;
SSchCallbackParam
*
pParam
=
(
SSchCallbackParam
*
)
param
;
...
...
@@ -602,32 +593,32 @@ _return:
SCH_RET
(
code
);
}
int32_t
schHandleSubmitCallback
(
void
*
param
,
const
SDataBuf
*
pMsg
,
int32_t
code
)
{
static
int32_t
schHandleSubmitCallback
(
void
*
param
,
const
SDataBuf
*
pMsg
,
int32_t
code
)
{
return
schHandleCallback
(
param
,
pMsg
,
TDMT_VND_SUBMIT_RSP
,
code
);
}
int32_t
schHandleCreateTableCallback
(
void
*
param
,
const
SDataBuf
*
pMsg
,
int32_t
code
)
{
static
int32_t
schHandleCreateTableCallback
(
void
*
param
,
const
SDataBuf
*
pMsg
,
int32_t
code
)
{
return
schHandleCallback
(
param
,
pMsg
,
TDMT_VND_CREATE_TABLE_RSP
,
code
);
}
int32_t
schHandleQueryCallback
(
void
*
param
,
const
SDataBuf
*
pMsg
,
int32_t
code
)
{
static
int32_t
schHandleQueryCallback
(
void
*
param
,
const
SDataBuf
*
pMsg
,
int32_t
code
)
{
return
schHandleCallback
(
param
,
pMsg
,
TDMT_VND_QUERY_RSP
,
code
);
}
int32_t
schHandleFetchCallback
(
void
*
param
,
const
SDataBuf
*
pMsg
,
int32_t
code
)
{
static
int32_t
schHandleFetchCallback
(
void
*
param
,
const
SDataBuf
*
pMsg
,
int32_t
code
)
{
return
schHandleCallback
(
param
,
pMsg
,
TDMT_VND_FETCH_RSP
,
code
);
}
int32_t
schHandleReadyCallback
(
void
*
param
,
const
SDataBuf
*
pMsg
,
int32_t
code
)
{
static
int32_t
schHandleReadyCallback
(
void
*
param
,
const
SDataBuf
*
pMsg
,
int32_t
code
)
{
return
schHandleCallback
(
param
,
pMsg
,
TDMT_VND_RES_READY_RSP
,
code
);
}
int32_t
schHandleDropCallback
(
void
*
param
,
const
SDataBuf
*
pMsg
,
int32_t
code
)
{
static
int32_t
schHandleDropCallback
(
void
*
param
,
const
SDataBuf
*
pMsg
,
int32_t
code
)
{
SSchCallbackParam
*
pParam
=
(
SSchCallbackParam
*
)
param
;
qDebug
(
"drop task rsp received, queryId:%"
PRIx64
",taksId:%"
PRIx64
",code:%d"
,
pParam
->
queryId
,
pParam
->
taskId
,
code
);
}
int32_t
schGetCallbackFp
(
int32_t
msgType
,
__async_send_cb_fn_t
*
fp
)
{
static
int32_t
schGetCallbackFp
(
int32_t
msgType
,
__async_send_cb_fn_t
*
fp
)
{
switch
(
msgType
)
{
case
TDMT_VND_CREATE_TABLE
:
*
fp
=
schHandleCreateTableCallback
;
...
...
@@ -656,7 +647,7 @@ int32_t schGetCallbackFp(int32_t msgType, __async_send_cb_fn_t *fp) {
}
int32_t
schAsyncSendMsg
(
void
*
transport
,
SEpSet
*
epSet
,
uint64_t
qId
,
uint64_t
tId
,
int32_t
msgType
,
void
*
msg
,
uint32_t
msgSize
)
{
static
int32_t
schAsyncSendMsg
(
void
*
transport
,
SEpSet
*
epSet
,
uint64_t
qId
,
uint64_t
tId
,
int32_t
msgType
,
void
*
msg
,
uint32_t
msgSize
)
{
int32_t
code
=
0
;
SMsgSendInfo
*
pMsgSendInfo
=
calloc
(
1
,
sizeof
(
SMsgSendInfo
));
if
(
NULL
==
pMsgSendInfo
)
{
...
...
@@ -695,7 +686,7 @@ _return:
SCH_RET
(
code
);
}
void
schConvertAddrToEpSet
(
SQueryNodeAddr
*
addr
,
SEpSet
*
epSet
)
{
static
void
schConvertAddrToEpSet
(
SQueryNodeAddr
*
addr
,
SEpSet
*
epSet
)
{
epSet
->
inUse
=
addr
->
inUse
;
epSet
->
numOfEps
=
addr
->
numOfEps
;
...
...
@@ -706,7 +697,7 @@ void schConvertAddrToEpSet(SQueryNodeAddr *addr, SEpSet *epSet) {
}
int32_t
schBuildAndSendMsg
(
SSchJob
*
job
,
SSchTask
*
task
,
int32_t
msgType
)
{
static
int32_t
schBuildAndSendMsg
(
SSchJob
*
job
,
SSchTask
*
task
,
int32_t
msgType
)
{
uint32_t
msgSize
=
0
;
void
*
msg
=
NULL
;
int32_t
code
=
0
;
...
...
@@ -819,7 +810,7 @@ _return:
}
int32_t
schLaunchTask
(
SSchJob
*
job
,
SSchTask
*
task
)
{
static
int32_t
schLaunchTask
(
SSchJob
*
job
,
SSchTask
*
task
)
{
SSubplan
*
plan
=
task
->
plan
;
SCH_ERR_RET
(
qSubPlanToString
(
plan
,
&
task
->
msg
,
&
task
->
msgLen
));
SCH_ERR_RET
(
schSetTaskCandidateAddrs
(
job
,
task
));
...
...
@@ -837,7 +828,7 @@ int32_t schLaunchTask(SSchJob *job, SSchTask *task) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
schLaunchJob
(
SSchJob
*
job
)
{
static
int32_t
schLaunchJob
(
SSchJob
*
job
)
{
SSchLevel
*
level
=
taosArrayGet
(
job
->
levels
,
job
->
levelIdx
);
for
(
int32_t
i
=
0
;
i
<
level
->
taskNum
;
++
i
)
{
SSchTask
*
task
=
taosArrayGet
(
level
->
subTasks
,
i
);
...
...
@@ -849,7 +840,7 @@ int32_t schLaunchJob(SSchJob *job) {
return
TSDB_CODE_SUCCESS
;
}
void
schDropJobAllTasks
(
SSchJob
*
job
)
{
static
void
schDropJobAllTasks
(
SSchJob
*
job
)
{
void
*
pIter
=
taosHashIterate
(
job
->
succTasks
,
NULL
);
while
(
pIter
)
{
SSchTask
*
task
=
*
(
SSchTask
**
)
pIter
;
...
...
@@ -877,82 +868,71 @@ void schDropJobAllTasks(SSchJob *job) {
}
}
uint64_t
schGenSchId
(
void
)
{
uint64_t
sId
=
0
;
// TODO
qDebug
(
"Gen sId:0x%"
PRIx64
,
sId
);
return
sId
;
}
int32_t
schExecJobImpl
(
void
*
transport
,
SArray
*
nodeList
,
SQueryDag
*
pDag
,
void
**
pJob
,
bool
syncSchedule
)
{
static
int32_t
schExecJobImpl
(
void
*
transport
,
SArray
*
nodeList
,
SQueryDag
*
pDag
,
void
**
job
,
bool
syncSchedule
)
{
if
(
nodeList
&&
taosArrayGetSize
(
nodeList
)
<=
0
)
{
qInfo
(
"QID:%"
PRIx64
" input nodeList is empty"
,
pDag
->
queryId
);
}
int32_t
code
=
0
;
SSchJob
*
j
ob
=
calloc
(
1
,
sizeof
(
SSchJob
));
if
(
NULL
==
j
ob
)
{
SSchJob
*
pJ
ob
=
calloc
(
1
,
sizeof
(
SSchJob
));
if
(
NULL
==
pJ
ob
)
{
qError
(
"QID:%"
PRIx64
" calloc %d failed"
,
sizeof
(
SSchJob
));
SCH_ERR_RET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
j
ob
->
attr
.
syncSchedule
=
syncSchedule
;
j
ob
->
transport
=
transport
;
j
ob
->
nodeList
=
nodeList
;
pJ
ob
->
attr
.
syncSchedule
=
syncSchedule
;
pJ
ob
->
transport
=
transport
;
pJ
ob
->
nodeList
=
nodeList
;
SCH_ERR_JRET
(
schValidateAndBuildJob
(
pDag
,
j
ob
));
SCH_ERR_JRET
(
schValidateAndBuildJob
(
pDag
,
pJ
ob
));
j
ob
->
execTasks
=
taosHashInit
(
pDag
->
numOfSubplans
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_UBIGINT
),
false
,
HASH_ENTRY_LOCK
);
if
(
NULL
==
j
ob
->
execTasks
)
{
qError
(
"taosHashInit %d
failed"
,
pDag
->
numOfSubplans
);
pJ
ob
->
execTasks
=
taosHashInit
(
pDag
->
numOfSubplans
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_UBIGINT
),
false
,
HASH_ENTRY_LOCK
);
if
(
NULL
==
pJ
ob
->
execTasks
)
{
SCH_JOB_ELOG
(
"taosHashInit %d execTasks
failed"
,
pDag
->
numOfSubplans
);
SCH_ERR_JRET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
j
ob
->
succTasks
=
taosHashInit
(
pDag
->
numOfSubplans
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_UBIGINT
),
false
,
HASH_ENTRY_LOCK
);
if
(
NULL
==
j
ob
->
succTasks
)
{
qError
(
"taosHashInit %d
failed"
,
pDag
->
numOfSubplans
);
pJ
ob
->
succTasks
=
taosHashInit
(
pDag
->
numOfSubplans
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_UBIGINT
),
false
,
HASH_ENTRY_LOCK
);
if
(
NULL
==
pJ
ob
->
succTasks
)
{
SCH_JOB_ELOG
(
"taosHashInit %d succTasks
failed"
,
pDag
->
numOfSubplans
);
SCH_ERR_JRET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
j
ob
->
failTasks
=
taosHashInit
(
pDag
->
numOfSubplans
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_UBIGINT
),
false
,
HASH_ENTRY_LOCK
);
if
(
NULL
==
j
ob
->
failTasks
)
{
qError
(
"taosHashInit %d
failed"
,
pDag
->
numOfSubplans
);
pJ
ob
->
failTasks
=
taosHashInit
(
pDag
->
numOfSubplans
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_UBIGINT
),
false
,
HASH_ENTRY_LOCK
);
if
(
NULL
==
pJ
ob
->
failTasks
)
{
SCH_JOB_ELOG
(
"taosHashInit %d failTasks
failed"
,
pDag
->
numOfSubplans
);
SCH_ERR_JRET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
tsem_init
(
&
j
ob
->
rspSem
,
0
,
0
);
tsem_init
(
&
pJ
ob
->
rspSem
,
0
,
0
);
code
=
taosHashPut
(
schMgmt
.
jobs
,
&
job
->
queryId
,
sizeof
(
job
->
queryId
),
&
j
ob
,
POINTER_BYTES
);
code
=
taosHashPut
(
schMgmt
.
jobs
,
&
pJob
->
queryId
,
sizeof
(
pJob
->
queryId
),
&
pJ
ob
,
POINTER_BYTES
);
if
(
0
!=
code
)
{
if
(
HASH_NODE_EXIST
(
code
))
{
qError
(
"taosHashPut queryId:0x%"
PRIx64
" already exist"
,
job
->
queryId
);
SCH_JOB_ELOG
(
"job already exist, type:%d"
,
pJob
->
attr
.
queryJob
);
SCH_ERR_JRET
(
TSDB_CODE_QRY_INVALID_INPUT
);
}
else
{
qError
(
"taosHashPut queryId:0x%"
PRIx64
" failed"
,
j
ob
->
queryId
);
qError
(
"taosHashPut queryId:0x%"
PRIx64
" failed"
,
pJ
ob
->
queryId
);
SCH_ERR_JRET
(
TSDB_CODE_SCH_INTERNAL_ERROR
);
}
}
j
ob
->
status
=
JOB_TASK_STATUS_NOT_START
;
SCH_ERR_JRET
(
schLaunchJob
(
j
ob
));
pJ
ob
->
status
=
JOB_TASK_STATUS_NOT_START
;
SCH_ERR_JRET
(
schLaunchJob
(
pJ
ob
));
*
(
SSchJob
**
)
pJob
=
j
ob
;
*
(
SSchJob
**
)
job
=
pJ
ob
;
if
(
syncSchedule
)
{
tsem_wait
(
&
j
ob
->
rspSem
);
tsem_wait
(
&
pJ
ob
->
rspSem
);
}
return
TSDB_CODE_SUCCESS
;
_return:
*
(
SSchJob
**
)
pJob
=
NULL
;
scheduleFreeJob
(
job
);
*
(
SSchJob
**
)
job
=
NULL
;
scheduleFreeJob
(
pJob
);
SCH_RET
(
code
);
}
...
...
@@ -1022,7 +1002,7 @@ int32_t scheduleFetchRows(void *pJob, void **data) {
SSchJob
*
job
=
pJob
;
int32_t
code
=
0
;
if
(
!
job
->
attr
.
needFetch
)
{
if
(
!
SCH_JOB_NEED_FETCH
(
&
job
->
attr
)
)
{
qError
(
"no need to fetch data"
);
SCH_ERR_RET
(
TSDB_CODE_QRY_APP_ERROR
);
}
...
...
@@ -1101,7 +1081,7 @@ void scheduleFreeJob(void *pJob) {
int32_t
numOfTasks
=
taosArrayGetSize
(
pLevel
->
subTasks
);
for
(
int32_t
j
=
0
;
j
<
numOfTasks
;
++
j
)
{
SSchTask
*
pTask
=
taosArrayGet
(
pLevel
->
subTasks
,
j
);
cleanup
Task
(
pTask
);
schFree
Task
(
pTask
);
}
taosArrayDestroy
(
pLevel
->
subTasks
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录