Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
517e587c
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1187
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看板
提交
517e587c
编写于
4月 07, 2022
作者:
S
shenglian zhou
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
udfd exit and restart processing
上级
708668d0
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
75 addition
and
10 deletion
+75
-10
source/libs/function/inc/tudf.h
source/libs/function/inc/tudf.h
+5
-0
source/libs/function/src/tudf.c
source/libs/function/src/tudf.c
+70
-10
未找到文件。
source/libs/function/inc/tudf.h
浏览文件 @
517e587c
...
...
@@ -22,6 +22,11 @@ extern "C" {
//======================================================================================
//begin API to taosd and qworker
enum
{
UDFC_CODE_STOPPING
=
-
1
,
UDFC_CODE_RESTARTING
=
-
2
,
};
/**
* start udf dameon service
* @return error code
...
...
source/libs/function/src/tudf.c
浏览文件 @
517e587c
...
...
@@ -22,9 +22,9 @@
//TODO: udfd restart when exist or aborts
//TODO: network error processing.
//TODO: add unit test
//TODO: add lua support
void
onUdfcRead
(
uv_stream_t
*
client
,
ssize_t
nread
,
const
uv_buf_t
*
buf
);
int32_t
destructUdfService
();
int32_t
constructUdfService
();
enum
{
UV_TASK_CONNECT
=
0
,
UV_TASK_REQ_RSP
=
1
,
...
...
@@ -103,14 +103,22 @@ uv_async_t gUdfLoopStopAsync;
uv_mutex_t
gUdfTaskQueueMutex
;
int64_t
gUdfTaskSeqNum
=
0
;
enum
{
UDFC_STATE_INITAL
=
0
,
// initial state
UDFC_STATE_STARTNG
,
// starting after startUdfService
UDFC_STATE_READY
,
// started and begin to receive quests
UDFC_STATE_RESTARTING
,
// udfd abnormal exit. cleaning up and restart.
UDFC_STATE_STOPPING
,
// stopping after stopUdfService
UDFC_STATUS_FINAL
,
// stopped
};
int8_t
gUdfcState
=
UDFC_STATE_INITAL
;
//double circular linked list
typedef
SClientUvTaskNode
*
SClientUvTaskQueue
;
SClientUvTaskNode
gUdfQueueNode
;
SClientUvTaskQueue
gUdfTaskQueue
=
&
gUdfQueueNode
;
//add SClientUvTaskNode task that close conn
//TODO: deal with uv task that has been started and then udfd core dumped
void
udfTaskQueueInit
(
SClientUvTaskQueue
q
)
{
q
->
next
=
q
;
...
...
@@ -465,6 +473,18 @@ void onUdfdExit(uv_process_t *req, int64_t exit_status, int term_signal) {
debugPrint
(
"Process exited with status %"
PRId64
", signal %d"
,
exit_status
,
term_signal
);
uv_close
((
uv_handle_t
*
)
req
,
NULL
);
//TODO: restart the udfd process
if
(
gUdfcState
==
UDFC_STATE_STOPPING
)
{
if
(
term_signal
!=
SIGINT
)
{
//TODO: log error
}
}
if
(
gUdfcState
==
UDFC_STATE_READY
)
{
gUdfcState
=
UDFC_STATE_RESTARTING
;
//TODO: asynchronous without blocking. how to do it
destructUdfService
();
constructUdfService
();
}
}
void
onUdfcPipeClose
(
uv_handle_t
*
handle
)
{
...
...
@@ -602,7 +622,7 @@ void udfcUvHandleRsp(SClientUvConn *conn) {
udfTaskQueueRemoveTask
(
taskFound
);
uv_sem_post
(
&
taskFound
->
taskSem
);
}
else
{
//LOG error
//
TODO:
LOG error
}
connBuf
->
buf
=
NULL
;
connBuf
->
total
=
-
1
;
...
...
@@ -777,10 +797,32 @@ void udfClientAsyncCb(uv_async_t *async) {
}
void
udfStopAsyncCb
(
uv_async_t
*
async
)
{
SClientUvTaskNode
node
;
SClientUvTaskQueue
q
=
&
node
;
udfTaskQueueInit
(
q
);
uv_mutex_lock
(
&
gUdfTaskQueueMutex
);
udfTaskQueueMove
(
gUdfTaskQueue
,
q
);
uv_mutex_unlock
(
&
gUdfTaskQueueMutex
);
while
(
!
udfTaskQueueIsEmpty
(
q
))
{
SClientUvTaskNode
*
task
=
udfTaskQueueHeadTask
(
q
);
udfTaskQueueRemoveTask
(
task
);
if
(
gUdfcState
==
UDFC_STATE_STOPPING
)
{
task
->
errCode
=
UDFC_CODE_STOPPING
;
}
else
if
(
gUdfcState
==
UDFC_STATE_RESTARTING
)
{
task
->
errCode
=
UDFC_CODE_RESTARTING
;
}
uv_sem_post
(
&
task
->
taskSem
);
}
// TODO: deal with tasks that are waiting result.
uv_stop
(
&
gUdfdLoop
);
uv_loop_close
(
&
gUdfdLoop
);
}
void
startUdfd
(
void
*
argsThread
)
{
uv_loop_init
(
&
gUdfdLoop
);
...
...
@@ -805,25 +847,43 @@ void startUdfd(void *argsThread) {
uv_mutex_init
(
&
gUdfTaskQueueMutex
);
udfTaskQueueInit
(
gUdfTaskQueue
);
uv_barrier_wait
(
&
gUdfInitBarrier
);
//TODO return value of uv_run
uv_run
(
&
gUdfdLoop
,
UV_RUN_DEFAULT
);
uv_loop_close
(
&
gUdfdLoop
);
}
int32_t
star
tUdfService
()
{
int32_t
construc
tUdfService
()
{
uv_barrier_init
(
&
gUdfInitBarrier
,
2
);
uv_thread_create
(
&
gUdfLoopThread
,
startUdfd
,
0
);
uv_barrier_wait
(
&
gUdfInitBarrier
);
return
0
;
}
int32_t
stopUdfService
()
{
int32_t
startUdfService
()
{
gUdfcState
=
UDFC_STATE_STARTNG
;
constructUdfService
();
gUdfcState
=
UDFC_STATE_READY
;
return
0
;
}
int32_t
destructUdfService
()
{
uv_barrier_destroy
(
&
gUdfInitBarrier
);
uv_process_kill
(
&
gUdfdProcess
,
SIGINT
);
if
(
gUdfcState
==
UDFC_STATE_STOPPING
)
{
uv_process_kill
(
&
gUdfdProcess
,
SIGINT
);
}
uv_async_send
(
&
gUdfLoopStopAsync
);
uv_mutex_destroy
(
&
gUdfTaskQueueMutex
);
uv_thread_join
(
&
gUdfLoopThread
);
return
0
;
}
int32_t
stopUdfService
()
{
gUdfcState
=
UDFC_STATE_STOPPING
;
destructUdfService
();
gUdfcState
=
UDFC_STATUS_FINAL
;
return
0
;
}
int32_t
udfcRunUvTask
(
SClientUdfTask
*
task
,
int8_t
uvTaskType
)
{
SClientUvTaskNode
*
uvTask
=
NULL
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录