Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
c426fa8b
T
TDengine
项目概览
taosdata
/
TDengine
11 个月 前同步成功
通知
1179
Star
22014
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c426fa8b
编写于
9月 27, 2022
作者:
C
Cary Xu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: code optimization for data migrate
上级
3d92b6c6
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
81 addition
and
150 deletion
+81
-150
source/dnode/vnode/src/tsdb/tsdbCommit.c
source/dnode/vnode/src/tsdb/tsdbCommit.c
+1
-2
source/dnode/vnode/src/tsdb/tsdbRetention2.c
source/dnode/vnode/src/tsdb/tsdbRetention2.c
+80
-148
未找到文件。
source/dnode/vnode/src/tsdb/tsdbCommit.c
浏览文件 @
c426fa8b
...
...
@@ -767,7 +767,6 @@ static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter) {
if
(
++
nLoops
>
1000
)
{
nLoops
=
0
;
sched_yield
();
// printf("%s:%d wait retention to finish\n", __func__, __LINE__);
}
}
if
(
atomic_val_compare_exchange_8
(
&
pTsdb
->
trimHdl
.
state
,
0
,
1
)
==
0
)
{
...
...
@@ -780,7 +779,7 @@ static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter) {
}
else
{
goto
_wait_retention_end
;
}
atomic_
store_8
(
&
pTsdb
->
trimHdl
.
commitInWait
,
0
);
atomic_
val_compare_exchange_8
(
&
pTsdb
->
trimHdl
.
commitInWait
,
1
,
0
);
}
code
=
tsdbFSCopy
(
pTsdb
,
&
pCommitter
->
fs
);
...
...
source/dnode/vnode/src/tsdb/tsdbRetention2.c
浏览文件 @
c426fa8b
...
...
@@ -17,20 +17,12 @@
enum
{
RETENTION_NO
=
0
,
RETENTION_EXPIRED
=
1
,
RETENTION_MIGRATE
=
2
};
#if 1
#define MIGRATE_MIN_FSIZE (1048576 << 9) // 512 MB
#define MIGRATE_MAX_SPEED (1048576 << 5) // 32 MB
#define MIGRATE_MIN_COST (5) // second
#else
#define MIGRATE_MIN_FSIZE (1048576 << 5) // 32 MB
#define MIGRATE_MAX_SPEED (1048576 << 2) // 4 MB
#define MIGRATE_MIN_COST (5) // second
#endif
static
bool
tsdbShouldDoMigrate
(
STsdb
*
pTsdb
);
static
int32_t
tsdbShouldDoRetention
(
STsdb
*
pTsdb
,
int64_t
now
);
static
int32_t
tsdbProcessExpire
(
STsdb
*
pTsdb
,
int64_t
now
,
int32_t
retention
);
static
int32_t
tsdbProcessMigrate
(
STsdb
*
pTsdb
,
int64_t
now
,
int64_t
maxSpeed
,
int32_t
retention
);
static
int32_t
tsdbProcessRetention
(
STsdb
*
pTsdb
,
int64_t
now
,
int64_t
maxSpeed
,
int32_t
retention
,
int8_t
type
);
static
bool
tsdbShouldDoMigrate
(
STsdb
*
pTsdb
)
{
if
(
tfsGetLevel
(
pTsdb
->
pVnode
->
pTfs
)
<
2
)
{
...
...
@@ -74,110 +66,31 @@ static int32_t tsdbShouldDoRetention(STsdb *pTsdb, int64_t now) {
return
retention
;
}
static
int32_t
tsdbProcessExpire
(
STsdb
*
pTsdb
,
int64_t
now
,
int32_t
retention
)
{
int32_t
code
=
0
;
int32_t
nLoops
=
0
;
int32_t
maxFid
=
INT32_MIN
;
STsdbFS
fs
=
{
0
};
STsdbFS
fsLatest
=
{
0
};
if
(
!
(
retention
&
RETENTION_EXPIRED
))
{
goto
_exit
;
}
code
=
tsdbFSCopy
(
pTsdb
,
&
fs
);
if
(
code
)
goto
_exit
;
int32_t
fsSize
=
taosArrayGetSize
(
fs
.
aDFileSet
);
for
(
int32_t
iSet
=
0
;
iSet
<
fsSize
;
iSet
++
)
{
SDFileSet
*
pSet
=
(
SDFileSet
*
)
taosArrayGet
(
fs
.
aDFileSet
,
iSet
);
int32_t
expLevel
=
tsdbFidLevel
(
pSet
->
fid
,
&
pTsdb
->
keepCfg
,
now
);
SDiskID
did
;
if
(
expLevel
<
0
)
{
SET_DFSET_EXPIRED
(
pSet
);
if
(
pSet
->
fid
>
maxFid
)
maxFid
=
pSet
->
fid
;
}
else
{
break
;
}
}
if
(
maxFid
==
INT32_MIN
)
goto
_exit
;
_wait_commit_end:
while
(
atomic_load_32
(
&
pTsdb
->
trimHdl
.
minCommitFid
)
<=
maxFid
)
{
if
(
++
nLoops
>
1000
)
{
nLoops
=
0
;
sched_yield
();
// printf("%s:%d wait commit finished\n", __func__, __LINE__);
}
}
if
(
atomic_val_compare_exchange_8
(
&
pTsdb
->
trimHdl
.
state
,
0
,
1
)
==
0
)
{
if
(
atomic_load_32
(
&
pTsdb
->
trimHdl
.
minCommitFid
)
<=
maxFid
)
{
atomic_store_8
(
&
pTsdb
->
trimHdl
.
state
,
0
);
goto
_wait_commit_end
;
}
atomic_store_32
(
&
pTsdb
->
trimHdl
.
maxRetentFid
,
maxFid
);
atomic_store_8
(
&
pTsdb
->
trimHdl
.
state
,
0
);
}
else
{
goto
_wait_commit_end
;
}
_merge_fs:
taosThreadRwlockWrlock
(
&
pTsdb
->
rwLock
);
if
((
code
=
tsdbFSCopy
(
pTsdb
,
&
fsLatest
)))
{
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
goto
_exit
;
}
// 1) merge tsdbFSNew and pTsdb->fs
if
((
code
=
tsdbFSUpdDel
(
pTsdb
,
&
fsLatest
,
&
fs
,
maxFid
)))
{
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
goto
_exit
;
}
// 2) save CURRENT
if
((
code
=
tsdbFSCommit1
(
pTsdb
,
&
fsLatest
)))
{
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
goto
_exit
;
}
// 3) apply the tsdbFS to pTsdb->fs
if
((
code
=
tsdbFSCommit2
(
pTsdb
,
&
fsLatest
)))
{
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
goto
_exit
;
}
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
_exit:
tsdbFSDestroy
(
&
fs
);
tsdbFSDestroy
(
&
fsLatest
);
if
(
code
!=
0
)
{
tsdbError
(
"vgId:%d, tsdb do retention(expire) failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
),
tstrerror
(
code
));
ASSERT
(
0
);
}
return
code
;
}
/**
* @brief
* @brief
process retention
*
* @param pTsdb
* @param now
* @param maxSpeed
* @param retention
* @param type 0 RETENTION_EXPIRED, 1 RETENTION_MIGRATE
* @return int32_t
*/
static
int32_t
tsdbProcess
Migrate
(
STsdb
*
pTsdb
,
int64_t
now
,
int64_t
maxSpeed
,
int32_t
retention
)
{
static
int32_t
tsdbProcess
Retention
(
STsdb
*
pTsdb
,
int64_t
now
,
int64_t
maxSpeed
,
int32_t
retention
,
int8_t
type
)
{
int32_t
code
=
0
;
int32_t
nBatch
=
0
;
int32_t
nLoops
=
0
;
int32_t
maxFid
=
INT32_MIN
;
int32_t
maxFid
=
0
;
int64_t
fSize
=
0
;
int64_t
speed
=
maxSpeed
>
0
?
maxSpeed
:
MIGRATE_MAX_SPEED
;
STsdbFS
fs
=
{
0
};
STsdbFS
fsLatest
=
{
0
};
if
(
!
(
retention
&
RETENTION_MIGRATE
))
{
if
(
!
(
retention
&
type
))
{
goto
_exit
;
}
_
migrate
_loop:
_
retention
_loop:
// reset
maxFid
=
INT32_MIN
;
fSize
=
0
;
...
...
@@ -186,32 +99,47 @@ _migrate_loop:
if
(
atomic_load_8
(
&
pTsdb
->
trimHdl
.
commitInWait
)
==
1
)
{
atomic_store_32
(
&
pTsdb
->
trimHdl
.
maxRetentFid
,
INT32_MIN
);
taosMsleep
(
1
0
);
taosMsleep
(
5
0
);
}
code
=
tsdbFSCopy
(
pTsdb
,
&
fs
);
if
(
code
)
goto
_exit
;
int32_t
fsSize
=
taosArrayGetSize
(
fs
.
aDFileSet
);
for
(
int32_t
iSet
=
0
;
iSet
<
fsSize
;
++
iSet
)
{
SDFileSet
*
pSet
=
(
SDFileSet
*
)
taosArrayGet
(
fs
.
aDFileSet
,
iSet
);
int32_t
expLevel
=
tsdbFidLevel
(
pSet
->
fid
,
&
pTsdb
->
keepCfg
,
now
);
SDiskID
did
;
if
(
pSet
->
diskId
.
level
==
expLevel
)
continue
;
if
(
expLevel
>
0
)
{
ASSERT
(
pSet
->
fid
>
maxFid
);
maxFid
=
pSet
->
fid
;
fSize
+=
(
pSet
->
pDataF
->
size
+
pSet
->
pHeadF
->
size
+
pSet
->
pSmaF
->
size
);
if
(
fSize
/
MIGRATE_MAX_SPEED
>
MIGRATE_MIN_COST
)
{
break
;
}
for
(
int32_t
iStt
=
0
;
iStt
<
pSet
->
nSttF
;
++
iStt
)
{
fSize
+=
pSet
->
aSttF
[
iStt
]
->
size
;
if
(
type
==
RETENTION_MIGRATE
)
{
for
(
int32_t
iSet
=
0
;
iSet
<
fsSize
;
++
iSet
)
{
SDFileSet
*
pSet
=
(
SDFileSet
*
)
taosArrayGet
(
fs
.
aDFileSet
,
iSet
);
int32_t
expLevel
=
tsdbFidLevel
(
pSet
->
fid
,
&
pTsdb
->
keepCfg
,
now
);
SDiskID
did
;
if
(
pSet
->
diskId
.
level
==
expLevel
)
continue
;
if
(
expLevel
>
0
)
{
ASSERT
(
pSet
->
fid
>
maxFid
);
maxFid
=
pSet
->
fid
;
fSize
+=
(
pSet
->
pDataF
->
size
+
pSet
->
pHeadF
->
size
+
pSet
->
pSmaF
->
size
);
if
(
fSize
/
speed
>
MIGRATE_MIN_COST
)
{
break
;
}
for
(
int32_t
iStt
=
0
;
iStt
<
pSet
->
nSttF
;
++
iStt
)
{
fSize
+=
pSet
->
aSttF
[
iStt
]
->
size
;
}
if
(
fSize
/
speed
>
MIGRATE_MIN_COST
)
{
tsdbInfo
(
"vgId:%d migrate loop[%d] with maxFid:%d"
,
TD_VID
(
pTsdb
->
pVnode
),
nBatch
,
maxFid
);
break
;
}
}
if
(
fSize
/
MIGRATE_MAX_SPEED
>
MIGRATE_MIN_COST
)
{
tsdbInfo
(
"vgId:%d migrate loop[%d] with maxFid:%d"
,
TD_VID
(
pTsdb
->
pVnode
),
nBatch
,
maxFid
);
}
}
else
if
(
type
==
RETENTION_EXPIRED
)
{
for
(
int32_t
iSet
=
0
;
iSet
<
fsSize
;
++
iSet
)
{
SDFileSet
*
pSet
=
(
SDFileSet
*
)
taosArrayGet
(
fs
.
aDFileSet
,
iSet
);
int32_t
expLevel
=
tsdbFidLevel
(
pSet
->
fid
,
&
pTsdb
->
keepCfg
,
now
);
SDiskID
did
;
if
(
expLevel
<
0
)
{
SET_DFSET_EXPIRED
(
pSet
);
if
(
pSet
->
fid
>
maxFid
)
maxFid
=
pSet
->
fid
;
}
else
{
break
;
}
}
...
...
@@ -219,7 +147,7 @@ _migrate_loop:
if
(
maxFid
==
INT32_MIN
)
goto
_exit
;
_
wait_commit_end
:
_
commit_conflict_check
:
while
(
atomic_load_32
(
&
pTsdb
->
trimHdl
.
minCommitFid
)
<=
maxFid
)
{
if
(
++
nLoops
>
1000
)
{
nLoops
=
0
;
...
...
@@ -229,46 +157,48 @@ _wait_commit_end:
if
(
atomic_val_compare_exchange_8
(
&
pTsdb
->
trimHdl
.
state
,
0
,
1
)
==
0
)
{
if
(
atomic_load_32
(
&
pTsdb
->
trimHdl
.
minCommitFid
)
<=
maxFid
)
{
atomic_store_8
(
&
pTsdb
->
trimHdl
.
state
,
0
);
goto
_
wait_commit_end
;
goto
_
commit_conflict_check
;
}
atomic_store_32
(
&
pTsdb
->
trimHdl
.
maxRetentFid
,
maxFid
);
atomic_store_8
(
&
pTsdb
->
trimHdl
.
state
,
0
);
}
else
{
goto
_
wait_commit_end
;
goto
_
commit_conflict_check
;
}
// migrate
for
(
int32_t
iSet
=
0
;
iSet
<
fsSize
;
++
iSet
)
{
SDFileSet
*
pSet
=
(
SDFileSet
*
)
taosArrayGet
(
fs
.
aDFileSet
,
iSet
);
int32_t
expLevel
=
tsdbFidLevel
(
pSet
->
fid
,
&
pTsdb
->
keepCfg
,
now
);
SDiskID
did
;
if
(
type
==
RETENTION_MIGRATE
)
{
for
(
int32_t
iSet
=
0
;
iSet
<
fsSize
;
++
iSet
)
{
SDFileSet
*
pSet
=
(
SDFileSet
*
)
taosArrayGet
(
fs
.
aDFileSet
,
iSet
);
int32_t
expLevel
=
tsdbFidLevel
(
pSet
->
fid
,
&
pTsdb
->
keepCfg
,
now
);
SDiskID
did
;
if
(
pSet
->
fid
>
maxFid
)
break
;
if
(
pSet
->
fid
>
maxFid
)
break
;
tsdbInfo
(
"vgId:%d migrate loop[%d] with maxFid:%d, fid:%d, did:%d, level:%d, expLevel:%d"
,
TD_VID
(
pTsdb
->
pVnode
),
nBatch
,
maxFid
,
pSet
->
fid
,
pSet
->
diskId
.
id
,
pSet
->
diskId
.
level
,
expLevel
);
tsdbInfo
(
"vgId:%d migrate loop[%d] with maxFid:%d, fid:%d, did:%d, level:%d, expLevel:%d"
,
TD_VID
(
pTsdb
->
pVnode
),
nBatch
,
maxFid
,
pSet
->
fid
,
pSet
->
diskId
.
id
,
pSet
->
diskId
.
level
,
expLevel
);
if
(
expLevel
<
0
)
{
SET_DFSET_EXPIRED
(
pSet
);
}
else
{
if
(
expLevel
==
pSet
->
diskId
.
level
)
continue
;
if
(
expLevel
<
0
)
{
SET_DFSET_EXPIRED
(
pSet
);
}
else
{
if
(
expLevel
==
pSet
->
diskId
.
level
)
continue
;
if
(
tfsAllocDisk
(
pTsdb
->
pVnode
->
pTfs
,
expLevel
,
&
did
)
<
0
)
{
code
=
terrno
;
goto
_exit
;
}
if
(
tfsAllocDisk
(
pTsdb
->
pVnode
->
pTfs
,
expLevel
,
&
did
)
<
0
)
{
code
=
terrno
;
goto
_exit
;
}
if
(
did
.
level
==
pSet
->
diskId
.
level
)
continue
;
if
(
did
.
level
==
pSet
->
diskId
.
level
)
continue
;
// copy file to new disk
SDFileSet
fSet
=
*
pSet
;
fSet
.
diskId
=
did
;
// copy file to new disk
SDFileSet
fSet
=
*
pSet
;
fSet
.
diskId
=
did
;
code
=
tsdbDFileSetCopy
(
pTsdb
,
pSet
,
&
fSet
,
maxSpeed
);
if
(
code
)
goto
_exit
;
code
=
tsdbDFileSetCopy
(
pTsdb
,
pSet
,
&
fSet
,
maxSpeed
);
if
(
code
)
goto
_exit
;
code
=
tsdbFSUpsertFSet
(
&
fs
,
&
fSet
);
if
(
code
)
goto
_exit
;
code
=
tsdbFSUpsertFSet
(
&
fs
,
&
fSet
);
if
(
code
)
goto
_exit
;
}
}
}
...
...
@@ -296,14 +226,16 @@ _merge_fs:
}
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
++
nBatch
;
goto
_migrate_loop
;
if
(
type
==
RETENTION_MIGRATE
)
{
++
nBatch
;
goto
_retention_loop
;
}
_exit:
tsdbFSDestroy
(
&
fs
);
tsdbFSDestroy
(
&
fsLatest
);
if
(
code
!=
0
)
{
tsdbError
(
"vgId:%d, tsdb do retention
(migrate) failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
)
,
tstrerror
(
code
));
tsdbError
(
"vgId:%d, tsdb do retention
%"
PRIi8
" failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
),
type
,
tstrerror
(
code
));
ASSERT
(
0
);
}
return
code
;
...
...
@@ -331,21 +263,21 @@ int32_t tsdbDoRetention(STsdb *pTsdb, int64_t now, int64_t maxSpeed) {
}
// step 1: process expire
code
=
tsdbProcess
Expire
(
pTsdb
,
now
,
retention
);
code
=
tsdbProcess
Retention
(
pTsdb
,
now
,
maxSpeed
,
retention
,
RETENTION_EXPIRED
);
if
(
code
<
0
)
goto
_exit
;
// step 2: process multi-tier migration
code
=
tsdbProcess
Migrate
(
pTsdb
,
now
,
maxSpeed
,
retention
);
code
=
tsdbProcess
Retention
(
pTsdb
,
now
,
maxSpeed
,
retention
,
RETENTION_MIGRATE
);
if
(
code
<
0
)
goto
_exit
;
_exit:
pTsdb
->
trimHdl
.
maxRetentFid
=
INT32_MIN
;
if
(
code
!=
0
)
{
tsdbError
(
"vgId:%d, tsdb do retention
:
%d failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
),
retention
,
tstrerror
(
code
));
tsdbError
(
"vgId:%d, tsdb do retention
%d failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
),
retention
,
tstrerror
(
code
));
ASSERT
(
0
);
// tsdbFSRollback(pTsdb->pFS);
}
else
{
tsdbInfo
(
"vgId:%d, tsdb do retention
:
%d succeed"
,
TD_VID
(
pTsdb
->
pVnode
),
retention
);
tsdbInfo
(
"vgId:%d, tsdb do retention
%d succeed"
,
TD_VID
(
pTsdb
->
pVnode
),
retention
);
}
return
code
;
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录