Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
f9c09351
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看板
提交
f9c09351
编写于
3月 09, 2022
作者:
H
Hongze Cheng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
more TDB
上级
546bf6ac
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
105 addition
and
15 deletion
+105
-15
source/libs/tdb/src/db/tdbBtree.c
source/libs/tdb/src/db/tdbBtree.c
+91
-4
source/libs/tdb/src/inc/tdbPage.h
source/libs/tdb/src/inc/tdbPage.h
+14
-11
未找到文件。
source/libs/tdb/src/db/tdbBtree.c
浏览文件 @
f9c09351
...
...
@@ -450,15 +450,102 @@ static int tdbBtreeBalanceDeeper(SBTree *pBt, SPage *pRoot, SPage **ppChild) {
return
0
;
}
static
int
tdbBtreeBalanceNonRoot
(
SBTree
*
pBt
,
SPage
*
pParent
,
int
idx
,
bool
isRoot
)
{
static
int
tdbBtreeBalanceNonRoot
(
SBTree
*
pBt
,
SPage
*
pParent
,
int
idx
)
{
int
nOldPages
;
SPage
*
pOldPages
[
3
];
int
nNewPages
;
SPage
*
pNewPages
[
5
];
void
*
pCell
;
SPgno
pgno
;
int
i
;
int
nDiv
;
int
ret
;
SPage
*
pPage
;
void
*
pCellDiv
[
2
];
// Find three or less sibling pages
{
// TODO: Find three or less sibling pages on either side
i
=
pParent
->
pPageHdr
->
nCells
+
pParent
->
nOverflow
;
if
(
i
<
1
)
{
nDiv
=
0
;
}
else
{
if
(
idx
==
0
)
{
nDiv
=
0
;
}
else
if
(
idx
==
i
)
{
nDiv
=
i
-
2
;
}
else
{
nDiv
=
idx
-
1
;
}
i
=
2
;
}
nOldPages
=
i
+
1
;
if
(
i
+
nDiv
-
pParent
->
nOverflow
==
pParent
->
pPageHdr
->
nCells
)
{
pgno
=
pParent
->
pPageHdr
->
rChild
;
}
else
{
ASSERT
(
0
);
// TODO
pgno
=
0
;
}
for
(;;)
{
ret
=
tdbPagerFetchPage
(
pBt
->
pPager
,
pgno
,
&
pPage
,
tdbBtreeInitPage
,
pBt
);
if
(
ret
<
0
)
{
ASSERT
(
0
);
return
-
1
;
}
pOldPages
[
i
]
=
pPage
;
if
((
i
--
)
==
0
)
break
;
if
(
pParent
->
nOverflow
&&
i
+
nDiv
==
pParent
->
aiOvfl
[
0
])
{
pCellDiv
[
i
]
=
pParent
->
apOvfl
[
0
];
// pgno = 0;
// szNew[i] = tdbPageCellSize(pPage, pCell);
pParent
->
nOverflow
=
0
;
}
else
{
// pCellDiv[i] = TDB_PAGE_CELL_AT(pPage, i + nDiv - pParent->nOverflow);
// pgno = 0;
// szNew[i] = tdbPageCellSize(pPage, pCell);
// Drop the cell from the page
// ret = tdbPageDropCell(pPage, i + nDiv - pParent->nOverflow, szNew[i]);
// if (ret < 0) {
// return -1;
// }
}
/* code */
}
}
{
// TODO: Load all cells on the old page and the divider cells
}
{
// TODO: Get the number of pages needed to hold all cells
}
{
// TODO: Allocate enough new pages. Reuse old pages as much as possible
}
{
// TODO: Insert new divider cells into pParent
}
{
// TODO: Update the sibling pages
}
{
// TODO: Reset states
}
{
// TODO: Clear resources
}
/* TODO */
return
0
;
}
...
...
@@ -502,7 +589,7 @@ static int tdbBtreeBalance(SBtCursor *pCur) {
// Generalized balance step
pParent
=
pCur
->
pgStack
[
pCur
->
iPage
-
1
];
ret
=
tdbBtreeBalanceNonRoot
(
pCur
->
pBt
,
pParent
,
pCur
->
idxStack
[
pCur
->
iPage
-
1
]
,
(
iPage
==
1
)
);
ret
=
tdbBtreeBalanceNonRoot
(
pCur
->
pBt
,
pParent
,
pCur
->
idxStack
[
pCur
->
iPage
-
1
]);
if
(
ret
<
0
)
{
return
-
1
;
}
...
...
source/libs/tdb/src/inc/tdbPage.h
浏览文件 @
f9c09351
...
...
@@ -21,11 +21,12 @@ extern "C" {
#endif
typedef
struct
__attribute__
((
__packed__
))
{
u16
flags
;
u16
nCells
;
u16
cellCont
;
u16
freeCell
;
u16
nFree
;
u16
flags
;
u16
nCells
;
u16
cellCont
;
u16
freeCell
;
u16
nFree
;
SPgno
rChild
;
}
SPageHdr
;
typedef
struct
SPage
SPage
;
...
...
@@ -53,6 +54,8 @@ struct SPage {
int
maxLocal
;
int
minLocal
;
int
nOverflow
;
void
*
apOvfl
[
4
];
int
aiOvfl
[
4
];
};
// For page lock
...
...
@@ -80,13 +83,13 @@ struct SPage {
// For page ref
#define TDB_INIT_PAGE_REF(pPage) ((pPage)->nRef = 0)
#if 0
#define TDB_REF_PAGE(pPage) (++(pPage)->nRef)
#define TDB_UNREF_PAGE(pPage) (--(pPage)->nRef)
#define TDB_GET_PAGE_REF(pPage)
((pPage)->nRef)
#define TDB_REF_PAGE(pPage)
(++(pPage)->nRef)
#define TDB_UNREF_PAGE(pPage)
(--(pPage)->nRef)
#define TDB_GET_PAGE_REF(pPage) ((pPage)->nRef)
#else
#define TDB_REF_PAGE(pPage) atomic_add_fetch_32(&((pPage)->nRef), 1)
#define TDB_UNREF_PAGE(pPage) atomic_sub_fetch_32(&((pPage)->nRef), 1)
#define TDB_GET_PAGE_REF(pPage)
atomic_load_32(&((pPage)->nRef))
#define TDB_REF_PAGE(pPage)
atomic_add_fetch_32(&((pPage)->nRef), 1)
#define TDB_UNREF_PAGE(pPage)
atomic_sub_fetch_32(&((pPage)->nRef), 1)
#define TDB_GET_PAGE_REF(pPage) atomic_load_32(&((pPage)->nRef))
#endif
#ifdef __cplusplus
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录