Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
367b6512
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
367b6512
编写于
12月 28, 2022
作者:
S
Shengliang Guan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: heap-buffer-overflow in auto qworker
上级
ed98fddf
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
15 addition
and
13 deletion
+15
-13
source/util/src/tworker.c
source/util/src/tworker.c
+15
-13
未找到文件。
source/util/src/tworker.c
浏览文件 @
367b6512
...
@@ -138,7 +138,7 @@ void tQWorkerFreeQueue(SQWorkerPool *pool, STaosQueue *queue) {
...
@@ -138,7 +138,7 @@ void tQWorkerFreeQueue(SQWorkerPool *pool, STaosQueue *queue) {
int32_t
tAutoQWorkerInit
(
SAutoQWorkerPool
*
pool
)
{
int32_t
tAutoQWorkerInit
(
SAutoQWorkerPool
*
pool
)
{
pool
->
qset
=
taosOpenQset
();
pool
->
qset
=
taosOpenQset
();
pool
->
workers
=
taosArrayInit
(
2
,
sizeof
(
SQWorker
));
pool
->
workers
=
taosArrayInit
(
2
,
sizeof
(
SQWorker
*
));
if
(
pool
->
workers
==
NULL
)
{
if
(
pool
->
workers
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
-
1
;
return
-
1
;
...
@@ -153,20 +153,21 @@ int32_t tAutoQWorkerInit(SAutoQWorkerPool *pool) {
...
@@ -153,20 +153,21 @@ int32_t tAutoQWorkerInit(SAutoQWorkerPool *pool) {
void
tAutoQWorkerCleanup
(
SAutoQWorkerPool
*
pool
)
{
void
tAutoQWorkerCleanup
(
SAutoQWorkerPool
*
pool
)
{
int32_t
size
=
taosArrayGetSize
(
pool
->
workers
);
int32_t
size
=
taosArrayGetSize
(
pool
->
workers
);
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SQWorker
*
worker
=
taosArrayGet
(
pool
->
workers
,
i
);
SQWorker
*
worker
=
taosArrayGet
P
(
pool
->
workers
,
i
);
if
(
taosCheckPthreadValid
(
worker
->
thread
))
{
if
(
taosCheckPthreadValid
(
worker
->
thread
))
{
taosQsetThreadResume
(
pool
->
qset
);
taosQsetThreadResume
(
pool
->
qset
);
}
}
}
}
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
size
;
++
i
)
{
SQWorker
*
worker
=
taosArrayGet
(
pool
->
workers
,
i
);
SQWorker
*
worker
=
taosArrayGet
P
(
pool
->
workers
,
i
);
if
(
taosCheckPthreadValid
(
worker
->
thread
))
{
if
(
taosCheckPthreadValid
(
worker
->
thread
))
{
uInfo
(
"worker:%s:%d is stopping"
,
pool
->
name
,
worker
->
id
);
uInfo
(
"worker:%s:%d is stopping"
,
pool
->
name
,
worker
->
id
);
taosThreadJoin
(
worker
->
thread
,
NULL
);
taosThreadJoin
(
worker
->
thread
,
NULL
);
taosThreadClear
(
&
worker
->
thread
);
taosThreadClear
(
&
worker
->
thread
);
uInfo
(
"worker:%s:%d is stopped"
,
pool
->
name
,
worker
->
id
);
uInfo
(
"worker:%s:%d is stopped"
,
pool
->
name
,
worker
->
id
);
}
}
taosMemoryFree
(
worker
);
}
}
taosArrayDestroy
(
pool
->
workers
);
taosArrayDestroy
(
pool
->
workers
);
...
@@ -218,27 +219,28 @@ STaosQueue *tAutoQWorkerAllocQueue(SAutoQWorkerPool *pool, void *ahandle, FItem
...
@@ -218,27 +219,28 @@ STaosQueue *tAutoQWorkerAllocQueue(SAutoQWorkerPool *pool, void *ahandle, FItem
int32_t
curWorkerNum
=
taosArrayGetSize
(
pool
->
workers
);
int32_t
curWorkerNum
=
taosArrayGetSize
(
pool
->
workers
);
int32_t
dstWorkerNum
=
ceil
(
queueNum
*
pool
->
ratio
);
int32_t
dstWorkerNum
=
ceil
(
queueNum
*
pool
->
ratio
);
if
(
dstWorkerNum
<
1
)
dstWorkerNum
=
1
;
if
(
dstWorkerNum
<
1
)
dstWorkerNum
=
1
;
// spawn a thread to process queue
// spawn a thread to process queue
while
(
curWorkerNum
<
dstWorkerNum
)
{
while
(
curWorkerNum
<
dstWorkerNum
)
{
SQWorker
wobj
=
{
SQWorker
*
worker
=
taosMemoryCalloc
(
1
,
sizeof
(
SQWorker
));
.
id
=
(
int32_t
)
taosArrayGetSize
(
pool
->
workers
),
if
(
worker
==
NULL
||
taosArrayPush
(
pool
->
workers
,
&
worker
)
==
NULL
)
{
.
pool
=
pool
,
uError
(
"worker:%s:%d failed to create"
,
pool
->
name
,
curWorkerNum
);
};
taosMemoryFree
(
worker
);
SQWorker
*
worker
=
taosArrayPush
(
pool
->
workers
,
&
wobj
);
if
(
worker
==
NULL
)
{
uError
(
"worker:%s:%d failed to create, total:%d"
,
pool
->
name
,
wobj
.
id
,
(
int32_t
)
taosArrayGetSize
(
pool
->
workers
));
taosCloseQueue
(
queue
);
taosCloseQueue
(
queue
);
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
NULL
;
return
NULL
;
}
}
worker
->
id
=
curWorkerNum
;
worker
->
pool
=
pool
;
TdThreadAttr
thAttr
;
TdThreadAttr
thAttr
;
taosThreadAttrInit
(
&
thAttr
);
taosThreadAttrInit
(
&
thAttr
);
taosThreadAttrSetDetachState
(
&
thAttr
,
PTHREAD_CREATE_JOINABLE
);
taosThreadAttrSetDetachState
(
&
thAttr
,
PTHREAD_CREATE_JOINABLE
);
if
(
taosThreadCreate
(
&
worker
->
thread
,
&
thAttr
,
(
ThreadFp
)
tAutoQWorkerThreadFp
,
worker
)
!=
0
)
{
if
(
taosThreadCreate
(
&
worker
->
thread
,
&
thAttr
,
(
ThreadFp
)
tAutoQWorkerThreadFp
,
worker
)
!=
0
)
{
uError
(
"worker:%s:%d failed to create thread, total:%d"
,
pool
->
name
,
wobj
.
id
,
uError
(
"worker:%s:%d failed to create thread, total:%d"
,
pool
->
name
,
worker
->
id
,
curWorkerNum
);
(
int32_t
)
taosArrayGetSize
(
pool
->
workers
));
(
void
)
taosArrayPop
(
pool
->
workers
);
taosMemoryFree
(
worker
);
taosCloseQueue
(
queue
);
taosCloseQueue
(
queue
);
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
NULL
;
return
NULL
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录