Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
4e7e8339
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22017
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看板
提交
4e7e8339
编写于
4月 27, 2022
作者:
dengyihao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refator(rpc): refator rpc retry way
上级
707be3a8
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
91 addition
and
0 deletion
+91
-0
source/libs/transport/inc/transComm.h
source/libs/transport/inc/transComm.h
+22
-0
source/libs/transport/src/transComm.c
source/libs/transport/src/transComm.c
+69
-0
未找到文件。
source/libs/transport/inc/transComm.h
浏览文件 @
4e7e8339
...
...
@@ -28,6 +28,7 @@ extern "C" {
#include "taoserror.h"
#include "tglobal.h"
#include "thash.h"
#include "theap.h"
#include "tidpool.h"
#include "tmd5.h"
#include "tmempool.h"
...
...
@@ -328,10 +329,31 @@ void transQueueClear(STransQueue* queue);
*/
void
transQueueDestroy
(
STransQueue
*
queue
);
typedef
struct
SDelayTask
{
void
(
*
func
)(
void
*
arg
);
void
*
arg
;
uint64_t
execTime
;
HeapNode
node
;
}
SDelayTask
;
typedef
struct
SDelayQueue
{
uv_timer_t
*
timer
;
Heap
*
heap
;
uv_loop_t
*
loop
;
void
(
*
free
)(
void
*
arg
);
}
SDelayQueue
;
int
transCreateDelayQueue
(
uv_loop_t
*
loop
,
SDelayQueue
**
queue
);
void
transDestroyDelayQueue
(
SDelayQueue
*
queue
);
int
transPutTaskToDelayQueue
(
SDelayQueue
*
queue
,
void
(
*
func
)(
void
*
arg
),
void
*
arg
,
uint64_t
timeoutMs
);
/*
* init global func
*/
void
transThreadOnce
();
#ifdef __cplusplus
}
#endif
...
...
source/libs/transport/src/transComm.c
浏览文件 @
4e7e8339
...
...
@@ -358,4 +358,73 @@ void transQueueDestroy(STransQueue* queue) {
transQueueClear
(
queue
);
taosArrayDestroy
(
queue
->
q
);
}
static
int32_t
timeCompare
(
const
HeapNode
*
a
,
const
HeapNode
*
b
)
{
SDelayTask
*
arg1
=
container_of
(
a
,
SDelayTask
,
node
);
SDelayTask
*
arg2
=
container_of
(
b
,
SDelayTask
,
node
);
if
(
arg1
->
execTime
>
arg2
->
execTime
)
{
return
-
1
;
}
else
{
return
1
;
}
}
static
void
transDelayQueueTimeout
(
uv_timer_t
*
timer
)
{
SDelayQueue
*
queue
=
timer
->
data
;
HeapNode
*
node
=
heapMin
(
queue
->
heap
);
if
(
node
==
NULL
)
{
// DO NOTHING
}
heapRemove
(
queue
->
heap
,
node
);
SDelayTask
*
task
=
container_of
(
node
,
SDelayTask
,
node
);
task
->
func
(
task
->
arg
);
taosMemoryFree
(
task
);
node
=
heapMin
(
queue
->
heap
);
if
(
node
==
NULL
)
{
return
;
}
task
=
container_of
(
node
,
SDelayTask
,
node
);
uint64_t
timeout
=
task
->
execTime
>
uv_now
(
queue
->
loop
)
?
task
->
execTime
-
uv_now
(
queue
->
loop
)
:
0
;
uv_timer_start
(
queue
->
timer
,
transDelayQueueTimeout
,
timeout
,
0
);
}
int
transCreateDelayQueue
(
uv_loop_t
*
loop
,
SDelayQueue
**
queue
)
{
uv_timer_t
*
timer
=
taosMemoryCalloc
(
1
,
sizeof
(
uv_timer_t
));
uv_timer_init
(
loop
,
timer
);
Heap
*
heap
=
heapCreate
(
timeCompare
);
SDelayQueue
*
q
=
taosMemoryCalloc
(
1
,
sizeof
(
SDelayQueue
));
q
->
heap
=
heap
;
q
->
timer
=
timer
;
q
->
loop
=
loop
;
q
->
timer
->
data
=
q
;
*
queue
=
q
;
return
0
;
}
void
transDestroyDelayQueue
(
SDelayQueue
*
queue
)
{
uv_timer_stop
(
queue
->
timer
);
taosMemoryFree
(
queue
->
timer
);
heapDestroy
(
queue
->
heap
);
taosMemoryFree
(
queue
);
}
int
transPutTaskToDelayQueue
(
SDelayQueue
*
queue
,
void
(
*
func
)(
void
*
arg
),
void
*
arg
,
uint64_t
timeoutMs
)
{
SDelayTask
*
task
=
taosMemoryCalloc
(
1
,
sizeof
(
SDelayTask
));
task
->
func
=
func
;
task
->
arg
=
arg
;
task
->
execTime
=
uv_now
(
queue
->
loop
)
+
timeoutMs
;
int
size
=
heapSize
(
queue
->
heap
);
heapInsert
(
queue
->
heap
,
&
task
->
node
);
if
(
size
==
1
)
{
uv_timer_start
(
queue
->
timer
,
transDelayQueueTimeout
,
timeoutMs
,
0
);
}
return
0
;
}
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录