Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
c381ffd3
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看板
提交
c381ffd3
编写于
8月 09, 2022
作者:
wmmhello
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix:error in tmq for snapshot
上级
507adf9e
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
314 addition
and
201 deletion
+314
-201
examples/c/tmq_taosx.c
examples/c/tmq_taosx.c
+25
-25
include/libs/executor/executor.h
include/libs/executor/executor.h
+6
-0
source/dnode/vnode/inc/vnode.h
source/dnode/vnode/inc/vnode.h
+8
-0
source/dnode/vnode/src/meta/metaSnapshot.c
source/dnode/vnode/src/meta/metaSnapshot.c
+203
-133
source/dnode/vnode/src/tq/tq.c
source/dnode/vnode/src/tq/tq.c
+2
-1
source/dnode/vnode/src/tq/tqExec.c
source/dnode/vnode/src/tq/tqExec.c
+21
-12
source/libs/executor/inc/executorimpl.h
source/libs/executor/inc/executorimpl.h
+2
-0
source/libs/executor/src/executor.c
source/libs/executor/src/executor.c
+20
-12
source/libs/executor/src/scanoperator.c
source/libs/executor/src/scanoperator.c
+26
-17
source/libs/qcom/src/queryUtil.c
source/libs/qcom/src/queryUtil.c
+1
-1
未找到文件。
examples/c/tmq_taosx.c
浏览文件 @
c381ffd3
...
@@ -219,19 +219,19 @@ int32_t init_env() {
...
@@ -219,19 +219,19 @@ int32_t init_env() {
}
}
taos_free_result
(
pRes
);
taos_free_result
(
pRes
);
pRes
=
taos_query
(
pConn
,
"drop table ct3 ct1"
);
//
pRes = taos_query(pConn, "drop table ct3 ct1");
if
(
taos_errno
(
pRes
)
!=
0
)
{
//
if (taos_errno(pRes) != 0) {
printf
(
"failed to drop child table ct3, reason:%s
\n
"
,
taos_errstr
(
pRes
));
//
printf("failed to drop child table ct3, reason:%s\n", taos_errstr(pRes));
return
-
1
;
//
return -1;
}
//
}
taos_free_result
(
pRes
);
//
taos_free_result(pRes);
//
pRes
=
taos_query
(
pConn
,
"drop table st1"
);
//
pRes = taos_query(pConn, "drop table st1");
if
(
taos_errno
(
pRes
)
!=
0
)
{
//
if (taos_errno(pRes) != 0) {
printf
(
"failed to drop super table st1, reason:%s
\n
"
,
taos_errstr
(
pRes
));
//
printf("failed to drop super table st1, reason:%s\n", taos_errstr(pRes));
return
-
1
;
//
return -1;
}
//
}
taos_free_result
(
pRes
);
//
taos_free_result(pRes);
pRes
=
taos_query
(
pConn
,
"create table if not exists n1(ts timestamp, c1 int, c2 nchar(4))"
);
pRes
=
taos_query
(
pConn
,
"create table if not exists n1(ts timestamp, c1 int, c2 nchar(4))"
);
if
(
taos_errno
(
pRes
)
!=
0
)
{
if
(
taos_errno
(
pRes
)
!=
0
)
{
...
@@ -282,12 +282,12 @@ int32_t init_env() {
...
@@ -282,12 +282,12 @@ int32_t init_env() {
}
}
taos_free_result
(
pRes
);
taos_free_result
(
pRes
);
pRes
=
taos_query
(
pConn
,
"drop table n1"
);
//
pRes = taos_query(pConn, "drop table n1");
if
(
taos_errno
(
pRes
)
!=
0
)
{
//
if (taos_errno(pRes) != 0) {
printf
(
"failed to drop normal table n1, reason:%s
\n
"
,
taos_errstr
(
pRes
));
//
printf("failed to drop normal table n1, reason:%s\n", taos_errstr(pRes));
return
-
1
;
//
return -1;
}
//
}
taos_free_result
(
pRes
);
//
taos_free_result(pRes);
pRes
=
taos_query
(
pConn
,
"create table jt(ts timestamp, i int) tags(t json)"
);
pRes
=
taos_query
(
pConn
,
"create table jt(ts timestamp, i int) tags(t json)"
);
if
(
taos_errno
(
pRes
)
!=
0
)
{
if
(
taos_errno
(
pRes
)
!=
0
)
{
...
@@ -319,12 +319,12 @@ int32_t init_env() {
...
@@ -319,12 +319,12 @@ int32_t init_env() {
}
}
taos_free_result
(
pRes
);
taos_free_result
(
pRes
);
pRes
=
taos_query
(
pConn
,
"drop table st1"
);
//
pRes = taos_query(pConn, "drop table st1");
if
(
taos_errno
(
pRes
)
!=
0
)
{
//
if (taos_errno(pRes) != 0) {
printf
(
"failed to drop super table st1, reason:%s
\n
"
,
taos_errstr
(
pRes
));
//
printf("failed to drop super table st1, reason:%s\n", taos_errstr(pRes));
return
-
1
;
//
return -1;
}
//
}
taos_free_result
(
pRes
);
//
taos_free_result(pRes);
taos_close
(
pConn
);
taos_close
(
pConn
);
return
0
;
return
0
;
...
...
include/libs/executor/executor.h
浏览文件 @
c381ffd3
...
@@ -189,6 +189,12 @@ int32_t qStreamExtractOffset(qTaskInfo_t tinfo, STqOffsetVal* pOffset);
...
@@ -189,6 +189,12 @@ int32_t qStreamExtractOffset(qTaskInfo_t tinfo, STqOffsetVal* pOffset);
SMqMetaRsp
*
qStreamExtractMetaMsg
(
qTaskInfo_t
tinfo
);
SMqMetaRsp
*
qStreamExtractMetaMsg
(
qTaskInfo_t
tinfo
);
int64_t
qStreamExtractPrepareUid
(
qTaskInfo_t
tinfo
);
const
SSchemaWrapper
*
qExtractSchemaFromTask
(
qTaskInfo_t
tinfo
);
const
char
*
qExtractTbnameFromTask
(
qTaskInfo_t
tinfo
);
void
*
qExtractReaderFromStreamScanner
(
void
*
scanner
);
void
*
qExtractReaderFromStreamScanner
(
void
*
scanner
);
int32_t
qExtractStreamScanner
(
qTaskInfo_t
tinfo
,
void
**
scanner
);
int32_t
qExtractStreamScanner
(
qTaskInfo_t
tinfo
,
void
**
scanner
);
...
...
source/dnode/vnode/inc/vnode.h
浏览文件 @
c381ffd3
...
@@ -156,8 +156,14 @@ typedef struct SMetaTableInfo{
...
@@ -156,8 +156,14 @@ typedef struct SMetaTableInfo{
int64_t
suid
;
int64_t
suid
;
int64_t
uid
;
int64_t
uid
;
SSchemaWrapper
*
schema
;
SSchemaWrapper
*
schema
;
char
tbName
[
TSDB_TABLE_NAME_LEN
];
}
SMetaTableInfo
;
}
SMetaTableInfo
;
typedef
struct
SIdInfo
{
int64_t
version
;
int32_t
index
;
}
SIdInfo
;
typedef
struct
SSnapContext
{
typedef
struct
SSnapContext
{
SMeta
*
pMeta
;
SMeta
*
pMeta
;
int64_t
snapVersion
;
int64_t
snapVersion
;
...
@@ -166,6 +172,8 @@ typedef struct SSnapContext {
...
@@ -166,6 +172,8 @@ typedef struct SSnapContext {
int8_t
subType
;
int8_t
subType
;
SHashObj
*
idVersion
;
SHashObj
*
idVersion
;
SHashObj
*
suidInfo
;
SHashObj
*
suidInfo
;
SArray
*
idList
;
int32_t
index
;
bool
withMeta
;
bool
withMeta
;
bool
queryMetaOrData
;
// true-get meta, false-get data
bool
queryMetaOrData
;
// true-get meta, false-get data
}
SSnapContext
;
}
SSnapContext
;
...
...
source/dnode/vnode/src/meta/metaSnapshot.c
浏览文件 @
c381ffd3
...
@@ -200,21 +200,59 @@ typedef struct STableInfoForChildTable{
...
@@ -200,21 +200,59 @@ typedef struct STableInfoForChildTable{
char
*
tableName
;
char
*
tableName
;
SArray
*
tagName
;
SArray
*
tagName
;
SSchemaWrapper
*
schemaRow
;
SSchemaWrapper
*
schemaRow
;
SSchemaWrapper
*
tagRow
;
}
STableInfoForChildTable
;
}
STableInfoForChildTable
;
static
void
destroySTableInfoForChildTable
(
void
*
data
)
{
static
void
destroySTableInfoForChildTable
(
void
*
data
)
{
STableInfoForChildTable
*
pData
=
(
STableInfoForChildTable
*
)
data
;
STableInfoForChildTable
*
pData
=
(
STableInfoForChildTable
*
)
data
;
taosMemoryFree
(
pData
->
ta
g
Name
);
taosMemoryFree
(
pData
->
ta
ble
Name
);
taosArrayDestroy
(
pData
->
tagName
);
taosArrayDestroy
(
pData
->
tagName
);
tDeleteSSchemaWrapper
(
pData
->
schemaRow
);
tDeleteSSchemaWrapper
(
pData
->
schemaRow
);
}
}
static
void
clearAndMoveToFirst
(
SSnapContext
*
ctx
){
static
void
MoveToSnapShotVersion
(
SSnapContext
*
ctx
){
tdbTbcClose
(
ctx
->
pCur
);
tdbTbcOpen
(
ctx
->
pMeta
->
pTbDb
,
&
ctx
->
pCur
,
NULL
);
STbDbKey
key
=
{.
version
=
ctx
->
snapVersion
,
.
uid
=
INT64_MAX
};
int
c
=
0
;
tdbTbcMoveTo
(
ctx
->
pCur
,
&
key
,
sizeof
(
key
),
&
c
);
if
(
c
<
0
){
tdbTbcMoveToPrev
(
ctx
->
pCur
);
}
}
static
void
MoveToPosition
(
SSnapContext
*
ctx
,
int64_t
ver
,
int64_t
uid
){
tdbTbcClose
(
ctx
->
pCur
);
tdbTbcOpen
(
ctx
->
pMeta
->
pTbDb
,
&
ctx
->
pCur
,
NULL
);
STbDbKey
key
=
{.
version
=
ver
,
.
uid
=
uid
};
int
c
=
0
;
tdbTbcMoveTo
(
ctx
->
pCur
,
&
key
,
sizeof
(
key
),
&
c
);
ASSERT
(
c
==
0
);
}
static
void
MoveToFirst
(
SSnapContext
*
ctx
){
tdbTbcClose
(
ctx
->
pCur
);
tdbTbcClose
(
ctx
->
pCur
);
tdbTbcOpen
(
ctx
->
pMeta
->
pTbDb
,
&
ctx
->
pCur
,
NULL
);
tdbTbcOpen
(
ctx
->
pMeta
->
pTbDb
,
&
ctx
->
pCur
,
NULL
);
tdbTbcMoveToFirst
(
ctx
->
pCur
);
tdbTbcMoveToFirst
(
ctx
->
pCur
);
}
}
static
void
saveSuperTableInfoForChildTable
(
SMetaEntry
*
me
,
SHashObj
*
suidInfo
){
STableInfoForChildTable
*
data
=
(
STableInfoForChildTable
*
)
taosHashGet
(
suidInfo
,
&
me
->
uid
,
sizeof
(
tb_uid_t
));
if
(
data
){
return
;
}
STableInfoForChildTable
dataTmp
=
{
0
};
dataTmp
.
tableName
=
strdup
(
me
->
name
);
dataTmp
.
tagName
=
taosArrayInit
(
me
->
stbEntry
.
schemaTag
.
nCols
,
TSDB_COL_NAME_LEN
);
for
(
int
i
=
0
;
i
<
me
->
stbEntry
.
schemaTag
.
nCols
;
i
++
){
SSchema
*
schema
=
&
me
->
stbEntry
.
schemaTag
.
pSchema
[
i
];
taosArrayPush
(
dataTmp
.
tagName
,
schema
->
name
);
}
dataTmp
.
schemaRow
=
tCloneSSchemaWrapper
(
&
me
->
stbEntry
.
schemaRow
);
dataTmp
.
tagRow
=
tCloneSSchemaWrapper
(
&
me
->
stbEntry
.
schemaTag
);
taosHashPut
(
suidInfo
,
&
me
->
uid
,
sizeof
(
tb_uid_t
),
&
dataTmp
,
sizeof
(
STableInfoForChildTable
));
}
int32_t
buildSnapContext
(
SMeta
*
pMeta
,
int64_t
snapVersion
,
int64_t
suid
,
int8_t
subType
,
bool
withMeta
,
SSnapContext
**
ctxRet
){
int32_t
buildSnapContext
(
SMeta
*
pMeta
,
int64_t
snapVersion
,
int64_t
suid
,
int8_t
subType
,
bool
withMeta
,
SSnapContext
**
ctxRet
){
SSnapContext
*
ctx
=
taosMemoryCalloc
(
1
,
sizeof
(
SSnapContext
));
SSnapContext
*
ctx
=
taosMemoryCalloc
(
1
,
sizeof
(
SSnapContext
));
if
(
ctx
==
NULL
)
return
-
1
;
if
(
ctx
==
NULL
)
return
-
1
;
...
@@ -225,10 +263,6 @@ int32_t buildSnapContext(SMeta* pMeta, int64_t snapVersion, int64_t suid, int8_t
...
@@ -225,10 +263,6 @@ int32_t buildSnapContext(SMeta* pMeta, int64_t snapVersion, int64_t suid, int8_t
ctx
->
subType
=
subType
;
ctx
->
subType
=
subType
;
ctx
->
queryMetaOrData
=
withMeta
;
ctx
->
queryMetaOrData
=
withMeta
;
ctx
->
withMeta
=
withMeta
;
ctx
->
withMeta
=
withMeta
;
int32_t
ret
=
tdbTbcOpen
(
pMeta
->
pTbDb
,
&
ctx
->
pCur
,
NULL
);
if
(
ret
<
0
)
{
return
-
1
;
}
ctx
->
idVersion
=
taosHashInit
(
100
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BIGINT
),
true
,
HASH_NO_LOCK
);
ctx
->
idVersion
=
taosHashInit
(
100
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BIGINT
),
true
,
HASH_NO_LOCK
);
if
(
ctx
->
idVersion
==
NULL
){
if
(
ctx
->
idVersion
==
NULL
){
return
-
1
;
return
-
1
;
...
@@ -240,25 +274,84 @@ int32_t buildSnapContext(SMeta* pMeta, int64_t snapVersion, int64_t suid, int8_t
...
@@ -240,25 +274,84 @@ int32_t buildSnapContext(SMeta* pMeta, int64_t snapVersion, int64_t suid, int8_t
}
}
taosHashSetFreeFp
(
ctx
->
suidInfo
,
destroySTableInfoForChildTable
);
taosHashSetFreeFp
(
ctx
->
suidInfo
,
destroySTableInfoForChildTable
);
ctx
->
index
=
0
;
ctx
->
idList
=
taosArrayInit
(
100
,
sizeof
(
int64_t
));
void
*
pKey
=
NULL
;
void
*
pKey
=
NULL
;
void
*
pVal
=
NULL
;
void
*
pVal
=
NULL
;
int
vLen
,
kLen
;
int
vLen
=
0
,
kLen
=
0
;
tdbTbcMoveToFirst
(
ctx
->
pCur
);
metaDebug
(
"tmqsnap init snapVersion:%"
PRIi64
,
ctx
->
snapVersion
);
MoveToFirst
(
ctx
);
while
(
1
){
int32_t
ret
=
tdbTbcNext
(
ctx
->
pCur
,
&
pKey
,
&
kLen
,
&
pVal
,
&
vLen
);
if
(
ret
<
0
)
break
;
STbDbKey
*
tmp
=
(
STbDbKey
*
)
pKey
;
if
(
tmp
->
version
>
ctx
->
snapVersion
)
break
;
SDecoder
dc
=
{
0
};
SMetaEntry
me
=
{
0
};
tDecoderInit
(
&
dc
,
pVal
,
vLen
);
metaDecodeEntry
(
&
dc
,
&
me
);
if
(
ctx
->
subType
==
TOPIC_SUB_TYPE__TABLE
){
if
((
me
.
uid
!=
ctx
->
suid
&&
me
.
type
==
TSDB_SUPER_TABLE
)
||
(
me
.
ctbEntry
.
suid
!=
ctx
->
suid
&&
me
.
type
==
TSDB_CHILD_TABLE
)){
continue
;
}
}
SIdInfo
*
idData
=
(
SIdInfo
*
)
taosHashGet
(
ctx
->
idVersion
,
&
tmp
->
uid
,
sizeof
(
tb_uid_t
));
if
(
!
idData
){
taosArrayPush
(
ctx
->
idList
,
&
tmp
->
uid
);
metaDebug
(
"tmqsnap init idlist name:%s, uid:%"
PRIi64
,
me
.
name
,
tmp
->
uid
);
SIdInfo
info
=
{
0
};
taosHashPut
(
ctx
->
idVersion
,
&
tmp
->
uid
,
sizeof
(
tb_uid_t
),
&
info
,
sizeof
(
SIdInfo
));
}
}
taosHashClear
(
ctx
->
idVersion
);
MoveToSnapShotVersion
(
ctx
);
while
(
1
){
while
(
1
){
ret
=
tdbTbcNext
(
ctx
->
pCur
,
&
pKey
,
&
kLen
,
&
pVal
,
&
vLen
);
int32_t
ret
=
tdbTbcPrev
(
ctx
->
pCur
,
&
pKey
,
&
kLen
,
&
pVal
,
&
vLen
);
if
(
ret
<
0
)
break
;
if
(
ret
<
0
)
break
;
STbDbKey
*
tmp
=
(
STbDbKey
*
)
pKey
;
STbDbKey
*
tmp
=
(
STbDbKey
*
)
pKey
;
if
(
tmp
->
version
>
ctx
->
snapVersion
)
break
;
SIdInfo
*
idData
=
(
SIdInfo
*
)
taosHashGet
(
ctx
->
idVersion
,
&
tmp
->
uid
,
sizeof
(
tb_uid_t
));
taosHashPut
(
ctx
->
idVersion
,
&
tmp
->
uid
,
sizeof
(
tb_uid_t
),
&
tmp
->
version
,
sizeof
(
int64_t
));
if
(
!
idData
){
SIdInfo
info
=
{.
version
=
tmp
->
version
,
.
index
=
0
};
taosHashPut
(
ctx
->
idVersion
,
&
tmp
->
uid
,
sizeof
(
tb_uid_t
),
&
info
,
sizeof
(
SIdInfo
));
}
SDecoder
dc
=
{
0
};
SMetaEntry
me
=
{
0
};
tDecoderInit
(
&
dc
,
pVal
,
vLen
);
metaDecodeEntry
(
&
dc
,
&
me
);
if
(
ctx
->
subType
==
TOPIC_SUB_TYPE__TABLE
){
if
((
me
.
uid
!=
ctx
->
suid
&&
me
.
type
==
TSDB_SUPER_TABLE
)
||
(
me
.
ctbEntry
.
suid
!=
ctx
->
suid
&&
me
.
type
==
TSDB_CHILD_TABLE
)){
continue
;
}
}
if
((
ctx
->
subType
==
TOPIC_SUB_TYPE__DB
&&
me
.
type
==
TSDB_SUPER_TABLE
)
||
(
ctx
->
subType
==
TOPIC_SUB_TYPE__TABLE
&&
me
.
uid
==
ctx
->
suid
))
{
saveSuperTableInfoForChildTable
(
&
me
,
ctx
->
suidInfo
);
}
tDecoderClear
(
&
dc
);
}
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
ctx
->
idList
);
i
++
){
int64_t
*
uid
=
taosArrayGet
(
ctx
->
idList
,
i
);
SIdInfo
*
idData
=
(
SIdInfo
*
)
taosHashGet
(
ctx
->
idVersion
,
uid
,
sizeof
(
int64_t
));
ASSERT
(
idData
);
idData
->
index
=
i
;
metaDebug
(
"tmqsnap init idVersion uid:%"
PRIi64
" version:%"
PRIi64
" index:%d"
,
*
uid
,
idData
->
version
,
idData
->
index
);
}
}
clearAndMoveToFirst
(
ctx
);
return
TDB_CODE_SUCCESS
;
return
TDB_CODE_SUCCESS
;
}
}
int32_t
destroySnapContext
(
SSnapContext
*
ctx
){
int32_t
destroySnapContext
(
SSnapContext
*
ctx
){
tdbTbcClose
(
ctx
->
pCur
);
tdbTbcClose
(
ctx
->
pCur
);
taosArrayDestroy
(
ctx
->
idList
);
taosHashCleanup
(
ctx
->
idVersion
);
taosHashCleanup
(
ctx
->
idVersion
);
taosHashCleanup
(
ctx
->
suidInfo
);
taosHashCleanup
(
ctx
->
suidInfo
);
taosMemoryFree
(
ctx
);
taosMemoryFree
(
ctx
);
...
@@ -327,42 +420,20 @@ static int32_t buildSuperTableInfo(SVCreateStbReq *req, void **pBuf, int32_t *co
...
@@ -327,42 +420,20 @@ static int32_t buildSuperTableInfo(SVCreateStbReq *req, void **pBuf, int32_t *co
return
0
;
return
0
;
}
}
static
void
saveSuperTableInfoForChildTable
(
SMetaEntry
*
me
,
SHashObj
*
suidInfo
){
STableInfoForChildTable
dataTmp
=
{
0
};
dataTmp
.
tableName
=
strdup
(
me
->
name
);
dataTmp
.
tagName
=
taosArrayInit
(
me
->
stbEntry
.
schemaTag
.
nCols
,
TSDB_COL_NAME_LEN
);
for
(
int
i
=
0
;
i
<
me
->
stbEntry
.
schemaTag
.
nCols
;
i
++
){
SSchema
*
schema
=
&
me
->
stbEntry
.
schemaTag
.
pSchema
[
i
];
taosArrayPush
(
dataTmp
.
tagName
,
schema
->
name
);
}
dataTmp
.
schemaRow
=
tCloneSSchemaWrapper
(
&
me
->
stbEntry
.
schemaRow
);
STableInfoForChildTable
*
data
=
(
STableInfoForChildTable
*
)
taosHashGet
(
suidInfo
,
&
me
->
uid
,
sizeof
(
tb_uid_t
));
if
(
data
){
destroySTableInfoForChildTable
(
data
);
}
taosHashPut
(
suidInfo
,
&
me
->
uid
,
sizeof
(
tb_uid_t
),
&
dataTmp
,
sizeof
(
STableInfoForChildTable
));
}
int32_t
setForSnapShot
(
SSnapContext
*
ctx
,
int64_t
uid
){
int32_t
setForSnapShot
(
SSnapContext
*
ctx
,
int64_t
uid
){
int
c
=
0
;
int
c
=
0
;
if
(
uid
==
-
1
){
return
c
;
}
if
(
uid
==
0
){
if
(
uid
==
0
){
c
learAndMoveToFirst
(
ctx
)
;
c
tx
->
index
=
0
;
return
c
;
return
c
;
}
}
int64_t
*
ver
=
(
int64_t
*
)
taosHashGet
(
ctx
->
idVersion
,
&
uid
,
sizeof
(
tb_uid_t
));
SIdInfo
*
idInfo
=
(
SIdInfo
*
)
taosHashGet
(
ctx
->
idVersion
,
&
uid
,
sizeof
(
tb_uid_t
));
if
(
!
ver
){
if
(
!
idInfo
){
return
-
1
;
return
-
1
;
}
}
STbDbKey
key
=
{.
version
=
*
ver
,
.
uid
=
uid
};
ctx
->
index
=
idInfo
->
index
;
tdbTbcMoveTo
(
ctx
->
pCur
,
&
key
,
sizeof
(
key
),
&
c
);
return
c
;
return
c
;
}
}
...
@@ -371,142 +442,141 @@ int32_t getMetafromSnapShot(SSnapContext* ctx, void **pBuf, int32_t *contLen, in
...
@@ -371,142 +442,141 @@ int32_t getMetafromSnapShot(SSnapContext* ctx, void **pBuf, int32_t *contLen, in
int32_t
ret
=
0
;
int32_t
ret
=
0
;
void
*
pKey
=
NULL
;
void
*
pKey
=
NULL
;
void
*
pVal
=
NULL
;
void
*
pVal
=
NULL
;
int
vLen
,
kLen
;
int
vLen
=
0
,
kLen
=
0
;
while
(
1
){
ret
=
tdbTbcNext
(
ctx
->
pCur
,
&
pKey
,
&
kLen
,
&
pVal
,
&
vLen
);
if
(
ret
<
0
)
{
ctx
->
queryMetaOrData
=
false
;
// change to get data
clearAndMoveToFirst
(
ctx
);
return
0
;
}
STbDbKey
*
tmp
=
(
STbDbKey
*
)
pKey
;
if
(
tmp
->
version
>
ctx
->
snapVersion
)
{
clearAndMoveToFirst
(
ctx
);
ctx
->
queryMetaOrData
=
false
;
// change to get data
return
0
;
}
int64_t
*
ver
=
(
int64_t
*
)
taosHashGet
(
ctx
->
idVersion
,
&
tmp
->
uid
,
sizeof
(
tb_uid_t
));
ASSERT
(
ver
);
if
(
*
ver
>
tmp
->
version
){
continue
;
}
ASSERT
(
*
ver
==
tmp
->
version
);
*
uid
=
tmp
->
uid
;
SDecoder
dc
=
{
0
};
SMetaEntry
me
=
{
0
};
tDecoderInit
(
&
dc
,
pVal
,
vLen
);
metaDecodeEntry
(
&
dc
,
&
me
);
if
((
ctx
->
subType
==
TOPIC_SUB_TYPE__DB
&&
me
.
type
==
TSDB_SUPER_TABLE
)
||
(
ctx
->
subType
==
TOPIC_SUB_TYPE__TABLE
&&
me
.
uid
==
ctx
->
suid
))
{
saveSuperTableInfoForChildTable
(
&
me
,
ctx
->
suidInfo
);
SVCreateStbReq
req
=
{
0
};
if
(
ctx
->
index
>=
taosArrayGetSize
(
ctx
->
idList
)){
req
.
name
=
me
.
name
;
metaDebug
(
"tmqsnap get meta end"
);
req
.
suid
=
me
.
uid
;
ctx
->
index
=
0
;
req
.
schemaRow
=
me
.
stbEntry
.
schemaRow
;
ctx
->
queryMetaOrData
=
false
;
// change to get data
req
.
schemaTag
=
me
.
stbEntry
.
schemaTag
;
return
0
;
}
ret
=
buildSuperTableInfo
(
&
req
,
pBuf
,
contLen
);
tDecoderClear
(
&
dc
);
*
type
=
TDMT_VND_CREATE_STB
;
break
;
}
else
if
((
ctx
->
subType
==
TOPIC_SUB_TYPE__DB
&&
me
.
type
==
TSDB_CHILD_TABLE
)
||
(
ctx
->
subType
==
TOPIC_SUB_TYPE__TABLE
&&
me
.
type
==
TSDB_CHILD_TABLE
&&
me
.
ctbEntry
.
suid
==
ctx
->
suid
))
{
STableInfoForChildTable
*
data
=
(
STableInfoForChildTable
*
)
taosHashGet
(
ctx
->
suidInfo
,
&
me
.
ctbEntry
.
suid
,
sizeof
(
tb_uid_t
));
int64_t
*
uidTmp
=
taosArrayGet
(
ctx
->
idList
,
ctx
->
index
);
if
(
!
data
){
// if table has been deleted
ctx
->
index
++
;
tDecoderClear
(
&
dc
);
SIdInfo
*
idInfo
=
(
SIdInfo
*
)
taosHashGet
(
ctx
->
idVersion
,
uidTmp
,
sizeof
(
tb_uid_t
));
continue
;
ASSERT
(
idInfo
);
}
SVCreateTbReq
req
=
{
0
};
*
uid
=
*
uidTmp
;
MoveToPosition
(
ctx
,
idInfo
->
version
,
*
uidTmp
);
req
.
type
=
TD_CHILD_TABLE
;
tdbTbcGet
(
ctx
->
pCur
,
(
const
void
**
)
&
pKey
,
&
kLen
,
(
const
void
**
)
&
pVal
,
&
vLen
);
req
.
name
=
me
.
name
;
SDecoder
dc
=
{
0
};
req
.
uid
=
me
.
uid
;
SMetaEntry
me
=
{
0
};
req
.
commentLen
=
-
1
;
tDecoderInit
(
&
dc
,
pVal
,
vLen
);
req
.
ctb
.
suid
=
me
.
ctbEntry
.
suid
;
metaDecodeEntry
(
&
dc
,
&
me
);
req
.
ctb
.
tagNum
=
taosArrayGetSize
(
data
->
tagName
);
metaDebug
(
"tmqsnap get meta uid:%"
PRIi64
" name:%s index:%d"
,
*
uid
,
me
.
name
,
ctx
->
index
-
1
);
req
.
ctb
.
name
=
data
->
tableName
;
if
((
ctx
->
subType
==
TOPIC_SUB_TYPE__DB
&&
me
.
type
==
TSDB_SUPER_TABLE
)
||
(
ctx
->
subType
==
TOPIC_SUB_TYPE__TABLE
&&
me
.
uid
==
ctx
->
suid
))
{
SVCreateStbReq
req
=
{
0
};
req
.
name
=
me
.
name
;
req
.
suid
=
me
.
uid
;
req
.
schemaRow
=
me
.
stbEntry
.
schemaRow
;
req
.
schemaTag
=
me
.
stbEntry
.
schemaTag
;
req
.
schemaRow
.
version
=
1
;
req
.
schemaTag
.
version
=
1
;
ret
=
buildSuperTableInfo
(
&
req
,
pBuf
,
contLen
);
*
type
=
TDMT_VND_CREATE_STB
;
}
else
if
((
ctx
->
subType
==
TOPIC_SUB_TYPE__DB
&&
me
.
type
==
TSDB_CHILD_TABLE
)
||
(
ctx
->
subType
==
TOPIC_SUB_TYPE__TABLE
&&
me
.
type
==
TSDB_CHILD_TABLE
&&
me
.
ctbEntry
.
suid
==
ctx
->
suid
))
{
STableInfoForChildTable
*
data
=
(
STableInfoForChildTable
*
)
taosHashGet
(
ctx
->
suidInfo
,
&
me
.
ctbEntry
.
suid
,
sizeof
(
tb_uid_t
));
ASSERT
(
data
);
SVCreateTbReq
req
=
{
0
};
req
.
type
=
TD_CHILD_TABLE
;
req
.
name
=
me
.
name
;
req
.
uid
=
me
.
uid
;
req
.
commentLen
=
-
1
;
req
.
ctb
.
suid
=
me
.
ctbEntry
.
suid
;
req
.
ctb
.
tagNum
=
taosArrayGetSize
(
data
->
tagName
);
req
.
ctb
.
name
=
data
->
tableName
;
// SIdInfo* sidInfo = (SIdInfo*)taosHashGet(ctx->idVersion, &me.ctbEntry.suid, sizeof(tb_uid_t));
// if(sidInfo->version >= idInfo->version){
// // need parse tag
// STag* p = (STag*)me.ctbEntry.pTags;
// SArray* pTagVals = NULL;
// if (tTagToValArray((const STag*)p, &pTagVals) != 0) {
// }
//
// int16_t nCols = taosArrayGetSize(pTagVals);
// for (int j = 0; j < nCols; ++j) {
// STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j);
// }
// }else{
req
.
ctb
.
pTag
=
me
.
ctbEntry
.
pTags
;
req
.
ctb
.
pTag
=
me
.
ctbEntry
.
pTags
;
req
.
ctb
.
tagName
=
data
->
tagName
;
// }
ret
=
buildNormalChildTableInfo
(
&
req
,
pBuf
,
contLen
);
tDecoderClear
(
&
dc
);
req
.
ctb
.
tagName
=
data
->
tagName
;
*
type
=
TDMT_VND_CREATE_TABLE
;
ret
=
buildNormalChildTableInfo
(
&
req
,
pBuf
,
contLen
);
break
;
*
type
=
TDMT_VND_CREATE_TABLE
;
}
else
if
(
ctx
->
subType
==
TOPIC_SUB_TYPE__DB
){
}
else
if
(
ctx
->
subType
==
TOPIC_SUB_TYPE__DB
){
SVCreateTbReq
req
=
{
0
};
SVCreateTbReq
req
=
{
0
};
req
.
type
=
TD_NORMAL_TABLE
;
req
.
type
=
TD_NORMAL_TABLE
;
req
.
name
=
me
.
name
;
req
.
name
=
me
.
name
;
req
.
uid
=
me
.
uid
;
req
.
uid
=
me
.
uid
;
req
.
commentLen
=
-
1
;
req
.
commentLen
=
-
1
;
req
.
ntb
.
schemaRow
=
me
.
ntbEntry
.
schemaRow
;
req
.
ntb
.
schemaRow
=
me
.
ntbEntry
.
schemaRow
;
ret
=
buildNormalChildTableInfo
(
&
req
,
pBuf
,
contLen
);
ret
=
buildNormalChildTableInfo
(
&
req
,
pBuf
,
contLen
);
tDecoderClear
(
&
dc
);
*
type
=
TDMT_VND_CREATE_TABLE
;
*
type
=
TDMT_VND_CREATE_TABLE
;
}
else
{
break
;
ASSERT
(
0
);
}
else
{
tDecoderClear
(
&
dc
);
continue
;
}
}
}
tDecoderClear
(
&
dc
);
return
ret
;
return
ret
;
}
}
SMetaTableInfo
getUidfromSnapShot
(
SSnapContext
*
ctx
){
SMetaTableInfo
getUidfromSnapShot
(
SSnapContext
*
ctx
){
SMetaTableInfo
result
=
{
0
};
SMetaTableInfo
result
=
{
0
};
int32_t
ret
=
0
;
void
*
pKey
=
NULL
;
void
*
pKey
=
NULL
;
void
*
pVal
=
NULL
;
void
*
pVal
=
NULL
;
int
vLen
,
kLen
;
int
vLen
,
kLen
;
while
(
1
){
while
(
1
){
ret
=
tdbTbcNext
(
ctx
->
pCur
,
&
pKey
,
&
kLen
,
&
pVal
,
&
vLen
);
if
(
ctx
->
index
>=
taosArrayGetSize
(
ctx
->
idList
)){
if
(
ret
<
0
)
{
metaDebug
(
"tmqsnap get uid info end"
);
return
result
;
return
result
;
}
}
int64_t
*
uidTmp
=
taosArrayGet
(
ctx
->
idList
,
ctx
->
index
);
ctx
->
index
++
;
SIdInfo
*
idInfo
=
(
SIdInfo
*
)
taosHashGet
(
ctx
->
idVersion
,
uidTmp
,
sizeof
(
tb_uid_t
));
ASSERT
(
idInfo
);
STbDbKey
*
tmp
=
(
STbDbKey
*
)
pKey
;
MoveToPosition
(
ctx
,
idInfo
->
version
,
*
uidTmp
);
if
(
tmp
->
version
>
ctx
->
snapVersion
)
{
tdbTbcGet
(
ctx
->
pCur
,
(
const
void
**
)
&
pKey
,
&
kLen
,
(
const
void
**
)
&
pVal
,
&
vLen
);
return
result
;
}
int64_t
*
ver
=
(
int64_t
*
)
taosHashGet
(
ctx
->
idVersion
,
&
tmp
->
uid
,
sizeof
(
tb_uid_t
));
ASSERT
(
ver
);
if
(
*
ver
>
tmp
->
version
){
continue
;
}
ASSERT
(
*
ver
==
tmp
->
version
);
SDecoder
dc
=
{
0
};
SDecoder
dc
=
{
0
};
SMetaEntry
me
=
{
0
};
SMetaEntry
me
=
{
0
};
tDecoderInit
(
&
dc
,
pVal
,
vLen
);
tDecoderInit
(
&
dc
,
pVal
,
vLen
);
metaDecodeEntry
(
&
dc
,
&
me
);
metaDecodeEntry
(
&
dc
,
&
me
);
metaDebug
(
"tmqsnap get uid info uid:%"
PRIi64
" name:%s index:%d"
,
me
.
uid
,
me
.
name
,
ctx
->
index
-
1
);
if
(
ctx
->
subType
==
TOPIC_SUB_TYPE__DB
&&
me
.
type
==
TSDB_CHILD_TABLE
){
if
(
ctx
->
subType
==
TOPIC_SUB_TYPE__DB
&&
me
.
type
==
TSDB_CHILD_TABLE
){
STableInfoForChildTable
*
data
=
(
STableInfoForChildTable
*
)
taosHashGet
(
ctx
->
suidInfo
,
&
me
.
ctbEntry
.
suid
,
sizeof
(
tb_uid_t
));
STableInfoForChildTable
*
data
=
(
STableInfoForChildTable
*
)
taosHashGet
(
ctx
->
suidInfo
,
&
me
.
ctbEntry
.
suid
,
sizeof
(
tb_uid_t
));
result
.
uid
=
me
.
uid
;
result
.
uid
=
me
.
uid
;
result
.
suid
=
me
.
ctbEntry
.
suid
;
result
.
suid
=
me
.
ctbEntry
.
suid
;
result
.
schema
=
data
->
schemaRow
;
result
.
schema
=
tCloneSSchemaWrapper
(
data
->
schemaRow
);
strcpy
(
result
.
tbName
,
me
.
name
);
tDecoderClear
(
&
dc
);
tDecoderClear
(
&
dc
);
break
;
break
;
}
else
if
(
ctx
->
subType
==
TOPIC_SUB_TYPE__DB
&&
me
.
type
==
TSDB_NORMAL_TABLE
)
{
}
else
if
(
ctx
->
subType
==
TOPIC_SUB_TYPE__DB
&&
me
.
type
==
TSDB_NORMAL_TABLE
)
{
result
.
uid
=
me
.
uid
;
result
.
uid
=
me
.
uid
;
result
.
suid
=
0
;
result
.
suid
=
0
;
result
.
schema
=
&
me
.
ntbEntry
.
schemaRow
;
strcpy
(
result
.
tbName
,
me
.
name
);
result
.
schema
=
tCloneSSchemaWrapper
(
&
me
.
ntbEntry
.
schemaRow
);
tDecoderClear
(
&
dc
);
tDecoderClear
(
&
dc
);
break
;
break
;
}
else
if
(
ctx
->
subType
==
TOPIC_SUB_TYPE__TABLE
&&
me
.
type
==
TSDB_CHILD_TABLE
&&
me
.
ctbEntry
.
suid
==
ctx
->
suid
)
{
}
else
if
(
ctx
->
subType
==
TOPIC_SUB_TYPE__TABLE
&&
me
.
type
==
TSDB_CHILD_TABLE
&&
me
.
ctbEntry
.
suid
==
ctx
->
suid
)
{
STableInfoForChildTable
*
data
=
(
STableInfoForChildTable
*
)
taosHashGet
(
ctx
->
suidInfo
,
&
me
.
ctbEntry
.
suid
,
sizeof
(
tb_uid_t
));
STableInfoForChildTable
*
data
=
(
STableInfoForChildTable
*
)
taosHashGet
(
ctx
->
suidInfo
,
&
me
.
ctbEntry
.
suid
,
sizeof
(
tb_uid_t
));
result
.
uid
=
me
.
uid
;
result
.
uid
=
me
.
uid
;
result
.
suid
=
me
.
ctbEntry
.
suid
;
result
.
suid
=
me
.
ctbEntry
.
suid
;
result
.
schema
=
data
->
schemaRow
;
strcpy
(
result
.
tbName
,
me
.
name
);
result
.
schema
=
tCloneSSchemaWrapper
(
data
->
schemaRow
);
tDecoderClear
(
&
dc
);
tDecoderClear
(
&
dc
);
break
;
break
;
}
else
{
}
else
{
metaDebug
(
"tmqsnap get uid continue"
);
tDecoderClear
(
&
dc
);
tDecoderClear
(
&
dc
);
continue
;
continue
;
}
}
...
...
source/dnode/vnode/src/tq/tq.c
浏览文件 @
c381ffd3
...
@@ -464,6 +464,7 @@ int32_t tqProcessVgChangeReq(STQ* pTq, char* msg, int32_t msgLen) {
...
@@ -464,6 +464,7 @@ int32_t tqProcessVgChangeReq(STQ* pTq, char* msg, int32_t msgLen) {
pHandle
->
execHandle
.
subType
=
req
.
subType
;
pHandle
->
execHandle
.
subType
=
req
.
subType
;
pHandle
->
fetchMeta
=
req
.
withMeta
;
pHandle
->
fetchMeta
=
req
.
withMeta
;
// TODO version should be assigned and refed during preprocess
// TODO version should be assigned and refed during preprocess
SWalRef
*
pRef
=
walRefCommittedVer
(
pTq
->
pVnode
->
pWal
);
SWalRef
*
pRef
=
walRefCommittedVer
(
pTq
->
pVnode
->
pWal
);
if
(
pRef
==
NULL
)
{
if
(
pRef
==
NULL
)
{
...
@@ -480,10 +481,10 @@ int32_t tqProcessVgChangeReq(STQ* pTq, char* msg, int32_t msgLen) {
...
@@ -480,10 +481,10 @@ int32_t tqProcessVgChangeReq(STQ* pTq, char* msg, int32_t msgLen) {
.
initTqReader
=
true
,
.
initTqReader
=
true
,
.
version
=
ver
,
.
version
=
ver
,
};
};
pHandle
->
snapshotVer
=
ver
;
if
(
pHandle
->
execHandle
.
subType
==
TOPIC_SUB_TYPE__COLUMN
)
{
if
(
pHandle
->
execHandle
.
subType
==
TOPIC_SUB_TYPE__COLUMN
)
{
pHandle
->
execHandle
.
execCol
.
qmsg
=
req
.
qmsg
;
pHandle
->
execHandle
.
execCol
.
qmsg
=
req
.
qmsg
;
pHandle
->
snapshotVer
=
ver
;
req
.
qmsg
=
NULL
;
req
.
qmsg
=
NULL
;
pHandle
->
execHandle
.
task
=
pHandle
->
execHandle
.
task
=
...
...
source/dnode/vnode/src/tq/tqExec.c
浏览文件 @
c381ffd3
...
@@ -83,26 +83,32 @@ int64_t tqScan(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, SMqMetaRsp*
...
@@ -83,26 +83,32 @@ int64_t tqScan(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, SMqMetaRsp*
while
(
1
)
{
while
(
1
)
{
SSDataBlock
*
pDataBlock
=
NULL
;
SSDataBlock
*
pDataBlock
=
NULL
;
uint64_t
ts
=
0
;
uint64_t
ts
=
0
;
tqDebug
(
"task start to execute"
);
tqDebug
(
"t
mqsnap t
ask start to execute"
);
if
(
qExecTask
(
task
,
&
pDataBlock
,
&
ts
)
<
0
)
{
if
(
qExecTask
(
task
,
&
pDataBlock
,
&
ts
)
<
0
)
{
ASSERT
(
0
);
ASSERT
(
0
);
}
}
tqDebug
(
"task execute end, get %p"
,
pDataBlock
);
tqDebug
(
"t
mqsnap t
ask execute end, get %p"
,
pDataBlock
);
if
(
pDataBlock
!=
NULL
)
{
if
(
pDataBlock
!=
NULL
)
{
if
(
pRsp
->
withTbName
)
{
if
(
pRsp
->
withTbName
)
{
int64_t
uid
=
0
;
int64_t
uid
=
0
;
if
(
pOffset
->
type
==
TMQ_OFFSET__LOG
)
{
if
(
pOffset
->
type
==
TMQ_OFFSET__LOG
)
{
uid
=
pExec
->
pExecReader
->
msgIter
.
uid
;
uid
=
pExec
->
pExecReader
->
msgIter
.
uid
;
if
(
tqAddTbNameToRsp
(
pTq
,
uid
,
pRsp
)
<
0
)
{
continue
;
}
}
else
{
}
else
{
uid
=
pDataBlock
->
info
.
uid
;
char
*
tbName
=
strdup
(
qExtractTbnameFromTask
(
task
));
}
taosArrayPush
(
pRsp
->
blockTbName
,
&
tbName
);
if
(
tqAddTbNameToRsp
(
pTq
,
uid
,
pRsp
)
<
0
)
{
continue
;
}
}
}
}
if
(
pRsp
->
withSchema
){
if
(
pRsp
->
withSchema
){
tqAddBlockSchemaToRsp
(
pExec
,
pRsp
);
if
(
pOffset
->
type
==
TMQ_OFFSET__LOG
)
{
tqAddBlockSchemaToRsp
(
pExec
,
pRsp
);
}
else
{
SSchemaWrapper
*
pSW
=
tCloneSSchemaWrapper
(
qExtractSchemaFromTask
(
task
));
taosArrayPush
(
pRsp
->
blockSchema
,
&
pSW
);
}
}
}
tqAddBlockDataToRsp
(
pDataBlock
,
pRsp
,
taosArrayGetSize
(
pDataBlock
->
pDataBlock
));
tqAddBlockDataToRsp
(
pDataBlock
,
pRsp
,
taosArrayGetSize
(
pDataBlock
->
pDataBlock
));
pRsp
->
blockNum
++
;
pRsp
->
blockNum
++
;
...
@@ -114,8 +120,11 @@ int64_t tqScan(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, SMqMetaRsp*
...
@@ -114,8 +120,11 @@ int64_t tqScan(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, SMqMetaRsp*
}
}
}
}
if
(
pRsp
->
blockNum
==
0
&&
pOffset
->
type
==
TMQ_OFFSET__SNAPSHOT_DATA
)
{
if
(
pRsp
->
blockNum
==
0
&&
pOffset
->
type
==
TMQ_OFFSET__SNAPSHOT_DATA
){
tqDebug
(
"vgId: %d, tsdb consume over, switch to wal, ver %"
PRId64
,
TD_VID
(
pTq
->
pVnode
),
if
(
pHandle
->
execHandle
.
subType
!=
TOPIC_SUB_TYPE__COLUMN
&&
qStreamExtractPrepareUid
(
task
)
!=
0
){
continue
;
}
tqDebug
(
"tmqsnap vgId: %d, tsdb consume over, switch to wal, ver %"
PRId64
,
TD_VID
(
pTq
->
pVnode
),
pHandle
->
snapshotVer
+
1
);
pHandle
->
snapshotVer
+
1
);
tqOffsetResetToLog
(
pOffset
,
pHandle
->
snapshotVer
);
tqOffsetResetToLog
(
pOffset
,
pHandle
->
snapshotVer
);
qStreamPrepareScan
(
task
,
pOffset
,
pHandle
->
execHandle
.
subType
);
qStreamPrepareScan
(
task
,
pOffset
,
pHandle
->
execHandle
.
subType
);
...
@@ -124,7 +133,7 @@ int64_t tqScan(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, SMqMetaRsp*
...
@@ -124,7 +133,7 @@ int64_t tqScan(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, SMqMetaRsp*
if
(
pRsp
->
blockNum
>
0
){
if
(
pRsp
->
blockNum
>
0
){
qStreamExtractOffset
(
task
,
&
pRsp
->
rspOffset
);
qStreamExtractOffset
(
task
,
&
pRsp
->
rspOffset
);
tqDebug
(
"task exec exited, get data"
);
tqDebug
(
"t
mqsnap t
ask exec exited, get data"
);
break
;
break
;
}
}
...
@@ -132,12 +141,12 @@ int64_t tqScan(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, SMqMetaRsp*
...
@@ -132,12 +141,12 @@ int64_t tqScan(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, SMqMetaRsp*
if
(
tmp
->
rspOffset
.
type
==
TMQ_OFFSET__SNAPSHOT_DATA
){
if
(
tmp
->
rspOffset
.
type
==
TMQ_OFFSET__SNAPSHOT_DATA
){
qStreamPrepareScan
(
task
,
&
tmp
->
rspOffset
,
pHandle
->
execHandle
.
subType
);
qStreamPrepareScan
(
task
,
&
tmp
->
rspOffset
,
pHandle
->
execHandle
.
subType
);
tmp
->
rspOffset
.
type
=
TMQ_OFFSET__SNAPSHOT_META
;
tmp
->
rspOffset
.
type
=
TMQ_OFFSET__SNAPSHOT_META
;
tqDebug
(
"t
ask exec change to get me
ta"
);
tqDebug
(
"t
mqsnap task exec change to get da
ta"
);
continue
;
continue
;
}
}
*
pMetaRsp
=
*
tmp
;
*
pMetaRsp
=
*
tmp
;
tqDebug
(
"task exec exited, get meta"
);
tqDebug
(
"t
mqsnap t
ask exec exited, get meta"
);
break
;
break
;
}
}
...
...
source/libs/executor/inc/executorimpl.h
浏览文件 @
c381ffd3
...
@@ -150,6 +150,8 @@ typedef struct {
...
@@ -150,6 +150,8 @@ typedef struct {
STqOffsetVal
prepareStatus
;
// for tmq
STqOffsetVal
prepareStatus
;
// for tmq
STqOffsetVal
lastStatus
;
// for tmq
STqOffsetVal
lastStatus
;
// for tmq
SMqMetaRsp
metaRsp
;
// for tmq fetching meta
SMqMetaRsp
metaRsp
;
// for tmq fetching meta
SSchemaWrapper
*
schema
;
char
tbName
[
TSDB_TABLE_NAME_LEN
];
SSDataBlock
*
pullOverBlk
;
// for streaming
SSDataBlock
*
pullOverBlk
;
// for streaming
SWalFilterCond
cond
;
SWalFilterCond
cond
;
int64_t
lastScanUid
;
int64_t
lastScanUid
;
...
...
source/libs/executor/src/executor.c
浏览文件 @
c381ffd3
...
@@ -605,9 +605,14 @@ void* qExtractReaderFromStreamScanner(void* scanner) {
...
@@ -605,9 +605,14 @@ void* qExtractReaderFromStreamScanner(void* scanner) {
return
(
void
*
)
pInfo
->
tqReader
;
return
(
void
*
)
pInfo
->
tqReader
;
}
}
const
SSchemaWrapper
*
qExtractSchemaFromStreamScanner
(
void
*
scanner
)
{
const
SSchemaWrapper
*
qExtractSchemaFromTask
(
qTaskInfo_t
tinfo
)
{
SStreamScanInfo
*
pInfo
=
scanner
;
SExecTaskInfo
*
pTaskInfo
=
(
SExecTaskInfo
*
)
tinfo
;
return
pInfo
->
tqReader
->
pSchemaWrapper
;
return
pTaskInfo
->
streamInfo
.
schema
;
}
const
char
*
qExtractTbnameFromTask
(
qTaskInfo_t
tinfo
)
{
SExecTaskInfo
*
pTaskInfo
=
(
SExecTaskInfo
*
)
tinfo
;
return
pTaskInfo
->
streamInfo
.
tbName
;
}
}
SMqMetaRsp
*
qStreamExtractMetaMsg
(
qTaskInfo_t
tinfo
)
{
SMqMetaRsp
*
qStreamExtractMetaMsg
(
qTaskInfo_t
tinfo
)
{
...
@@ -616,6 +621,12 @@ SMqMetaRsp* qStreamExtractMetaMsg(qTaskInfo_t tinfo) {
...
@@ -616,6 +621,12 @@ SMqMetaRsp* qStreamExtractMetaMsg(qTaskInfo_t tinfo) {
return
&
pTaskInfo
->
streamInfo
.
metaRsp
;
return
&
pTaskInfo
->
streamInfo
.
metaRsp
;
}
}
int64_t
qStreamExtractPrepareUid
(
qTaskInfo_t
tinfo
)
{
SExecTaskInfo
*
pTaskInfo
=
(
SExecTaskInfo
*
)
tinfo
;
ASSERT
(
pTaskInfo
->
execModel
==
OPTR_EXEC_MODEL_QUEUE
);
return
pTaskInfo
->
streamInfo
.
prepareStatus
.
uid
;
}
int32_t
qStreamExtractOffset
(
qTaskInfo_t
tinfo
,
STqOffsetVal
*
pOffset
)
{
int32_t
qStreamExtractOffset
(
qTaskInfo_t
tinfo
,
STqOffsetVal
*
pOffset
)
{
SExecTaskInfo
*
pTaskInfo
=
(
SExecTaskInfo
*
)
tinfo
;
SExecTaskInfo
*
pTaskInfo
=
(
SExecTaskInfo
*
)
tinfo
;
ASSERT
(
pTaskInfo
->
execModel
==
OPTR_EXEC_MODEL_QUEUE
);
ASSERT
(
pTaskInfo
->
execModel
==
OPTR_EXEC_MODEL_QUEUE
);
...
@@ -752,14 +763,6 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
...
@@ -752,14 +763,6 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
}
}
SMetaTableInfo
mtInfo
=
getUidfromSnapShot
(
sContext
);
SMetaTableInfo
mtInfo
=
getUidfromSnapShot
(
sContext
);
if
(
pOffset
->
uid
==
0
)
pOffset
->
uid
=
mtInfo
.
uid
;
if
(
pOffset
->
ts
==
0
)
pOffset
->
ts
=
INT64_MIN
;
if
(
pOffset
->
uid
==
0
)
{
qError
(
"setDataForSnapShot error. uid = 0 "
);
return
-
1
;
}
tsdbReaderClose
(
pInfo
->
dataReader
);
tsdbReaderClose
(
pInfo
->
dataReader
);
pInfo
->
dataReader
=
NULL
;
pInfo
->
dataReader
=
NULL
;
cleanupQueryTableDataCond
(
&
pTaskInfo
->
streamInfo
.
tableCond
);
cleanupQueryTableDataCond
(
&
pTaskInfo
->
streamInfo
.
tableCond
);
...
@@ -770,7 +773,10 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
...
@@ -770,7 +773,10 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
taosArrayPush
(
pTaskInfo
->
tableqinfoList
.
pTableList
,
&
(
STableKeyInfo
){.
uid
=
mtInfo
.
uid
,
.
groupId
=
0
});
taosArrayPush
(
pTaskInfo
->
tableqinfoList
.
pTableList
,
&
(
STableKeyInfo
){.
uid
=
mtInfo
.
uid
,
.
groupId
=
0
});
tsdbReaderOpen
(
pInfo
->
vnode
,
&
pTaskInfo
->
streamInfo
.
tableCond
,
pTaskInfo
->
tableqinfoList
.
pTableList
,
&
pInfo
->
dataReader
,
NULL
);
tsdbReaderOpen
(
pInfo
->
vnode
,
&
pTaskInfo
->
streamInfo
.
tableCond
,
pTaskInfo
->
tableqinfoList
.
pTableList
,
&
pInfo
->
dataReader
,
NULL
);
qDebug
(
"tsdb reader snapshot change to uid %ld ts %ld"
,
pOffset
->
uid
,
pOffset
->
ts
);
strcpy
(
pTaskInfo
->
streamInfo
.
tbName
,
mtInfo
.
tbName
);
tDeleteSSchemaWrapper
(
pTaskInfo
->
streamInfo
.
schema
);
pTaskInfo
->
streamInfo
.
schema
=
mtInfo
.
schema
;
qDebug
(
"tmqsnap qStreamPrepareScan snapshot data uid %ld ts %ld"
,
mtInfo
.
uid
,
pOffset
->
ts
);
}
else
if
(
pOffset
->
type
==
TMQ_OFFSET__SNAPSHOT_META
){
}
else
if
(
pOffset
->
type
==
TMQ_OFFSET__SNAPSHOT_META
){
SStreamRawScanInfo
*
pInfo
=
pOperator
->
info
;
SStreamRawScanInfo
*
pInfo
=
pOperator
->
info
;
SSnapContext
*
sContext
=
pInfo
->
sContext
;
SSnapContext
*
sContext
=
pInfo
->
sContext
;
...
@@ -778,10 +784,12 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
...
@@ -778,10 +784,12 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
qError
(
"setForSnapShot error. uid:%"
PRIi64
" ,version:%"
PRIi64
,
pOffset
->
uid
);
qError
(
"setForSnapShot error. uid:%"
PRIi64
" ,version:%"
PRIi64
,
pOffset
->
uid
);
return
-
1
;
return
-
1
;
}
}
qDebug
(
"tmqsnap qStreamPrepareScan snapshot meta uid %ld ts %ld"
,
pOffset
->
uid
);
}
else
if
(
pOffset
->
type
==
TMQ_OFFSET__LOG
)
{
}
else
if
(
pOffset
->
type
==
TMQ_OFFSET__LOG
)
{
SStreamRawScanInfo
*
pInfo
=
pOperator
->
info
;
SStreamRawScanInfo
*
pInfo
=
pOperator
->
info
;
tsdbReaderClose
(
pInfo
->
dataReader
);
tsdbReaderClose
(
pInfo
->
dataReader
);
pInfo
->
dataReader
=
NULL
;
pInfo
->
dataReader
=
NULL
;
qDebug
(
"tmqsnap qStreamPrepareScan snapshot log"
);
}
}
return
0
;
return
0
;
}
}
source/libs/executor/src/scanoperator.c
浏览文件 @
c381ffd3
...
@@ -1466,11 +1466,11 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
...
@@ -1466,11 +1466,11 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
pTaskInfo
->
streamInfo
.
metaRsp
.
metaRspLen
=
0
;
// use metaRspLen !=0 to judge if data is meta
pTaskInfo
->
streamInfo
.
metaRsp
.
metaRspLen
=
0
;
// use metaRspLen !=0 to judge if data is meta
pTaskInfo
->
streamInfo
.
metaRsp
.
metaRsp
=
NULL
;
pTaskInfo
->
streamInfo
.
metaRsp
.
metaRsp
=
NULL
;
qDebug
(
"
stream s
can called"
);
qDebug
(
"
doRawS
can called"
);
if
(
pTaskInfo
->
streamInfo
.
prepareStatus
.
type
==
TMQ_OFFSET__SNAPSHOT_DATA
){
if
(
pTaskInfo
->
streamInfo
.
prepareStatus
.
type
==
TMQ_OFFSET__SNAPSHOT_DATA
){
SSDataBlock
*
pBlock
=
&
pInfo
->
pRes
;
SSDataBlock
*
pBlock
=
&
pInfo
->
pRes
;
while
(
tsdbNextDataBlock
(
pInfo
->
dataReader
))
{
if
(
tsdbNextDataBlock
(
pInfo
->
dataReader
))
{
if
(
isTaskKilled
(
pTaskInfo
))
{
if
(
isTaskKilled
(
pTaskInfo
))
{
longjmp
(
pTaskInfo
->
env
,
TSDB_CODE_TSC_QUERY_CANCELLED
);
longjmp
(
pTaskInfo
->
env
,
TSDB_CODE_TSC_QUERY_CANCELLED
);
}
}
...
@@ -1483,23 +1483,31 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
...
@@ -1483,23 +1483,31 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
SArray
*
pCols
=
tsdbRetrieveDataBlock
(
pInfo
->
dataReader
,
NULL
);
SArray
*
pCols
=
tsdbRetrieveDataBlock
(
pInfo
->
dataReader
,
NULL
);
pBlock
->
pDataBlock
=
pCols
;
pBlock
->
pDataBlock
=
pCols
;
if
(
pCols
==
NULL
)
{
if
(
pCols
==
NULL
)
{
SMetaTableInfo
mtInfo
=
getUidfromSnapShot
(
pInfo
->
sContext
);
longjmp
(
pTaskInfo
->
env
,
terrno
);
if
(
mtInfo
.
uid
==
0
){
//read snapshot done, change to get data from wal
return
NULL
;
}
else
{
pTaskInfo
->
streamInfo
.
prepareStatus
.
uid
=
mtInfo
.
uid
;
qStreamPrepareScan
(
pTaskInfo
,
&
pTaskInfo
->
streamInfo
.
prepareStatus
,
pInfo
->
sContext
->
subType
);
continue
;
}
}
}
qDebug
(
"tmqsnap doRawScan get data uid:%ld"
,
pBlock
->
info
.
uid
);
pTaskInfo
->
streamInfo
.
lastStatus
.
type
=
TMQ_OFFSET__SNAPSHOT_DATA
;
pTaskInfo
->
streamInfo
.
lastStatus
.
type
=
TMQ_OFFSET__SNAPSHOT_DATA
;
pTaskInfo
->
streamInfo
.
lastStatus
.
uid
=
pBlock
->
info
.
uid
;
pTaskInfo
->
streamInfo
.
lastStatus
.
uid
=
pBlock
->
info
.
uid
;
pTaskInfo
->
streamInfo
.
lastStatus
.
ts
=
pBlock
->
info
.
window
.
ekey
;
pTaskInfo
->
streamInfo
.
lastStatus
.
ts
=
pBlock
->
info
.
window
.
ekey
;
return
pBlock
;
return
pBlock
;
}
}
qDebug
(
"stream scan tsdb return null"
);
SMetaTableInfo
mtInfo
=
getUidfromSnapShot
(
pInfo
->
sContext
);
if
(
mtInfo
.
uid
==
0
){
//read snapshot done, change to get data from wal
qDebug
(
"tmqsnap read snapshot done, change to get data from wal"
);
pTaskInfo
->
streamInfo
.
prepareStatus
.
uid
=
mtInfo
.
uid
;
tDeleteSSchemaWrapper
(
pTaskInfo
->
streamInfo
.
schema
);
}
else
{
pTaskInfo
->
streamInfo
.
prepareStatus
.
uid
=
mtInfo
.
uid
;
pTaskInfo
->
streamInfo
.
prepareStatus
.
ts
=
INT64_MIN
;
qDebug
(
"tmqsnap change get data uid:%ld"
,
mtInfo
.
uid
);
qStreamPrepareScan
(
pTaskInfo
,
&
pTaskInfo
->
streamInfo
.
prepareStatus
,
pInfo
->
sContext
->
subType
);
strcpy
(
pTaskInfo
->
streamInfo
.
tbName
,
mtInfo
.
tbName
);
tDeleteSSchemaWrapper
(
pTaskInfo
->
streamInfo
.
schema
);
pTaskInfo
->
streamInfo
.
schema
=
mtInfo
.
schema
;
}
qDebug
(
"tmqsnap stream scan tsdb return null"
);
return
NULL
;
return
NULL
;
}
else
if
(
pTaskInfo
->
streamInfo
.
prepareStatus
.
type
==
TMQ_OFFSET__SNAPSHOT_META
){
}
else
if
(
pTaskInfo
->
streamInfo
.
prepareStatus
.
type
==
TMQ_OFFSET__SNAPSHOT_META
){
SSnapContext
*
sContext
=
pInfo
->
sContext
;
SSnapContext
*
sContext
=
pInfo
->
sContext
;
...
@@ -1508,7 +1516,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
...
@@ -1508,7 +1516,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
int16_t
type
=
0
;
int16_t
type
=
0
;
int64_t
uid
=
0
;
int64_t
uid
=
0
;
if
(
getMetafromSnapShot
(
sContext
,
&
data
,
&
dataLen
,
&
type
,
&
uid
)
<
0
){
if
(
getMetafromSnapShot
(
sContext
,
&
data
,
&
dataLen
,
&
type
,
&
uid
)
<
0
){
qError
(
"getMetafromSnapShot error"
);
qError
(
"
tmqsnap
getMetafromSnapShot error"
);
taosMemoryFreeClear
(
data
);
taosMemoryFreeClear
(
data
);
return
NULL
;
return
NULL
;
}
}
...
@@ -1518,7 +1526,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
...
@@ -1518,7 +1526,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
pTaskInfo
->
streamInfo
.
lastStatus
.
uid
=
uid
;
pTaskInfo
->
streamInfo
.
lastStatus
.
uid
=
uid
;
pTaskInfo
->
streamInfo
.
metaRsp
.
rspOffset
.
type
=
TMQ_OFFSET__SNAPSHOT_DATA
;
pTaskInfo
->
streamInfo
.
metaRsp
.
rspOffset
.
type
=
TMQ_OFFSET__SNAPSHOT_DATA
;
pTaskInfo
->
streamInfo
.
metaRsp
.
rspOffset
.
uid
=
0
;
pTaskInfo
->
streamInfo
.
metaRsp
.
rspOffset
.
uid
=
0
;
pTaskInfo
->
streamInfo
.
metaRsp
.
rspOffset
.
ts
=
0
;
pTaskInfo
->
streamInfo
.
metaRsp
.
rspOffset
.
ts
=
INT64_MIN
;
}
else
{
}
else
{
pTaskInfo
->
streamInfo
.
lastStatus
.
type
=
TMQ_OFFSET__SNAPSHOT_META
;
pTaskInfo
->
streamInfo
.
lastStatus
.
type
=
TMQ_OFFSET__SNAPSHOT_META
;
pTaskInfo
->
streamInfo
.
lastStatus
.
uid
=
uid
;
pTaskInfo
->
streamInfo
.
lastStatus
.
uid
=
uid
;
...
@@ -1542,7 +1550,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
...
@@ -1542,7 +1550,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
return
NULL
;
return
NULL
;
}
}
SWalCont
*
pHead
=
&
pInfo
->
pCkHead
->
head
;
SWalCont
*
pHead
=
&
pInfo
->
pCkHead
->
head
;
qDebug
(
"tmq poll: consumer log offset %"
PRId64
" msgType %d"
,
fetchVer
,
pHead
->
msgType
);
qDebug
(
"tmq
snap tmq
poll: consumer log offset %"
PRId64
" msgType %d"
,
fetchVer
,
pHead
->
msgType
);
if
(
pHead
->
msgType
==
TDMT_VND_SUBMIT
)
{
if
(
pHead
->
msgType
==
TDMT_VND_SUBMIT
)
{
SSubmitReq
*
pCont
=
(
SSubmitReq
*
)
&
pHead
->
body
;
SSubmitReq
*
pCont
=
(
SSubmitReq
*
)
&
pHead
->
body
;
...
@@ -1550,6 +1558,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
...
@@ -1550,6 +1558,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
pTaskInfo
->
streamInfo
.
lastStatus
.
type
=
TMQ_OFFSET__LOG
;
pTaskInfo
->
streamInfo
.
lastStatus
.
type
=
TMQ_OFFSET__LOG
;
pTaskInfo
->
streamInfo
.
lastStatus
.
version
=
fetchVer
;
pTaskInfo
->
streamInfo
.
lastStatus
.
version
=
fetchVer
;
pInfo
->
hasDataInOneFetchVer
=
false
;
pInfo
->
hasDataInOneFetchVer
=
false
;
pInfo
->
pRes
.
pDataBlock
=
NULL
;
}
}
}
}
...
@@ -1559,7 +1568,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
...
@@ -1559,7 +1568,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
blockDataFreeRes
(
&
pInfo
->
pRes
);
blockDataFreeRes
(
&
pInfo
->
pRes
);
SSDataBlock
*
block
=
tqLogScanExec
(
pInfo
->
sContext
->
subType
,
pInfo
->
tqReader
,
pInfo
->
pFilterOutTbUid
,
&
pInfo
->
pRes
);
SSDataBlock
*
block
=
tqLogScanExec
(
pInfo
->
sContext
->
subType
,
pInfo
->
tqReader
,
pInfo
->
pFilterOutTbUid
,
&
pInfo
->
pRes
);
if
(
block
){
if
(
block
){
qDebug
(
"fetch data msg, ver:%"
PRId64
", type:%d"
,
pHead
->
version
,
pHead
->
msgType
);
qDebug
(
"
tmqsnap
fetch data msg, ver:%"
PRId64
", type:%d"
,
pHead
->
version
,
pHead
->
msgType
);
pInfo
->
needFetchLog
=
false
;
pInfo
->
needFetchLog
=
false
;
pInfo
->
hasDataInOneFetchVer
=
true
;
pInfo
->
hasDataInOneFetchVer
=
true
;
return
block
;
return
block
;
...
@@ -1574,7 +1583,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
...
@@ -1574,7 +1583,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
}
}
}
else
if
(
pInfo
->
sContext
->
withMeta
){
}
else
if
(
pInfo
->
sContext
->
withMeta
){
ASSERT
(
IS_META_MSG
(
pHead
->
msgType
));
ASSERT
(
IS_META_MSG
(
pHead
->
msgType
));
qDebug
(
"fetch meta msg, ver:%"
PRId64
", type:%d"
,
pHead
->
version
,
pHead
->
msgType
);
qDebug
(
"
tmqsnap
fetch meta msg, ver:%"
PRId64
", type:%d"
,
pHead
->
version
,
pHead
->
msgType
);
pTaskInfo
->
streamInfo
.
metaRsp
.
rspOffset
.
version
=
fetchVer
;
pTaskInfo
->
streamInfo
.
metaRsp
.
rspOffset
.
version
=
fetchVer
;
pTaskInfo
->
streamInfo
.
metaRsp
.
rspOffset
.
type
=
TMQ_OFFSET__LOG
;
pTaskInfo
->
streamInfo
.
metaRsp
.
rspOffset
.
type
=
TMQ_OFFSET__LOG
;
pTaskInfo
->
streamInfo
.
metaRsp
.
resMsgType
=
pHead
->
msgType
;
pTaskInfo
->
streamInfo
.
metaRsp
.
resMsgType
=
pHead
->
msgType
;
...
...
source/libs/qcom/src/queryUtil.c
浏览文件 @
c381ffd3
...
@@ -415,7 +415,7 @@ int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst) {
...
@@ -415,7 +415,7 @@ int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst) {
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
int32_t
metaSize
=
(
pSrc
->
tableInfo
.
numOfColumns
+
pSrc
->
tableInfo
.
numOfTags
)
*
sizeof
(
SSchema
);
int32_t
metaSize
=
sizeof
(
STableMeta
)
+
(
pSrc
->
tableInfo
.
numOfColumns
+
pSrc
->
tableInfo
.
numOfTags
)
*
sizeof
(
SSchema
);
*
pDst
=
taosMemoryMalloc
(
metaSize
);
*
pDst
=
taosMemoryMalloc
(
metaSize
);
if
(
NULL
==
*
pDst
)
{
if
(
NULL
==
*
pDst
)
{
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录