Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
慢慢CG
TDengine
提交
2e3e34f3
T
TDengine
项目概览
慢慢CG
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
2e3e34f3
编写于
3月 01, 2021
作者:
H
Hongze Cheng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[TD-3096]<hotfix>: fix query dead lock
上级
62ac3d2e
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
74 addition
and
16 deletion
+74
-16
src/tsdb/inc/tsdbMemTable.h
src/tsdb/inc/tsdbMemTable.h
+2
-1
src/tsdb/src/tsdbMemTable.c
src/tsdb/src/tsdbMemTable.c
+71
-14
src/tsdb/src/tsdbRead.c
src/tsdb/src/tsdbRead.c
+1
-1
未找到文件。
src/tsdb/inc/tsdbMemTable.h
浏览文件 @
2e3e34f3
...
@@ -37,6 +37,7 @@ typedef struct {
...
@@ -37,6 +37,7 @@ typedef struct {
TSKEY
keyLast
;
TSKEY
keyLast
;
int64_t
numOfRows
;
int64_t
numOfRows
;
SSkipList
*
pData
;
SSkipList
*
pData
;
T_REF_DECLARE
();
}
STableData
;
}
STableData
;
typedef
struct
{
typedef
struct
{
...
@@ -76,7 +77,7 @@ typedef struct {
...
@@ -76,7 +77,7 @@ typedef struct {
int
tsdbRefMemTable
(
STsdbRepo
*
pRepo
,
SMemTable
*
pMemTable
);
int
tsdbRefMemTable
(
STsdbRepo
*
pRepo
,
SMemTable
*
pMemTable
);
int
tsdbUnRefMemTable
(
STsdbRepo
*
pRepo
,
SMemTable
*
pMemTable
);
int
tsdbUnRefMemTable
(
STsdbRepo
*
pRepo
,
SMemTable
*
pMemTable
);
int
tsdbTakeMemSnapshot
(
STsdbRepo
*
pRepo
,
SMemTable
**
pMem
,
SMemTable
**
pIMem
);
int
tsdbTakeMemSnapshot
(
STsdbRepo
*
pRepo
,
SMemTable
**
pMem
,
SMemTable
**
pIMem
,
SArray
*
pATable
);
void
tsdbUnTakeMemSnapShot
(
STsdbRepo
*
pRepo
,
SMemTable
*
pMem
,
SMemTable
*
pIMem
);
void
tsdbUnTakeMemSnapShot
(
STsdbRepo
*
pRepo
,
SMemTable
*
pMem
,
SMemTable
*
pIMem
);
void
*
tsdbAllocBytes
(
STsdbRepo
*
pRepo
,
int
bytes
);
void
*
tsdbAllocBytes
(
STsdbRepo
*
pRepo
,
int
bytes
);
int
tsdbAsyncCommit
(
STsdbRepo
*
pRepo
);
int
tsdbAsyncCommit
(
STsdbRepo
*
pRepo
);
...
...
src/tsdb/src/tsdbMemTable.c
浏览文件 @
2e3e34f3
...
@@ -124,17 +124,66 @@ int tsdbUnRefMemTable(STsdbRepo *pRepo, SMemTable *pMemTable) {
...
@@ -124,17 +124,66 @@ int tsdbUnRefMemTable(STsdbRepo *pRepo, SMemTable *pMemTable) {
return
0
;
return
0
;
}
}
int
tsdbTakeMemSnapshot
(
STsdbRepo
*
pRepo
,
SMemTable
**
pMem
,
SMemTable
**
pIMem
)
{
int
tsdbTakeMemSnapshot
(
STsdbRepo
*
pRepo
,
SMemTable
**
pMem
,
SMemTable
**
pIMem
,
SArray
*
pATable
)
{
SMemTable
*
tmem
;
// Get snap object
if
(
tsdbLockRepo
(
pRepo
)
<
0
)
return
-
1
;
if
(
tsdbLockRepo
(
pRepo
)
<
0
)
return
-
1
;
*
pM
em
=
pRepo
->
mem
;
tm
em
=
pRepo
->
mem
;
*
pIMem
=
pRepo
->
imem
;
*
pIMem
=
pRepo
->
imem
;
tsdbRefMemTable
(
pRepo
,
*
pM
em
);
tsdbRefMemTable
(
pRepo
,
tm
em
);
tsdbRefMemTable
(
pRepo
,
*
pIMem
);
tsdbRefMemTable
(
pRepo
,
*
pIMem
);
if
(
tsdbUnlockRepo
(
pRepo
)
<
0
)
return
-
1
;
if
(
tsdbUnlockRepo
(
pRepo
)
<
0
)
return
-
1
;
if
(
*
pMem
!=
NULL
)
taosRLockLatch
(
&
((
*
pMem
)
->
latch
));
// Copy mem objects and ref needed STableData
if
(
tmem
)
{
taosRLockLatch
(
&
(
tmem
->
latch
));
*
pMem
=
(
SMemTable
*
)
calloc
(
1
,
sizeof
(
**
pMem
));
if
(
*
pMem
==
NULL
)
{
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
taosRUnLockLatch
(
&
(
tmem
->
latch
));
tsdbUnRefMemTable
(
pRepo
,
tmem
);
tsdbUnRefMemTable
(
pRepo
,
*
pIMem
);
*
pMem
=
NULL
;
*
pIMem
=
NULL
;
return
-
1
;
}
(
*
pMem
)
->
tData
=
(
STableData
**
)
calloc
(
tmem
->
maxTables
,
sizeof
(
STableData
*
));
if
((
*
pMem
)
->
tData
==
NULL
)
{
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
taosRUnLockLatch
(
&
(
tmem
->
latch
));
free
(
*
pMem
);
tsdbUnRefMemTable
(
pRepo
,
tmem
);
tsdbUnRefMemTable
(
pRepo
,
*
pIMem
);
*
pMem
=
NULL
;
*
pIMem
=
NULL
;
return
-
1
;
}
(
*
pMem
)
->
keyFirst
=
tmem
->
keyFirst
;
(
*
pMem
)
->
keyLast
=
tmem
->
keyLast
;
(
*
pMem
)
->
numOfRows
=
tmem
->
numOfRows
;
(
*
pMem
)
->
maxTables
=
tmem
->
maxTables
;
for
(
size_t
i
=
0
;
i
<
taosArrayGetSize
(
pATable
);
i
++
)
{
STable
*
pTable
=
*
(
STable
**
)
taosArrayGet
(
pATable
,
i
);
int32_t
tid
=
TABLE_TID
(
pTable
);
STableData
*
pTableData
=
(
tid
<
tmem
->
maxTables
)
?
tmem
->
tData
[
tid
]
:
NULL
;
if
((
pTableData
==
NULL
)
||
(
TABLE_UID
(
pTable
)
!=
pTableData
->
uid
))
continue
;
(
*
pMem
)
->
tData
[
tid
]
=
tmem
->
tData
[
tid
];
T_REF_INC
(
tmem
->
tData
[
tid
]);
}
taosRUnLockLatch
(
&
(
tmem
->
latch
));
}
tsdbUnRefMemTable
(
pRepo
,
tmem
);
tsdbDebug
(
"vgId:%d take memory snapshot, pMem %p pIMem %p"
,
REPO_ID
(
pRepo
),
*
pMem
,
*
pIMem
);
tsdbDebug
(
"vgId:%d take memory snapshot, pMem %p pIMem %p"
,
REPO_ID
(
pRepo
),
*
pMem
,
*
pIMem
);
return
0
;
return
0
;
...
@@ -144,8 +193,14 @@ void tsdbUnTakeMemSnapShot(STsdbRepo *pRepo, SMemTable *pMem, SMemTable *pIMem)
...
@@ -144,8 +193,14 @@ void tsdbUnTakeMemSnapShot(STsdbRepo *pRepo, SMemTable *pMem, SMemTable *pIMem)
tsdbDebug
(
"vgId:%d untake memory snapshot, pMem %p pIMem %p"
,
REPO_ID
(
pRepo
),
pMem
,
pIMem
);
tsdbDebug
(
"vgId:%d untake memory snapshot, pMem %p pIMem %p"
,
REPO_ID
(
pRepo
),
pMem
,
pIMem
);
if
(
pMem
!=
NULL
)
{
if
(
pMem
!=
NULL
)
{
taosRUnLockLatch
(
&
(
pMem
->
latch
));
for
(
size_t
i
=
0
;
i
<
pMem
->
maxTables
;
i
++
)
{
tsdbUnRefMemTable
(
pRepo
,
pMem
);
STableData
*
pTableData
=
pMem
->
tData
[
i
];
if
(
pTableData
)
{
tsdbFreeTableData
(
pTableData
);
}
}
free
(
pMem
->
tData
);
free
(
pMem
);
}
}
if
(
pIMem
!=
NULL
)
{
if
(
pIMem
!=
NULL
)
{
...
@@ -436,7 +491,7 @@ static STableData *tsdbNewTableData(STsdbCfg *pCfg, STable *pTable) {
...
@@ -436,7 +491,7 @@ static STableData *tsdbNewTableData(STsdbCfg *pCfg, STable *pTable) {
STableData
*
pTableData
=
(
STableData
*
)
calloc
(
1
,
sizeof
(
*
pTableData
));
STableData
*
pTableData
=
(
STableData
*
)
calloc
(
1
,
sizeof
(
*
pTableData
));
if
(
pTableData
==
NULL
)
{
if
(
pTableData
==
NULL
)
{
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
goto
_err
;
return
NULL
;
}
}
pTableData
->
uid
=
TABLE_UID
(
pTable
);
pTableData
->
uid
=
TABLE_UID
(
pTable
);
...
@@ -449,20 +504,22 @@ static STableData *tsdbNewTableData(STsdbCfg *pCfg, STable *pTable) {
...
@@ -449,20 +504,22 @@ static STableData *tsdbNewTableData(STsdbCfg *pCfg, STable *pTable) {
tkeyComparFn
,
pCfg
->
update
?
SL_UPDATE_DUP_KEY
:
SL_DISCARD_DUP_KEY
,
tsdbGetTsTupleKey
);
tkeyComparFn
,
pCfg
->
update
?
SL_UPDATE_DUP_KEY
:
SL_DISCARD_DUP_KEY
,
tsdbGetTsTupleKey
);
if
(
pTableData
->
pData
==
NULL
)
{
if
(
pTableData
->
pData
==
NULL
)
{
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
goto
_err
;
free
(
pTableData
);
return
NULL
;
}
}
return
pTableData
;
T_REF_INC
(
pTableData
)
;
_err:
return
pTableData
;
tsdbFreeTableData
(
pTableData
);
return
NULL
;
}
}
static
void
tsdbFreeTableData
(
STableData
*
pTableData
)
{
static
void
tsdbFreeTableData
(
STableData
*
pTableData
)
{
if
(
pTableData
)
{
if
(
pTableData
)
{
tSkipListDestroy
(
pTableData
->
pData
);
int32_t
ref
=
T_REF_DEC
(
pTableData
);
free
(
pTableData
);
if
(
ref
==
0
)
{
tSkipListDestroy
(
pTableData
->
pData
);
free
(
pTableData
);
}
}
}
}
}
...
...
src/tsdb/src/tsdbRead.c
浏览文件 @
2e3e34f3
...
@@ -192,7 +192,7 @@ static void tsdbMayTakeMemSnapshot(STsdbQueryHandle* pQueryHandle) {
...
@@ -192,7 +192,7 @@ static void tsdbMayTakeMemSnapshot(STsdbQueryHandle* pQueryHandle) {
SMemRef
*
pMemRef
=
pQueryHandle
->
pMemRef
;
SMemRef
*
pMemRef
=
pQueryHandle
->
pMemRef
;
if
(
pQueryHandle
->
pMemRef
->
ref
++
==
0
)
{
if
(
pQueryHandle
->
pMemRef
->
ref
++
==
0
)
{
tsdbTakeMemSnapshot
(
pQueryHandle
->
pTsdb
,
(
SMemTable
**
)
&
(
pMemRef
->
mem
),
(
SMemTable
**
)
&
(
pMemRef
->
imem
));
tsdbTakeMemSnapshot
(
pQueryHandle
->
pTsdb
,
(
SMemTable
**
)
&
(
pMemRef
->
mem
),
(
SMemTable
**
)
&
(
pMemRef
->
imem
)
,
NULL
);
}
}
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录