Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
c88b3436
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
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看板
提交
c88b3436
编写于
9月 23, 2022
作者:
Z
zhihaop
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: the data in pInsertParam->pTableNameList is not corrent
上级
8e0312e9
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
193 addition
and
33 deletion
+193
-33
src/client/src/tscBulkWrite.c
src/client/src/tscBulkWrite.c
+14
-12
src/client/src/tscUtil.c
src/client/src/tscUtil.c
+179
-21
未找到文件。
src/client/src/tscBulkWrite.c
浏览文件 @
c88b3436
...
@@ -100,7 +100,7 @@ static void batchResultCallback(void* param, TAOS_RES* tres, int32_t code) {
...
@@ -100,7 +100,7 @@ static void batchResultCallback(void* param, TAOS_RES* tres, int32_t code) {
}
}
taosReleaseRef
(
tscObjRef
,
res
->
self
);
taosReleaseRef
(
tscObjRef
,
res
->
self
);
free
(
param
);
free
(
context
);
}
}
int32_t
dispatcherStatementMerge
(
SArray
*
statements
,
SSqlObj
**
result
)
{
int32_t
dispatcherStatementMerge
(
SArray
*
statements
,
SSqlObj
**
result
)
{
...
@@ -124,30 +124,32 @@ int32_t dispatcherStatementMerge(SArray* statements, SSqlObj** result) {
...
@@ -124,30 +124,32 @@ int32_t dispatcherStatementMerge(SArray* statements, SSqlObj** result) {
// initialize the callback context.
// initialize the callback context.
context
->
count
=
count
;
context
->
count
=
count
;
for
(
size_t
i
=
0
;
i
<
count
;
++
i
)
{
for
(
size_t
i
=
0
;
i
<
count
;
++
i
)
{
SSqlObj
*
statement
=
*
((
SSqlObj
**
)
taosArrayGet
(
statements
,
i
)
);
SSqlObj
*
statement
=
taosArrayGetP
(
statements
,
i
);
context
->
runnable
[
i
].
fp
=
statement
->
fp
;
context
->
runnable
[
i
].
fp
=
statement
->
fp
;
context
->
runnable
[
i
].
param
=
statement
->
param
;
context
->
runnable
[
i
].
param
=
statement
->
param
;
}
}
// merge the statements into single one.
// merge the statements into single one.
tscDebug
(
"start to merge %zu sql objs"
,
count
);
tscDebug
(
"start to merge %zu sql objs"
,
count
);
SSqlObj
*
pSql
=
*
((
SSqlObj
**
)
taosArrayGet
(
statements
,
0
));
SSqlObj
*
pFirst
=
taosArrayGetP
(
statements
,
0
);
SSqlObj
*
pNew
=
createSimpleSubObj
(
pSql
,
batchResultCallback
,
context
,
TSDB_SQL_INSERT
);
int32_t
code
=
tscMergeKVPayLoadSqlObj
(
statements
,
pFirst
);
if
(
!
pNew
)
{
free
(
context
);
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
int32_t
code
=
tscMergeKVPayLoadSqlObj
(
statements
,
pNew
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
const
char
*
msg
=
tstrerror
(
code
);
const
char
*
msg
=
tstrerror
(
code
);
tscDebug
(
"failed to merge sql objects: %s"
,
msg
);
tscDebug
(
"failed to merge sql objects: %s"
,
msg
);
free
(
context
);
free
(
context
);
taosReleaseRef
(
tscObjRef
,
p
New
->
self
);
taosReleaseRef
(
tscObjRef
,
p
First
->
self
);
return
code
;
return
code
;
}
}
*
result
=
pNew
;
pFirst
->
fp
=
batchResultCallback
;
pFirst
->
param
=
context
;
pFirst
->
fetchFp
=
pFirst
->
fp
;
*
result
=
pFirst
;
for
(
int
i
=
1
;
i
<
count
;
++
i
)
{
SSqlObj
*
pSql
=
taosArrayGetP
(
statements
,
i
);
taosReleaseRef
(
tscObjRef
,
pSql
->
self
);
}
return
code
;
return
code
;
}
}
...
...
src/client/src/tscUtil.c
浏览文件 @
c88b3436
...
@@ -2198,14 +2198,14 @@ static int32_t getRowExpandSize(STableMeta* pTableMeta) {
...
@@ -2198,14 +2198,14 @@ static int32_t getRowExpandSize(STableMeta* pTableMeta) {
return
result
;
return
result
;
}
}
static
void
extractTableNameList
(
S
SqlObj
*
pSql
,
S
InsertStatementParam
*
pInsertParam
,
SArray
*
pTableDataBlockList
)
{
static
void
extractTableNameList
(
SInsertStatementParam
*
pInsertParam
,
SArray
*
pTableDataBlockList
)
{
pInsertParam
->
numOfTables
=
(
int32_t
)
taos
HashGetSize
(
pInsertParam
->
pTableBlockHash
List
);
pInsertParam
->
numOfTables
=
(
int32_t
)
taos
ArrayGetSize
(
pTableDataBlock
List
);
if
(
pInsertParam
->
pTableNameList
==
NULL
)
{
if
(
!
pInsertParam
->
pTableNameList
)
{
pInsertParam
->
pTableNameList
=
malloc
(
pInsertParam
->
numOfTables
*
POINTER_BYTES
);
pInsertParam
->
pTableNameList
=
calloc
(
pInsertParam
->
numOfTables
,
sizeof
(
SName
*
)
);
}
}
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
pTableDataBlockList
);
++
i
)
{
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
pTableDataBlockList
);
++
i
)
{
STableDataBlocks
*
pBlocks
=
*
((
STableDataBlocks
**
)
taosArrayGet
(
pTableDataBlockList
,
i
)
);
STableDataBlocks
*
pBlocks
=
taosArrayGetP
(
pTableDataBlockList
,
i
);
//tfree(pInsertParam->pTableNameList[i]);
//tfree(pInsertParam->pTableNameList[i]);
pInsertParam
->
pTableNameList
[
i
]
=
tNameDup
(
&
pBlocks
->
tableName
);
pInsertParam
->
pTableNameList
[
i
]
=
tNameDup
(
&
pBlocks
->
tableName
);
...
@@ -2406,6 +2406,7 @@ size_t writeSSubmitMsgBlocksBuilder(SSubmitMsgBlocksBuilder* builder, SSubmitBlk
...
@@ -2406,6 +2406,7 @@ size_t writeSSubmitMsgBlocksBuilder(SSubmitMsgBlocksBuilder* builder, SSubmitBlk
nWrite
+=
writeSSubmitBlkBuilder
(
blocksBuilder
,
pBlock
);
nWrite
+=
writeSSubmitBlkBuilder
(
blocksBuilder
,
pBlock
);
iter
=
taosHashIterate
(
builder
->
blockBuilders
,
iter
);
iter
=
taosHashIterate
(
builder
->
blockBuilders
,
iter
);
}
}
return
nWrite
;
return
nWrite
;
}
}
...
@@ -2664,7 +2665,7 @@ static bool appendSTableDataBlocksListBuilder(STableDataBlocksListBuilder* build
...
@@ -2664,7 +2665,7 @@ static bool appendSTableDataBlocksListBuilder(STableDataBlocksListBuilder* build
* @param numOfTables the number of tables.
* @param numOfTables the number of tables.
* @return the vnode data blocks list.
* @return the vnode data blocks list.
*/
*/
static
SArray
*
buildSTableDataBlocksListBuilder
(
STableDataBlocksListBuilder
*
builder
,
int32
_t
*
numOfTables
)
{
static
SArray
*
buildSTableDataBlocksListBuilder
(
STableDataBlocksListBuilder
*
builder
,
size
_t
*
numOfTables
)
{
SArray
*
pVnodeDataBlockList
=
taosArrayInit
(
taosHashGetSize
(
builder
->
dataBlocksBuilders
),
sizeof
(
STableDataBlocks
*
));
SArray
*
pVnodeDataBlockList
=
taosArrayInit
(
taosHashGetSize
(
builder
->
dataBlocksBuilders
),
sizeof
(
STableDataBlocks
*
));
if
(
!
pVnodeDataBlockList
)
{
if
(
!
pVnodeDataBlockList
)
{
return
NULL
;
return
NULL
;
...
@@ -2677,13 +2678,11 @@ static SArray* buildSTableDataBlocksListBuilder(STableDataBlocksListBuilder* bui
...
@@ -2677,13 +2678,11 @@ static SArray* buildSTableDataBlocksListBuilder(STableDataBlocksListBuilder* bui
if
(
!
dataBlocks
)
{
if
(
!
dataBlocks
)
{
goto
error
;
goto
error
;
}
}
*
numOfTables
+=
dataBlocks
->
numOfTables
;
numOfTables
+=
dataBlocks
->
numOfTables
;
taosArrayPush
(
pVnodeDataBlockList
,
&
dataBlocks
);
taosArrayPush
(
pVnodeDataBlockList
,
&
dataBlocks
);
iter
=
taosHashIterate
(
builder
->
dataBlocksBuilders
,
iter
);
iter
=
taosHashIterate
(
builder
->
dataBlocksBuilders
,
iter
);
}
}
return
pVnodeDataBlockList
;
return
pVnodeDataBlockList
;
error:
error:
...
@@ -2695,6 +2694,119 @@ error:
...
@@ -2695,6 +2694,119 @@ error:
return
NULL
;
return
NULL
;
}
}
/**
* A Builder to build SInsertStatementParam::pTableNameList.
*/
typedef
struct
STableNameListBuilder
{
SArray
*
tableNames
;
}
STableNameListBuilder
;
/**
* Create STableNameListBuilder.
*/
STableNameListBuilder
*
createSTableNameListBuilder
()
{
STableNameListBuilder
*
builder
=
calloc
(
1
,
sizeof
(
STableNameListBuilder
));
if
(
!
builder
)
{
return
NULL
;
}
builder
->
tableNames
=
taosArrayInit
(
1
,
sizeof
(
SName
*
));
if
(
!
builder
->
tableNames
)
{
free
(
builder
);
return
NULL
;
}
return
builder
;
}
/**
* Destroy the STableNameListBuilder.
* @param builder the STableNameListBuilder.
*/
void
destroySTableNameListBuilder
(
STableNameListBuilder
*
builder
)
{
if
(
!
builder
)
{
return
;
}
taosArrayDestroy
(
&
builder
->
tableNames
);
free
(
builder
);
}
/**
* A util function to compare two SName.
*/
static
int32_t
compareSName
(
const
void
*
x
,
const
void
*
y
)
{
SName
*
left
=
*
((
SName
**
)
x
);
SName
*
right
=
*
((
SName
**
)
y
);
if
(
left
==
right
)
{
return
0
;
}
return
strncmp
((
const
char
*
)
left
,
(
const
char
*
)
right
,
sizeof
(
SName
));
}
/**
* Insert a SName to builder.
*
* @param builder the STableNameListBuilder.
* @param name the table name.
* @return whether it is success.
*/
bool
insertSTableNameListBuilder
(
STableNameListBuilder
*
builder
,
SName
*
name
)
{
return
taosArrayPush
(
builder
->
tableNames
,
&
name
);
}
/**
* Build the STable name list.
*
* @param builder the STableNameListBuilder.
* @param numOfTables the number of table.
* @return the STable name list.
*/
SName
**
buildSTableNameListBuilder
(
STableNameListBuilder
*
builder
,
size_t
*
numOfTables
)
{
if
(
!
taosArrayGetSize
(
builder
->
tableNames
))
{
*
numOfTables
=
0
;
return
NULL
;
}
// sort and unique.
taosArraySort
(
builder
->
tableNames
,
compareSName
);
size_t
tail
=
0
;
for
(
size_t
i
=
1
;
i
<
taosArrayGetSize
(
builder
->
tableNames
);
++
i
)
{
SName
*
last
=
taosArrayGetP
(
builder
->
tableNames
,
tail
);
SName
*
current
=
taosArrayGetP
(
builder
->
tableNames
,
i
);
if
(
compareSName
(
last
,
current
)
!=
0
)
{
++
tail
;
taosArraySet
(
builder
->
tableNames
,
tail
,
&
current
);
}
}
// build tableNameList
SName
**
tableNames
=
calloc
(
tail
+
1
,
sizeof
(
SName
*
));
if
(
!
tableNames
)
{
return
NULL
;
}
for
(
size_t
i
=
0
;
i
<=
tail
;
++
i
)
{
SName
*
clone
=
malloc
(
sizeof
(
SName
));
if
(
!
clone
)
{
goto
error
;
}
memcpy
(
clone
,
taosArrayGetP
(
builder
->
tableNames
,
i
),
sizeof
(
SName
));
tableNames
[
i
]
=
clone
;
}
*
numOfTables
=
tail
+
1
;
return
tableNames
;
error:
for
(
size_t
i
=
0
;
i
<=
tail
;
++
i
)
{
if
(
tableNames
[
i
])
{
free
(
tableNames
[
i
]);
}
}
free
(
tableNames
);
return
NULL
;
}
/**
/**
* Merge the KV-PayLoad SQL objects into single one.
* Merge the KV-PayLoad SQL objects into single one.
* The statements here must be an insertion statement and no schema attached.
* The statements here must be an insertion statement and no schema attached.
...
@@ -2714,9 +2826,15 @@ int32_t tscMergeKVPayLoadSqlObj(SArray* statements, SSqlObj *result) {
...
@@ -2714,9 +2826,15 @@ int32_t tscMergeKVPayLoadSqlObj(SArray* statements, SSqlObj *result) {
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
}
STableNameListBuilder
*
nameListBuilder
=
createSTableNameListBuilder
();
if
(
!
nameListBuilder
)
{
destroySTableDataBlocksListBuilder
(
builder
);
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
// append the existing data blocks to builder.
// append the existing data blocks to builder.
for
(
in
t
i
=
0
;
i
<
taosArrayGetSize
(
statements
);
++
i
)
{
for
(
size_
t
i
=
0
;
i
<
taosArrayGetSize
(
statements
);
++
i
)
{
SSqlObj
*
pSql
=
*
((
SSqlObj
**
)
taosArrayGet
(
statements
,
i
)
);
SSqlObj
*
pSql
=
taosArrayGetP
(
statements
,
i
);
SInsertStatementParam
*
pInsertParam
=
&
pSql
->
cmd
.
insertParam
;
SInsertStatementParam
*
pInsertParam
=
&
pSql
->
cmd
.
insertParam
;
if
(
!
pInsertParam
->
pDataBlocks
)
{
if
(
!
pInsertParam
->
pDataBlocks
)
{
continue
;
continue
;
...
@@ -2725,32 +2843,72 @@ int32_t tscMergeKVPayLoadSqlObj(SArray* statements, SSqlObj *result) {
...
@@ -2725,32 +2843,72 @@ int32_t tscMergeKVPayLoadSqlObj(SArray* statements, SSqlObj *result) {
assert
(
pInsertParam
->
payloadType
==
PAYLOAD_TYPE_KV
);
assert
(
pInsertParam
->
payloadType
==
PAYLOAD_TYPE_KV
);
assert
(
!
pInsertParam
->
schemaAttached
);
assert
(
!
pInsertParam
->
schemaAttached
);
for
(
int
j
=
0
;
j
<
taosArrayGetSize
(
pInsertParam
->
pDataBlocks
);
++
j
)
{
// append each vnode data block to the builder.
STableDataBlocks
*
tableBlock
=
*
((
STableDataBlocks
**
)
taosArrayGet
(
pInsertParam
->
pDataBlocks
,
j
));
for
(
size_t
j
=
0
;
j
<
taosArrayGetSize
(
pInsertParam
->
pDataBlocks
);
++
j
)
{
STableDataBlocks
*
tableBlock
=
taosArrayGetP
(
pInsertParam
->
pDataBlocks
,
j
);
if
(
!
appendSTableDataBlocksListBuilder
(
builder
,
tableBlock
))
{
if
(
!
appendSTableDataBlocksListBuilder
(
builder
,
tableBlock
))
{
destroySTableDataBlocksListBuilder
(
builder
);
destroySTableDataBlocksListBuilder
(
builder
);
destroySTableNameListBuilder
(
nameListBuilder
);
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
}
for
(
int
k
=
0
;
k
<
pInsertParam
->
numOfTables
;
++
k
)
{
if
(
!
insertSTableNameListBuilder
(
nameListBuilder
,
pInsertParam
->
pTableNameList
[
k
]))
{
destroySTableDataBlocksListBuilder
(
builder
);
destroySTableNameListBuilder
(
nameListBuilder
);
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
}
}
}
}
}
// build the vnode data blocks.
// build the vnode data blocks.
int32_t
numOfTable
s
=
0
;
size_t
numOfBlock
s
=
0
;
SInsertStatementParam
*
pInsertParam
=
&
result
->
cmd
.
insertParam
;
SInsertStatementParam
*
pInsertParam
=
&
result
->
cmd
.
insertParam
;
SArray
*
pVnodeDataBlocksList
=
buildSTableDataBlocksListBuilder
(
builder
,
&
numOf
Table
s
);
SArray
*
pVnodeDataBlocksList
=
buildSTableDataBlocksListBuilder
(
builder
,
&
numOf
Block
s
);
if
(
!
pVnodeDataBlocksList
)
{
if
(
!
pVnodeDataBlocksList
)
{
destroySTableDataBlocksListBuilder
(
builder
);
destroySTableDataBlocksListBuilder
(
builder
);
destroySTableNameListBuilder
(
nameListBuilder
);
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
// build the table name list.
size_t
numOfTables
=
0
;
SName
**
pTableNameList
=
buildSTableNameListBuilder
(
nameListBuilder
,
&
numOfTables
);
if
(
!
pTableNameList
)
{
destroySTableDataBlocksListBuilder
(
builder
);
destroySTableNameListBuilder
(
nameListBuilder
);
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
return
TSDB_CODE_TSC_OUT_OF_MEMORY
;
}
}
if
(
numOfTables
!=
numOfBlocks
)
{
printf
(
"numOfTables=%zu, numOfBlocks=%zu
\n
"
,
numOfTables
,
numOfBlocks
);
}
assert
(
numOfTables
==
numOfBlocks
);
// replace table name list.
if
(
pInsertParam
->
pTableNameList
)
{
for
(
size_t
i
=
0
;
i
<
pInsertParam
->
numOfTables
;
++
i
)
{
if
(
pInsertParam
->
pTableNameList
[
i
])
{
free
(
pInsertParam
->
pTableNameList
[
i
]);
}
}
free
(
pInsertParam
->
pTableNameList
);
}
pInsertParam
->
pTableNameList
=
pTableNameList
;
pInsertParam
->
numOfTables
=
(
int32_t
)
numOfTables
;
// replace vnode data blocks.
if
(
pInsertParam
->
pDataBlocks
)
{
for
(
size_t
i
=
0
;
i
<
taosArrayGetSize
(
pInsertParam
->
pDataBlocks
);
++
i
)
{
tscDestroyDataBlock
(
result
,
taosArrayGetP
(
pInsertParam
->
pDataBlocks
,
i
),
false
);
}
taosArrayDestroy
(
&
pInsertParam
->
pDataBlocks
);
}
pInsertParam
->
pDataBlocks
=
pVnodeDataBlocksList
;
pInsertParam
->
pDataBlocks
=
pVnodeDataBlocksList
;
pInsertParam
->
numOfTables
=
numOfTables
;
// clean up.
// clean up.
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
statements
);
++
i
)
{
SSqlObj
*
pSql
=
*
((
SSqlObj
**
)
taosArrayGet
(
statements
,
i
));
taosReleaseRef
(
tscObjRef
,
pSql
->
self
);
}
destroySTableDataBlocksListBuilder
(
builder
);
destroySTableDataBlocksListBuilder
(
builder
);
destroySTableNameListBuilder
(
nameListBuilder
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
@@ -2869,7 +3027,7 @@ int32_t tscMergeTableDataBlocks(SSqlObj *pSql, SInsertStatementParam *pInsertPar
...
@@ -2869,7 +3027,7 @@ int32_t tscMergeTableDataBlocks(SSqlObj *pSql, SInsertStatementParam *pInsertPar
pOneTableBlock
=
*
p
;
pOneTableBlock
=
*
p
;
}
}
extractTableNameList
(
p
Sql
,
p
InsertParam
,
pTableDataBlockList
);
extractTableNameList
(
pInsertParam
,
pTableDataBlockList
);
if
(
freeBlockMap
&&
pInsertParam
->
pTableBlockHashList
)
{
if
(
freeBlockMap
&&
pInsertParam
->
pTableBlockHashList
)
{
taosHashCleanup
(
pInsertParam
->
pTableBlockHashList
);
taosHashCleanup
(
pInsertParam
->
pTableBlockHashList
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录