Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
1a0c9f31
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
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看板
提交
1a0c9f31
编写于
4月 17, 2023
作者:
S
shenglian zhou
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
enhance: refactor cleanup udf function
上级
430457e5
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
42 addition
and
30 deletion
+42
-30
source/libs/function/src/tudf.c
source/libs/function/src/tudf.c
+42
-30
未找到文件。
source/libs/function/src/tudf.c
浏览文件 @
1a0c9f31
...
...
@@ -968,6 +968,8 @@ bool udfAggInit(struct SqlFunctionCtx *pCtx, struct SResultRowEntryInfo *pRes
int32_t
udfAggProcess
(
struct
SqlFunctionCtx
*
pCtx
);
int32_t
udfAggFinalize
(
struct
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
);
void
cleanupNotExpiredUdfs
();
void
cleanupExpiredUdfs
();
int
compareUdfcFuncSub
(
const
void
*
elem1
,
const
void
*
elem2
)
{
SUdfcFuncStub
*
stub1
=
(
SUdfcFuncStub
*
)
elem1
;
SUdfcFuncStub
*
stub2
=
(
SUdfcFuncStub
*
)
elem2
;
...
...
@@ -1040,62 +1042,72 @@ void releaseUdfFuncHandle(char *udfName, UdfcFuncHandle handle) {
uv_mutex_unlock
(
&
gUdfcProxy
.
udfStubsMutex
);
}
int32_t
cleanUpUdfs
()
{
int8_t
initialized
=
atomic_load_8
(
&
gUdfcProxy
.
initialized
);
if
(
!
initialized
)
{
return
TSDB_CODE_SUCCESS
;
}
uv_mutex_lock
(
&
gUdfcProxy
.
udfStubsMutex
);
if
((
gUdfcProxy
.
udfStubs
==
NULL
||
taosArrayGetSize
(
gUdfcProxy
.
udfStubs
)
==
0
)
&&
(
gUdfcProxy
.
expiredUdfStubs
==
NULL
||
taosArrayGetSize
(
gUdfcProxy
.
expiredUdfStubs
)
==
0
))
{
uv_mutex_unlock
(
&
gUdfcProxy
.
udfStubsMutex
);
return
TSDB_CODE_SUCCESS
;
}
SArray
*
udfStubs
=
taosArrayInit
(
16
,
sizeof
(
SUdfcFuncStub
));
void
cleanupExpiredUdfs
()
{
int32_t
i
=
0
;
while
(
i
<
taosArrayGetSize
(
gUdfcProxy
.
udfStubs
))
{
SUdfcFuncStub
*
stub
=
taosArrayGet
(
gUdfcProxy
.
udfStubs
,
i
);
SArray
*
expiredUdfStubs
=
taosArrayInit
(
16
,
sizeof
(
SUdfcFuncStub
));
while
(
i
<
taosArrayGetSize
(
gUdfcProxy
.
expiredUdfStubs
))
{
SUdfcFuncStub
*
stub
=
taosArrayGet
(
gUdfcProxy
.
expiredUdfStubs
,
i
);
if
(
stub
->
refCount
==
0
)
{
fnInfo
(
"tear down udf. udf name: %s, handle: %p, ref count: %d"
,
stub
->
udfName
,
stub
->
handle
,
stub
->
refCount
);
fnInfo
(
"tear down udf.
expired.
udf name: %s, handle: %p, ref count: %d"
,
stub
->
udfName
,
stub
->
handle
,
stub
->
refCount
);
doTeardownUdf
(
stub
->
handle
);
}
else
{
fnInfo
(
"udf still in use. udf name: %s, ref count: %d, create time: %"
PRId64
", handle: %p"
,
stub
->
udfName
,
fnInfo
(
"udf still in use.
expired.
udf name: %s, ref count: %d, create time: %"
PRId64
", handle: %p"
,
stub
->
udfName
,
stub
->
refCount
,
stub
->
createTime
,
stub
->
handle
);
UdfcFuncHandle
handle
=
stub
->
handle
;
if
(
handle
!=
NULL
&&
((
SUdfcUvSession
*
)
handle
)
->
udfUvPipe
!=
NULL
)
{
taosArrayPush
(
u
dfStubs
,
stub
);
taosArrayPush
(
expiredU
dfStubs
,
stub
);
}
else
{
fnInfo
(
"udf invalid handle for %s, refCount: %d, create time: %"
PRId64
". remove it from cache"
,
fnInfo
(
"udf invalid handle for %s,
expired.
refCount: %d, create time: %"
PRId64
". remove it from cache"
,
stub
->
udfName
,
stub
->
refCount
,
stub
->
createTime
);
}
}
++
i
;
}
taosArrayDestroy
(
gUdfcProxy
.
udfStubs
);
gUdfcProxy
.
udfStubs
=
udfStubs
;
taosArrayDestroy
(
gUdfcProxy
.
expiredUdfStubs
);
gUdfcProxy
.
expiredUdfStubs
=
expiredUdfStubs
;
}
SArray
*
expiredUdfStubs
=
taosArrayInit
(
16
,
sizeof
(
SUdfcFuncStub
));
while
(
i
<
taosArrayGetSize
(
gUdfcProxy
.
expiredUdfStubs
))
{
SUdfcFuncStub
*
stub
=
taosArrayGet
(
gUdfcProxy
.
expiredUdfStubs
,
i
);
void
cleanupNotExpiredUdfs
()
{
SArray
*
udfStubs
=
taosArrayInit
(
16
,
sizeof
(
SUdfcFuncStub
));
int32_t
i
=
0
;
while
(
i
<
taosArrayGetSize
(
gUdfcProxy
.
udfStubs
))
{
SUdfcFuncStub
*
stub
=
taosArrayGet
(
gUdfcProxy
.
udfStubs
,
i
);
if
(
stub
->
refCount
==
0
)
{
fnInfo
(
"tear down udf.
expired.
udf name: %s, handle: %p, ref count: %d"
,
stub
->
udfName
,
stub
->
handle
,
stub
->
refCount
);
fnInfo
(
"tear down udf. udf name: %s, handle: %p, ref count: %d"
,
stub
->
udfName
,
stub
->
handle
,
stub
->
refCount
);
doTeardownUdf
(
stub
->
handle
);
}
else
{
fnInfo
(
"udf still in use.
expired.
udf name: %s, ref count: %d, create time: %"
PRId64
", handle: %p"
,
stub
->
udfName
,
fnInfo
(
"udf still in use. udf name: %s, ref count: %d, create time: %"
PRId64
", handle: %p"
,
stub
->
udfName
,
stub
->
refCount
,
stub
->
createTime
,
stub
->
handle
);
UdfcFuncHandle
handle
=
stub
->
handle
;
if
(
handle
!=
NULL
&&
((
SUdfcUvSession
*
)
handle
)
->
udfUvPipe
!=
NULL
)
{
taosArrayPush
(
expiredU
dfStubs
,
stub
);
taosArrayPush
(
u
dfStubs
,
stub
);
}
else
{
fnInfo
(
"udf invalid handle for %s,
expired.
refCount: %d, create time: %"
PRId64
". remove it from cache"
,
fnInfo
(
"udf invalid handle for %s, refCount: %d, create time: %"
PRId64
". remove it from cache"
,
stub
->
udfName
,
stub
->
refCount
,
stub
->
createTime
);
}
}
++
i
;
}
taosArrayDestroy
(
gUdfcProxy
.
expiredUdfStubs
);
gUdfcProxy
.
expiredUdfStubs
=
expiredUdfStubs
;
taosArrayDestroy
(
gUdfcProxy
.
udfStubs
);
gUdfcProxy
.
udfStubs
=
udfStubs
;
}
int32_t
cleanUpUdfs
()
{
int8_t
initialized
=
atomic_load_8
(
&
gUdfcProxy
.
initialized
);
if
(
!
initialized
)
{
return
TSDB_CODE_SUCCESS
;
}
uv_mutex_lock
(
&
gUdfcProxy
.
udfStubsMutex
);
if
((
gUdfcProxy
.
udfStubs
==
NULL
||
taosArrayGetSize
(
gUdfcProxy
.
udfStubs
)
==
0
)
&&
(
gUdfcProxy
.
expiredUdfStubs
==
NULL
||
taosArrayGetSize
(
gUdfcProxy
.
expiredUdfStubs
)
==
0
))
{
uv_mutex_unlock
(
&
gUdfcProxy
.
udfStubsMutex
);
return
TSDB_CODE_SUCCESS
;
}
cleanupNotExpiredUdfs
();
cleanupExpiredUdfs
();
uv_mutex_unlock
(
&
gUdfcProxy
.
udfStubsMutex
);
return
0
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录