Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
b434ac2f
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看板
提交
b434ac2f
编写于
6月 28, 2023
作者:
B
Benguang Zhao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
enh: improve walScanLogGetLastVer
上级
0b798123
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
30 addition
and
30 deletion
+30
-30
source/libs/wal/src/walMeta.c
source/libs/wal/src/walMeta.c
+30
-30
未找到文件。
source/libs/wal/src/walMeta.c
浏览文件 @
b434ac2f
...
...
@@ -47,9 +47,7 @@ static FORCE_INLINE int walBuildTmpMetaName(SWal* pWal, char* buf) {
}
static
FORCE_INLINE
int64_t
walScanLogGetLastVer
(
SWal
*
pWal
,
int32_t
fileIdx
)
{
int32_t
sz
=
taosArrayGetSize
(
pWal
->
fileInfoSet
);
terrno
=
TSDB_CODE_SUCCESS
;
int32_t
sz
=
taosArrayGetSize
(
pWal
->
fileInfoSet
);
SWalFileInfo
*
pFileInfo
=
taosArrayGet
(
pWal
->
fileInfoSet
,
fileIdx
);
char
fnameStr
[
WAL_FILE_LEN
];
walBuildLogName
(
pWal
,
pFileInfo
->
firstVer
,
fnameStr
);
...
...
@@ -74,13 +72,12 @@ static FORCE_INLINE int64_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx) {
int64_t
capacity
=
0
;
int64_t
readSize
=
0
;
char
*
buf
=
NULL
;
bool
firstTrial
=
pFileInfo
->
fileSize
<
fileSize
;
int64_t
offset
=
TMIN
(
pFileInfo
->
fileSize
,
fileSize
);
int64_t
offsetForward
=
offset
-
stepSize
+
walCkHeadSz
-
1
;
int64_t
offsetBackward
=
offset
;
int64_t
retVer
=
-
1
;
int64_t
lastEntryBeginOffset
=
0
;
int64_t
lastEntryEndOffset
=
0
;
int64_t
recordLen
=
0
;
bool
forwardStage
=
false
;
// check recover size
if
(
2
*
tsWalFsyncDataSizeLimit
+
offset
<
end
)
{
...
...
@@ -91,14 +88,8 @@ static FORCE_INLINE int64_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx) {
// search for the valid last WAL entry, e.g. block by block
while
(
1
)
{
offset
=
(
firstTrial
)
?
TMIN
(
fileSize
,
offsetForward
+
stepSize
-
walCkHeadSz
+
1
)
:
TMAX
(
0
,
offsetBackward
-
stepSize
+
walCkHeadSz
-
1
);
offset
=
(
lastEntryEndOffset
>
0
)
?
offset
:
TMAX
(
0
,
offset
-
stepSize
+
walCkHeadSz
-
1
);
end
=
TMIN
(
offset
+
stepSize
,
fileSize
);
if
(
firstTrial
)
{
offsetForward
=
offset
;
}
else
{
offsetBackward
=
offset
;
}
readSize
=
end
-
offset
;
capacity
=
readSize
+
sizeof
(
magic
);
...
...
@@ -129,7 +120,16 @@ static FORCE_INLINE int64_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx) {
int64_t
pos
=
0
;
SWalCkHead
*
logContent
=
NULL
;
while
((
candidate
=
tmemmem
(
haystack
,
readSize
-
(
haystack
-
buf
),
(
char
*
)
&
magic
,
sizeof
(
magic
)))
!=
NULL
)
{
while
(
true
)
{
forwardStage
=
(
lastEntryEndOffset
>
0
||
offset
==
0
);
terrno
=
TSDB_CODE_SUCCESS
;
if
(
forwardStage
)
{
candidate
=
(
readSize
-
(
haystack
-
buf
))
>
0
?
haystack
:
NULL
;
}
else
{
candidate
=
tmemmem
(
haystack
,
readSize
-
(
haystack
-
buf
),
(
char
*
)
&
magic
,
sizeof
(
magic
));
}
if
(
candidate
==
NULL
)
break
;
pos
=
candidate
-
buf
;
// validate head
...
...
@@ -137,13 +137,20 @@ static FORCE_INLINE int64_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx) {
if
(
len
<
walCkHeadSz
)
{
break
;
}
logContent
=
(
SWalCkHead
*
)(
buf
+
pos
);
if
(
logContent
->
magic
!=
WAL_MAGIC
)
{
terrno
=
TSDB_CODE_WAL_FILE_CORRUPTED
;
ASSERT
(
forwardStage
);
wError
(
"vgId:%d, wal magic is corrupted. offset:%"
PRId64
", file:%s "
,
pWal
->
cfg
.
vgId
,
offset
+
pos
,
fnameStr
);
break
;
}
if
(
walValidHeadCksum
(
logContent
)
!=
0
)
{
terrno
=
TSDB_CODE_WAL_CHKSUM_MISMATCH
;
wWarn
(
"vgId:%d, failed to validate checksum of wal entry header. offset:%"
PRId64
", file:%s"
,
pWal
->
cfg
.
vgId
,
offset
+
pos
,
fnameStr
);
haystack
=
buf
+
pos
+
1
;
if
(
f
irstTrial
)
{
if
(
f
orwardStage
)
{
break
;
}
else
{
continue
;
...
...
@@ -151,9 +158,9 @@ static FORCE_INLINE int64_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx) {
}
// validate body
int64_t
size
=
walCkHeadSz
+
logContent
->
head
.
bodyLen
;
if
(
len
<
size
)
{
int64_t
extraSize
=
size
-
len
;
recordLen
=
walCkHeadSz
+
logContent
->
head
.
bodyLen
;
if
(
len
<
recordLen
)
{
int64_t
extraSize
=
recordLen
-
len
;
if
(
capacity
<
readSize
+
extraSize
+
sizeof
(
magic
))
{
capacity
+=
extraSize
;
void
*
ptr
=
taosMemoryRealloc
(
buf
,
capacity
);
...
...
@@ -184,7 +191,7 @@ static FORCE_INLINE int64_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx) {
wWarn
(
"vgId:%d, failed to validate checksum of wal entry body. offset:%"
PRId64
", file:%s"
,
pWal
->
cfg
.
vgId
,
offset
+
pos
,
fnameStr
);
haystack
=
buf
+
pos
+
1
;
if
(
f
irstTrial
)
{
if
(
f
orwardStage
)
{
break
;
}
else
{
continue
;
...
...
@@ -194,21 +201,14 @@ static FORCE_INLINE int64_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx) {
// found one
retVer
=
logContent
->
head
.
version
;
lastEntryBeginOffset
=
offset
+
pos
;
lastEntryEndOffset
=
offset
+
pos
+
sizeof
(
SWalCkHead
)
+
logContent
->
head
.
body
Len
;
lastEntryEndOffset
=
offset
+
pos
+
record
Len
;
// try next
haystack
=
buf
+
pos
+
1
;
haystack
=
buf
+
pos
+
recordLen
;
}
if
(
end
==
fileSize
)
firstTrial
=
false
;
if
(
firstTrial
)
{
if
(
terrno
==
TSDB_CODE_SUCCESS
)
{
continue
;
}
else
{
firstTrial
=
false
;
}
}
if
(
retVer
>=
0
||
offset
==
0
)
break
;
offset
=
(
lastEntryEndOffset
>
0
)
?
lastEntryEndOffset
:
offset
;
if
(
forwardStage
&&
(
terrno
!=
TSDB_CODE_SUCCESS
||
end
==
fileSize
))
break
;
}
if
(
retVer
<
0
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录