Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
3b49a863
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看板
提交
3b49a863
编写于
3月 22, 2022
作者:
H
Hongze Cheng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
more TDB
上级
d7b54201
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
154 addition
and
40 deletion
+154
-40
source/libs/tdb/src/db/tdbBtree.c
source/libs/tdb/src/db/tdbBtree.c
+154
-40
未找到文件。
source/libs/tdb/src/db/tdbBtree.c
浏览文件 @
3b49a863
...
...
@@ -564,7 +564,7 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx) {
if
(
infoNews
[
nNews
].
size
+
cellBytes
>
TDB_PAGE_USABLE_SIZE
(
pPage
))
{
// page is full, use a new page
nNews
++
;
// for a internal leaf case, this cell is used as the new divider cell to parent
// for a
n
internal leaf case, this cell is used as the new divider cell to parent
if
(
!
childLeaf
)
continue
;
}
infoNews
[
nNews
].
cnt
++
;
...
...
@@ -594,10 +594,10 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx) {
int
nCells
;
int
cellBytes
;
if
(
childLeaf
)
{
// child leaf
pPage
=
pOlds
[
infoNews
[
iNew
-
1
].
oPage
];
nCells
=
TDB_PAGE_TOTAL_CELLS
(
pPage
);
pPage
=
pOlds
[
infoNews
[
iNew
-
1
].
oPage
];
nCells
=
TDB_PAGE_TOTAL_CELLS
(
pPage
);
if
(
childLeaf
)
{
// child leaf
for
(;;)
{
pCell
=
tdbPageGetCell
(
pPage
,
infoNews
[
iNew
-
1
].
oIdx
);
cellBytes
=
TDB_BYTES_CELL_TAKEN
(
pPage
,
pCell
);
...
...
@@ -618,7 +618,55 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx) {
}
}
}
else
{
// internal leaf
// TODO
SCell
*
pCellRight
;
SCell
*
pCellLeft
;
int
szCellRight
,
szCellLeft
;
// get pCellLeft, szCellLeft
if
(
infoNews
[
iNew
-
1
].
oIdx
==
nCells
)
{
ASSERT
(
infoNews
[
iNew
-
1
].
oPage
<
nOlds
-
1
);
pCellLeft
=
pDivCell
[
infoNews
[
iNew
-
1
].
oPage
];
szCellLeft
=
szDivCell
[
infoNews
[
iNew
-
1
].
oPage
];
}
else
{
pCellLeft
=
tdbPageGetCell
(
pPage
,
infoNews
[
iNew
-
1
].
oIdx
);
szCellLeft
=
tdbBtreeCellSize
(
pPage
,
pCellLeft
);
}
// get pCellRight, szCellRight
if
(
infoNews
[
iNew
-
1
].
oIdx
+
1
<
nCells
)
{
pCellRight
=
tdbPageGetCell
(
pPage
,
infoNews
[
iNew
-
1
].
oIdx
+
1
);
szCellRight
=
tdbBtreeCellSize
(
pPage
,
pCellRight
);
}
else
{
if
(
infoNews
[
iNew
-
1
].
oPage
<
nOlds
-
1
)
{
pCellRight
=
pDivCell
[
infoNews
[
iNew
-
1
].
oPage
];
szCellRight
=
szDivCell
[
infoNews
[
iNew
-
1
].
oPage
];
}
else
{
// TODO: what if the next old page is empty?
pCellRight
=
tdbPageGetCell
(
pOlds
[
infoNews
[
iNew
-
1
].
oPage
+
1
],
0
);
szCellRight
=
tdbBtreeCellSize
(
pPage
,
pCellRight
);
}
}
if
(
infoNews
[
iNew
-
1
].
size
-
szCellLeft
-
TDB_PAGE_OFFSET_SIZE
(
pPage
)
<=
infoNews
[
iNew
].
size
+
szCellRight
+
TDB_PAGE_OFFSET_SIZE
(
pPage
))
{
break
;
}
// TODO: ASSERT(infoNews[iNew].size < PAGE_MAX_CAPACITY);
infoNews
[
iNew
].
cnt
++
;
infoNews
[
iNew
].
size
+=
szCellRight
;
infoNews
[
iNew
-
1
].
cnt
--
;
infoNews
[
iNew
-
1
].
size
-=
szCellLeft
;
if
((
infoNews
[
iNew
-
1
].
oIdx
--
)
==
0
)
{
infoNews
[
iNew
-
1
].
oPage
--
;
pPage
=
pOlds
[
infoNews
[
iNew
-
1
].
oPage
];
nCells
=
TDB_PAGE_TOTAL_CELLS
(
pPage
);
if
(
infoNews
[
iNew
-
1
].
oPage
<
nOlds
-
1
)
{
infoNews
[
iNew
-
1
].
oIdx
=
nCells
;
}
else
{
infoNews
[
iNew
-
1
].
oIdx
=
nCells
-
1
;
}
}
}
}
}
...
...
@@ -654,6 +702,8 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx) {
int
tPage
,
tIdx
,
iOld
;
SCell
*
pCell
;
int
szCell
;
int
nCells
;
SCellDecoder
cd
;
SBtreeInitPageArg
iarg
=
{.
flags
=
TDB_BTREE_PAGE_GET_FLAGS
(
pOlds
[
0
]),
.
pBt
=
pBt
};
for
(
int
i
=
0
;
i
<
2
;
i
++
)
{
...
...
@@ -666,58 +716,122 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx) {
tPage
=
0
;
tIdx
=
0
;
iOld
=
0
;
nCells
=
TDB_PAGE_TOTAL_CELLS
(
pOlds
[
iOld
]);
tdbBtreeZeroPage
(
pTPage
[
tPage
],
&
iarg
);
tdbPageCopy
(
pOlds
[
iOld
++
],
pTPage
[
tPage
]);
tdbPageCopy
(
pOlds
[
iOld
],
pTPage
[
tPage
]);
if
(
!
childLeaf
)
{
((
SIntHdr
*
)
pTPage
[
tPage
]
->
pData
)
->
pgno
=
((
SIntHdr
*
)
pOlds
[
iOld
]
->
pData
)
->
pgno
;
}
for
(
int
iNew
=
0
;
iNew
<
nNews
;
iNew
++
)
{
// fill the iNew page
// TODO: copy current page to tmp space
tdbBtreeZeroPage
(
pNews
[
iNew
],
&
iarg
);
for
(
int
iCell
=
0
;
iCell
<
infoNews
[
iNew
].
cnt
;
iCell
++
)
{
while
(
tIdx
>=
TDB_PAGE_TOTAL_CELLS
(
pTPage
[
tPage
]))
{
tPage
=
(
tPage
+
1
)
%
2
;
tIdx
=
0
;
tdbBtreeZeroPage
(
pTPage
[
tPage
],
&
iarg
);
tdbPageCopy
(
pOlds
[
iOld
++
],
pTPage
[
tPage
]);
for
(;;)
{
// loop to find the next available cell
if
(
tIdx
<
nCells
)
{
pCell
=
tdbPageGetCell
(
pTPage
[
tPage
],
tIdx
);
szCell
=
tdbBtreeCellSize
(
pTPage
[
tPage
],
pCell
);
tIdx
++
;
break
;
}
else
{
if
(
!
childLeaf
)
{
if
(
iOld
<
nOlds
-
1
)
{
pCell
=
pDivCell
[
iOld
];
szCell
=
szDivCell
[
iOld
];
((
SPgno
*
)
pCell
)[
0
]
=
((
SIntHdr
*
)
pOlds
[
iOld
]
->
pData
)
->
pgno
;
iOld
++
;
tPage
=
(
tPage
+
1
)
%
2
;
tIdx
=
0
;
nCells
=
TDB_PAGE_TOTAL_CELLS
(
pOlds
[
iOld
]);
tdbBtreeZeroPage
(
pTPage
[
tPage
],
&
iarg
);
tdbPageCopy
(
pOlds
[
iOld
],
pTPage
[
tPage
]);
((
SIntHdr
*
)
pTPage
[
tPage
]
->
pData
)
->
pgno
=
((
SIntHdr
*
)
pOlds
[
iOld
]
->
pData
)
->
pgno
;
break
;
}
else
{
iOld
++
;
tPage
=
(
tPage
+
1
)
%
2
;
tIdx
=
0
;
nCells
=
TDB_PAGE_TOTAL_CELLS
(
pOlds
[
iOld
]);
tdbBtreeZeroPage
(
pTPage
[
tPage
],
&
iarg
);
tdbPageCopy
(
pOlds
[
iOld
],
pTPage
[
tPage
]);
((
SIntHdr
*
)
pTPage
[
tPage
]
->
pData
)
->
pgno
=
((
SIntHdr
*
)
pOlds
[
iOld
]
->
pData
)
->
pgno
;
}
}
else
{
iOld
++
;
tPage
=
(
tPage
+
1
)
%
2
;
tIdx
=
0
;
nCells
=
TDB_PAGE_TOTAL_CELLS
(
pOlds
[
iOld
]);
tdbBtreeZeroPage
(
pTPage
[
tPage
],
&
iarg
);
tdbPageCopy
(
pOlds
[
iOld
],
pTPage
[
tPage
]);
}
}
}
pCell
=
tdbPageGetCell
(
pTPage
[
tPage
],
tIdx
);
szCell
=
tdbBtreeCellSize
(
pTPage
[
tPage
],
pCell
);
tdbPageInsertCell
(
pNews
[
iNew
],
iCell
,
pCell
,
szCell
);
tIdx
++
;
}
}
for
(
int
i
=
0
;
i
<
2
;
i
++
)
{
tdbPageDestroy
(
pTPage
[
i
],
NULL
,
NULL
);
}
}
{
// Insert records in parent page
int
cIdx
=
sIdx
;
int
szCell
;
SCell
pCell
[
128
];
// TODO
SCellDecoder
cd
;
for
(
int
iNew
=
0
;
iNew
<
nNews
;
iNew
++
)
{
if
(
iNew
==
nNews
-
1
)
{
// The last new page
SIntHdr
*
pIntHdr
=
(
SIntHdr
*
)
pParent
->
pData
;
if
(
pIntHdr
->
pgno
==
0
)
{
pIntHdr
->
pgno
=
TDB_PAGE_PGNO
(
pNews
[
iNew
]);
// fill right-most child pgno if internal page
if
(
!
childLeaf
)
{
if
(
tIdx
<
nCells
)
{
pCell
=
tdbPageGetCell
(
pTPage
[
tPage
],
tIdx
);
szCell
=
tdbBtreeCellSize
(
pTPage
[
tPage
],
pCell
);
tIdx
++
;
break
;
}
else
{
if
(
!
childLeaf
)
{
if
(
iOld
<
nOlds
-
1
)
{
pCell
=
pDivCell
[
iOld
];
szCell
=
szDivCell
[
iOld
];
((
SPgno
*
)
pCell
)[
0
]
=
((
SIntHdr
*
)
pOlds
[
iOld
]
->
pData
)
->
pgno
;
iOld
++
;
tPage
=
(
tPage
+
1
)
%
2
;
tIdx
=
0
;
nCells
=
TDB_PAGE_TOTAL_CELLS
(
pOlds
[
iOld
]);
tdbBtreeZeroPage
(
pTPage
[
tPage
],
&
iarg
);
tdbPageCopy
(
pOlds
[
iOld
],
pTPage
[
tPage
]);
((
SIntHdr
*
)
pTPage
[
tPage
]
->
pData
)
->
pgno
=
((
SIntHdr
*
)
pOlds
[
iOld
]
->
pData
)
->
pgno
;
break
;
}
else
{
iOld
++
;
tPage
=
(
tPage
+
1
)
%
2
;
tIdx
=
0
;
nCells
=
TDB_PAGE_TOTAL_CELLS
(
pOlds
[
iOld
]);
tdbBtreeZeroPage
(
pTPage
[
tPage
],
&
iarg
);
tdbPageCopy
(
pOlds
[
iOld
],
pTPage
[
tPage
]);
((
SIntHdr
*
)
pTPage
[
tPage
]
->
pData
)
->
pgno
=
((
SIntHdr
*
)
pOlds
[
iOld
]
->
pData
)
->
pgno
;
}
}
else
{
iOld
++
;
tPage
=
(
tPage
+
1
)
%
2
;
tIdx
=
0
;
nCells
=
TDB_PAGE_TOTAL_CELLS
(
pOlds
[
iOld
]);
tdbBtreeZeroPage
(
pTPage
[
tPage
],
&
iarg
);
tdbPageCopy
(
pOlds
[
iOld
],
pTPage
[
tPage
]);
}
}
((
SIntHdr
*
)
pNews
[
iNew
]
->
pData
)
->
pgno
=
((
SPgno
*
)
pCell
)[
0
];
}
tdbBtreeDecodeCell
(
pNews
[
iNew
],
tdbPageGetCell
(
pNews
[
iNew
],
TDB_PAGE_TOTAL_CELLS
(
pNews
[
iNew
])
-
1
),
&
cd
);
// insert divider cell into the parent page
SIntHdr
*
pIntHdr
=
(
SIntHdr
*
)
pParent
->
pData
;
if
(
iNew
==
nNews
-
1
&&
pIntHdr
->
pgno
==
0
)
{
pIntHdr
->
pgno
=
TDB_PAGE_PGNO
(
pNews
[
iNew
]);
}
else
{
tdbBtreeDecodeCell
(
pNews
[
iNew
],
tdbPageGetCell
(
pNews
[
iNew
],
TDB_PAGE_TOTAL_CELLS
(
pNews
[
iNew
])
-
1
),
&
cd
);
tdbBtreeEncodeCell
(
pParent
,
cd
.
pKey
,
cd
.
kLen
,
(
void
*
)
&
TDB_PAGE_PGNO
(
pNews
[
iNew
]),
sizeof
(
SPgno
),
pCell
,
&
szCell
);
// TODO: the cell here may be used by pParent as an overflow cell
tdbPageInsertCell
(
pParent
,
sIdx
++
,
pCell
,
szCell
);
}
}
tdbBtreeEncodeCell
(
pParent
,
cd
.
pKey
,
cd
.
kLen
,
(
void
*
)
&
TDB_PAGE_PGNO
(
pNews
[
iNew
]),
sizeof
(
SPgno
),
pCell
,
&
szCell
);
// TODO: the cell here may be used by pParent as an overflow cell
tdbPageInsertCell
(
pParent
,
cIdx
,
pCell
,
szCell
);
for
(
int
i
=
0
;
i
<
2
;
i
++
)
{
tdbPageDestroy
(
pTPage
[
i
],
NULL
,
NULL
);
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录