Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
63600419
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1193
Star
22018
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看板
提交
63600419
编写于
9月 27, 2022
作者:
dengyihao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(idx): fix index read crash
上级
6855af0d
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
29 addition
and
18 deletion
+29
-18
source/libs/index/src/indexCache.c
source/libs/index/src/indexCache.c
+1
-0
source/libs/index/src/indexFstFile.c
source/libs/index/src/indexFstFile.c
+26
-16
source/libs/index/test/jsonUT.cc
source/libs/index/test/jsonUT.cc
+2
-2
未找到文件。
source/libs/index/src/indexCache.c
浏览文件 @
63600419
...
...
@@ -302,6 +302,7 @@ static int32_t cacheSearchCompareFunc_JSON(void* cache, SIndexTerm* term, SIdxTR
char
*
p
=
taosMemoryCalloc
(
1
,
strlen
(
c
->
colVal
)
+
1
);
memcpy
(
p
,
c
->
colVal
,
strlen
(
c
->
colVal
));
cond
=
cmpFn
(
p
+
skip
,
term
->
colVal
,
dType
);
taosMemoryFree
(
p
);
}
}
if
(
cond
==
MATCH
)
{
...
...
source/libs/index/src/indexFstFile.c
浏览文件 @
63600419
...
...
@@ -69,6 +69,8 @@ static int idxFileCtxDoReadFrom(IFileCtx* ctx, uint8_t* buf, int len, int32_t of
int32_t
blkOffset
=
offset
%
kBlockSize
;
int32_t
blkLeft
=
kBlockSize
-
blkOffset
;
if
(
offset
>=
ctx
->
file
.
size
)
return
0
;
do
{
char
key
[
128
]
=
{
0
};
idxGenLRUKey
(
key
,
ctx
->
file
.
buf
,
blkId
);
...
...
@@ -80,24 +82,34 @@ static int idxFileCtxDoReadFrom(IFileCtx* ctx, uint8_t* buf, int len, int32_t of
memcpy
(
buf
+
total
,
blk
->
buf
+
blkOffset
,
nread
);
taosLRUCacheRelease
(
ctx
->
lru
,
h
,
false
);
}
else
{
int32_t
cacheMemSize
=
sizeof
(
SDataBlock
)
+
kBlockSize
;
int32_t
left
=
ctx
->
file
.
size
-
offset
;
if
(
left
<
kBlockSize
)
{
nread
=
TMIN
(
left
,
len
);
int32_t
bytes
=
taosPReadFile
(
ctx
->
file
.
pFile
,
buf
+
total
,
nread
,
offset
);
assert
(
bytes
==
nread
);
SDataBlock
*
blk
=
taosMemoryCalloc
(
1
,
cacheMemSize
)
;
blk
->
blockId
=
blkId
;
blk
->
nread
=
taosPReadFile
(
ctx
->
file
.
pFile
,
blk
->
buf
,
kBlockSize
,
blkId
*
kBlockSize
);
assert
(
blk
->
nread
<=
kBlockSize
)
;
total
+=
bytes
;
return
total
;
}
else
{
int32_t
cacheMemSize
=
sizeof
(
SDataBlock
)
+
kBlockSize
;
if
(
blk
->
nread
<
kBlockSize
&&
blk
->
nread
<
len
)
{
break
;
}
SDataBlock
*
blk
=
taosMemoryCalloc
(
1
,
cacheMemSize
);
blk
->
blockId
=
blkId
;
blk
->
nread
=
taosPReadFile
(
ctx
->
file
.
pFile
,
blk
->
buf
,
kBlockSize
,
blkId
*
kBlockSize
);
assert
(
blk
->
nread
<=
kBlockSize
);
nread
=
TMIN
(
blkLeft
,
len
);
memcpy
(
buf
+
total
,
blk
->
buf
+
blkOffset
,
nread
);
if
(
blk
->
nread
<
kBlockSize
&&
blk
->
nread
<
len
)
{
break
;
}
nread
=
TMIN
(
blkLeft
,
len
);
memcpy
(
buf
+
total
,
blk
->
buf
+
blkOffset
,
nread
);
LRUStatus
s
=
taosLRUCacheInsert
(
ctx
->
lru
,
key
,
strlen
(
key
),
blk
,
cacheMemSize
,
deleteDataBlockFromLRU
,
NULL
,
TAOS_LRU_PRIORITY_LOW
);
if
(
s
!=
TAOS_LRU_STATUS_OK
)
{
return
-
1
;
LRUStatus
s
=
taosLRUCacheInsert
(
ctx
->
lru
,
key
,
strlen
(
key
),
blk
,
cacheMemSize
,
deleteDataBlockFromLRU
,
NULL
,
TAOS_LRU_PRIORITY_LOW
);
if
(
s
!=
TAOS_LRU_STATUS_OK
)
{
return
-
1
;
}
}
}
total
+=
nread
;
...
...
@@ -146,9 +158,7 @@ IFileCtx* idxFileCtxCreate(WriterType type, const char* path, bool readOnly, int
}
else
{
ctx
->
file
.
pFile
=
taosOpenFile
(
path
,
TD_FILE_READ
);
int64_t
size
=
0
;
taosFStatFile
(
ctx
->
file
.
pFile
,
&
ctx
->
file
.
size
,
NULL
);
ctx
->
file
.
size
=
(
int
)
size
;
#ifdef USE_MMAP
ctx
->
file
.
ptr
=
(
char
*
)
tfMmapReadOnly
(
ctx
->
file
.
pFile
,
ctx
->
file
.
size
);
#endif
...
...
source/libs/index/test/jsonUT.cc
浏览文件 @
63600419
...
...
@@ -172,9 +172,9 @@ TEST_F(JsonEnv, testWriteMillonData) {
{
std
::
string
colName
(
"voltagefdadfa"
);
std
::
string
colVal
(
"abxxxxxxxxxxxx"
);
for
(
int
i
=
0
;
i
<
10
;
i
++
)
{
for
(
int
i
=
0
;
i
<
10
000
;
i
++
)
{
colVal
[
i
%
colVal
.
size
()]
=
'0'
+
i
%
128
;
for
(
size_t
i
=
0
;
i
<
10
0
;
i
++
)
{
for
(
size_t
i
=
0
;
i
<
10
;
i
++
)
{
SIndexTerm
*
term
=
indexTermCreateT
(
1
,
ADD_VALUE
,
TSDB_DATA_TYPE_BINARY
,
colName
.
c_str
(),
colName
.
size
(),
colVal
.
c_str
(),
colVal
.
size
());
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录