Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
655233fd
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看板
提交
655233fd
编写于
7月 17, 2023
作者:
S
slzhou
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: create initial source with blocks
上级
9a0e9df5
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
124 addition
and
38 deletion
+124
-38
source/libs/executor/src/tsort.c
source/libs/executor/src/tsort.c
+124
-38
未找到文件。
source/libs/executor/src/tsort.c
浏览文件 @
655233fd
...
@@ -787,40 +787,106 @@ static int32_t createPageBuf(SSortHandle* pHandle) {
...
@@ -787,40 +787,106 @@ static int32_t createPageBuf(SSortHandle* pHandle) {
return
0
;
return
0
;
}
}
static
int32_t
addDataBlockToPageBuf
(
SSortHandle
*
pHandle
,
SSDataBlock
*
pDataBlock
,
SArray
*
aPgId
)
{
typedef
struct
SBlkMergeSupport
{
int32_t
start
=
0
;
int64_t
**
aTs
;
while
(
start
<
pDataBlock
->
info
.
rows
)
{
int32_t
*
aRowIdx
;
int32_t
stop
=
0
;
int32_t
order
;
blockDataSplitRows
(
pDataBlock
,
pDataBlock
->
info
.
hasVarCol
,
start
,
&
stop
,
pHandle
->
pageSize
);
}
SBlkMergeSupport
;
SSDataBlock
*
p
=
blockDataExtractBlock
(
pDataBlock
,
start
,
stop
-
start
+
1
);
if
(
p
==
NULL
)
{
static
int32_t
blockCompareTsFn
(
const
void
*
pLeft
,
const
void
*
pRight
,
void
*
param
)
{
taosArrayDestroy
(
aPgId
);
int32_t
left
=
*
(
int32_t
*
)
pLeft
;
return
terrno
;
int32_t
right
=
*
(
int32_t
*
)
pRight
;
}
SBlkMergeSupport
*
pSup
=
(
SBlkMergeSupport
*
)
param
;
if
(
pSup
->
aRowIdx
[
left
]
==
-
1
)
{
return
1
;
}
else
if
(
pSup
->
aRowIdx
[
right
]
==
-
1
)
{
return
-
1
;
}
int32_t
pageId
=
-
1
;
int64_t
leftTs
=
pSup
->
aTs
[
left
][
pSup
->
aRowIdx
[
left
]];
void
*
pPage
=
getNewBufPage
(
pHandle
->
pBuf
,
&
pageId
);
int64_t
rightTs
=
pSup
->
aTs
[
right
][
pSup
->
aRowIdx
[
right
]];
if
(
pPage
==
NULL
)
{
taosArrayDestroy
(
aPgId
);
blockDataDestroy
(
p
);
return
terrno
;
}
taosArrayPush
(
aPgId
,
&
pageId
);
int32_t
ret
=
leftTs
>
rightTs
?
1
:
((
leftTs
<
rightTs
)
?
-
1
:
0
);
if
(
pSup
->
order
==
TSDB_ORDER_DESC
)
{
ret
=
-
1
*
ret
;
}
return
ret
;
}
int32_t
size
=
blockDataGetSize
(
p
)
+
sizeof
(
int32_t
)
+
taosArrayGetSize
(
p
->
pDataBlock
)
*
sizeof
(
int32_t
);
static
int32_t
appendDataBlockToPageBuf
(
SSortHandle
*
pHandle
,
SSDataBlock
*
blk
,
SArray
*
aPgId
)
{
ASSERT
(
size
<=
getBufPageSize
(
pHandle
->
pBuf
));
int32_t
pageId
=
-
1
;
void
*
pPage
=
getNewBufPage
(
pHandle
->
pBuf
,
&
pageId
);
taosArrayPush
(
aPgId
,
&
pageId
);
blockDataToBuf
(
pPage
,
blk
);
blockDataToBuf
(
pPage
,
p
);
setBufPageDirty
(
pPage
,
true
);
releaseBufPage
(
pHandle
->
pBuf
,
pPage
);
blockDataCleanup
(
blk
);
setBufPageDirty
(
pPage
,
true
)
;
return
0
;
releaseBufPage
(
pHandle
->
pBuf
,
pPage
);
}
blockDataDestroy
(
p
);
start
=
stop
+
1
;
static
int32_t
sortBlocksToExtSource
(
SSortHandle
*
pHandle
,
SArray
*
aBlk
,
SBlockOrderInfo
*
order
,
SArray
*
aExtSrc
)
{
int32_t
rowCap
=
blockDataGetCapacityInRow
(
pHandle
->
pDataBlock
,
pHandle
->
pageSize
,
blockDataGetSerialMetaSize
(
taosArrayGetSize
(
pHandle
->
pDataBlock
->
pDataBlock
)));
blockDataEnsureCapacity
(
pHandle
->
pDataBlock
,
rowCap
);
blockDataCleanup
(
pHandle
->
pDataBlock
);
int32_t
numBlks
=
taosArrayGetSize
(
aBlk
);
SBlkMergeSupport
sup
;
sup
.
aRowIdx
=
taosMemoryCalloc
(
numBlks
,
sizeof
(
int32_t
));
sup
.
aTs
=
taosMemoryCalloc
(
numBlks
,
sizeof
(
int64_t
*
));
sup
.
order
=
order
->
order
;
for
(
int
i
=
0
;
i
<
numBlks
;
++
i
)
{
SSDataBlock
*
blk
=
taosArrayGetP
(
aBlk
,
i
);
SColumnInfoData
*
col
=
taosArrayGet
(
blk
->
pDataBlock
,
order
->
slotId
);
sup
.
aTs
[
i
]
=
(
int64_t
*
)
col
->
pData
;
sup
.
aRowIdx
[
i
]
=
0
;
}
}
blockDataCleanup
(
pDataBlock
);
int32_t
totalRows
=
0
;
for
(
int
i
=
0
;
i
<
numBlks
;
++
i
)
{
SSDataBlock
*
blk
=
taosArrayGetP
(
aBlk
,
i
);
totalRows
+=
blk
->
info
.
rows
;
}
SArray
*
aPgId
=
taosArrayInit
(
8
,
sizeof
(
int32_t
));
SMultiwayMergeTreeInfo
*
pTree
=
NULL
;
tMergeTreeCreate
(
&
pTree
,
taosArrayGetSize
(
aBlk
),
&
sup
,
blockCompareTsFn
);
int32_t
numEnded
=
0
;
int32_t
nRows
=
0
;
while
(
nRows
<
totalRows
)
{
int32_t
minIdx
=
tMergeTreeGetChosenIndex
(
pTree
);
SSDataBlock
*
minBlk
=
taosArrayGetP
(
aBlk
,
minIdx
);
int32_t
minRow
=
sup
.
aRowIdx
[
minIdx
];
appendOneRowToDataBlock
(
pHandle
->
pDataBlock
,
minBlk
,
&
minRow
);
++
nRows
;
if
(
pHandle
->
pDataBlock
->
info
.
rows
>=
rowCap
)
{
appendDataBlockToPageBuf
(
pHandle
,
pHandle
->
pDataBlock
,
aPgId
);
}
if
(
sup
.
aRowIdx
[
minIdx
]
==
minBlk
->
info
.
rows
-
1
)
{
sup
.
aRowIdx
[
minIdx
]
=
-
1
;
++
numEnded
;
}
else
{
++
sup
.
aRowIdx
[
minIdx
];
}
tMergeTreeAdjust
(
pTree
,
tMergeTreeGetAdjustIndex
(
pTree
));
}
if
(
pHandle
->
pDataBlock
->
info
.
rows
>
0
)
{
appendDataBlockToPageBuf
(
pHandle
,
pHandle
->
pDataBlock
,
aPgId
);
}
SSDataBlock
*
pMemSrcBlk
=
createOneDataBlock
(
pHandle
->
pDataBlock
,
false
);
doAddNewExternalMemSource
(
pHandle
->
pBuf
,
aExtSrc
,
pMemSrcBlk
,
&
pHandle
->
sourceId
,
aPgId
);
taosMemoryFree
(
sup
.
aRowIdx
);
taosMemoryFree
(
sup
.
aTs
);
tMergeTreeDestroy
(
&
pTree
);
return
0
;
return
0
;
}
}
...
@@ -931,26 +997,46 @@ static int32_t createInitialSources(SSortHandle* pHandle) {
...
@@ -931,26 +997,46 @@ static int32_t createInitialSources(SSortHandle* pHandle) {
}
}
}
}
}
else
if
(
pHandle
->
type
==
SORT_TABLE_MERGE_SCAN
)
{
}
else
if
(
pHandle
->
type
==
SORT_TABLE_MERGE_SCAN
)
{
SBlockOrderInfo
*
pOrder
=
taosArrayGet
(
pHandle
->
pSortInfo
,
0
);
size_t
nSrc
=
taosArrayGetSize
(
pHandle
->
pOrderedSource
);
size_t
nSrc
=
taosArrayGetSize
(
pHandle
->
pOrderedSource
);
SArray
*
aExtSrc
=
taosArrayInit
(
nSrc
,
POINTER_BYTES
);
SArray
*
aExtSrc
=
taosArrayInit
(
nSrc
,
POINTER_BYTES
);
// pHandle->numOfPages = 1024; //todo check sortbufsize
pHandle
->
numOfPages
=
1024
;
//todo check sortbufsize
size_t
maxBufSize
=
pHandle
->
numOfPages
*
pHandle
->
pageSize
;
createPageBuf
(
pHandle
);
createPageBuf
(
pHandle
);
SSortSource
*
pSrc
=
taosArrayGetP
(
pHandle
->
pOrderedSource
,
0
);
SSortSource
*
pSrc
=
taosArrayGetP
(
pHandle
->
pOrderedSource
,
0
);
SSDataBlock
*
pBlk
=
pHandle
->
fetchfp
(
pSrc
->
param
);
int32_t
szSort
=
0
;
while
(
pBlk
!=
NULL
)
{
SArray
*
aPgId
=
taosArrayInit
(
8
,
sizeof
(
int32_t
));
SArray
*
aBlkSort
=
taosArrayInit
(
8
,
POINTER_BYTES
);
addDataBlockToPageBuf
(
pHandle
,
pBlk
,
aPgId
);
while
(
1
)
{
SSDataBlock
*
pMemSrcBlk
=
createOneDataBlock
(
pHandle
->
pDataBlock
,
false
);
SSDataBlock
*
pBlk
=
pHandle
->
fetchfp
(
pSrc
->
param
);
code
=
doAddNewExternalMemSource
(
pHandle
->
pBuf
,
aExtSrc
,
pMemSrcBlk
,
&
pHandle
->
sourceId
,
aPgId
);
if
(
pBlk
==
NULL
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
break
;
taosArrayDestroy
(
aExtSrc
);
};
return
code
;
szSort
+=
blockDataGetSize
(
pBlk
);
SSDataBlock
*
blk
=
createOneDataBlock
(
pBlk
,
true
);
taosArrayPush
(
aBlkSort
,
&
blk
);
if
(
szSort
>
maxBufSize
)
{
sortBlocksToExtSource
(
pHandle
,
aBlkSort
,
pOrder
,
aExtSrc
);
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
aBlkSort
);
++
i
)
{
blockDataDestroy
(
taosArrayGetP
(
aBlkSort
,
i
));
}
taosArrayClear
(
aBlkSort
);
szSort
=
0
;
}
}
pBlk
=
pHandle
->
fetchfp
(
pSrc
->
param
);
}
}
if
(
szSort
>
0
)
{
sortBlocksToExtSource
(
pHandle
,
aBlkSort
,
pOrder
,
aExtSrc
);
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
aBlkSort
);
++
i
)
{
blockDataDestroy
(
taosArrayGetP
(
aBlkSort
,
i
));
}
taosArrayClear
(
aBlkSort
);
szSort
=
0
;
}
taosArrayDestroy
(
aBlkSort
);
tsortClearOrderdSource
(
pHandle
->
pOrderedSource
,
NULL
,
NULL
);
tsortClearOrderdSource
(
pHandle
->
pOrderedSource
,
NULL
,
NULL
);
taosArrayAddAll
(
pHandle
->
pOrderedSource
,
aExtSrc
);
taosArrayAddAll
(
pHandle
->
pOrderedSource
,
aExtSrc
);
taosArrayDestroy
(
aExtSrc
);
taosArrayDestroy
(
aExtSrc
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录