Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
b38e6907
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22017
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看板
提交
b38e6907
编写于
2月 23, 2022
作者:
H
Hongze Cheng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
more
上级
aaab6de4
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
84 addition
and
11 deletion
+84
-11
source/libs/tdb/src/db/tdbPgCache.c
source/libs/tdb/src/db/tdbPgCache.c
+73
-5
source/libs/tdb/src/inc/tdbPgCache.h
source/libs/tdb/src/inc/tdbPgCache.h
+11
-6
未找到文件。
source/libs/tdb/src/db/tdbPgCache.c
浏览文件 @
b38e6907
...
...
@@ -21,7 +21,7 @@ struct SPCache {
int
nRef
;
pthread_mutex_t
mutex
;
int
nPage
;
SPgHdr
*
lru
;
SPgHdr
lru
;
int
nRecyclable
;
int
nHash
;
SPgHdr
**
pgHash
;
...
...
@@ -29,8 +29,8 @@ struct SPCache {
SPgHdr
*
pFree
;
};
#define PCACHE_PAGE_HASH(pgid)
0
// TODO
#define PAGE_IS_
UNPINNED(pPage) true // TODO
#define PCACHE_PAGE_HASH(pgid)
0
// TODO
#define PAGE_IS_
PINNED(pPage) ((pPage)->pLruNext == NULL)
static
void
tdbPCacheInitLock
(
SPCache
*
pCache
);
static
void
tdbPCacheClearLock
(
SPCache
*
pCache
);
...
...
@@ -39,6 +39,8 @@ static void tdbPCacheUnlock(SPCache *pCache);
static
bool
tdbPCacheLocked
(
SPCache
*
pCache
);
static
SPgHdr
*
tdbPCacheFetchImpl
(
SPCache
*
pCache
,
const
SPgid
*
pPgid
,
bool
alcNewPage
);
static
void
tdbPCachePinPage
(
SPgHdr
*
pPage
);
static
void
tdbPCacheRemovePageFromHash
(
SPgHdr
*
pPage
);
static
void
tdbPCacheAddPageToHash
(
SPgHdr
*
pPage
);
int
tdbOpenPCache
(
int
pageSize
,
int
cacheSize
,
int
extraSize
,
SPCache
**
ppCache
)
{
SPCache
*
pCache
;
...
...
@@ -87,6 +89,10 @@ SPgHdr *tdbPCacheFetch(SPCache *pCache, const SPgid *pPgid, bool alcNewPage) {
return
pPage
;
}
void
tdbFetchFinish
(
SPCache
*
pCache
,
SPgHdr
*
pPage
)
{
// TODO
}
void
tdbPCacheRelease
(
SPgHdr
*
pHdr
)
{
// TODO
}
...
...
@@ -120,11 +126,73 @@ static SPgHdr *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, bool alcN
return
pPage
;
}
// 2. Try to allocate a new page from the free list
if
(
pCache
->
pFree
)
{
pPage
=
pCache
->
pFree
;
pCache
->
pFree
=
pPage
->
pFreeNext
;
pCache
->
nFree
--
;
pPage
->
pLruNext
=
NULL
;
}
// 3. Try to Recycle a page
if
(
!
pPage
&&
!
pCache
->
lru
.
pLruPrev
->
isAnchor
)
{
pPage
=
pCache
->
lru
.
pLruPrev
;
tdbPCacheRemovePageFromHash
(
pPage
);
tdbPCachePinPage
(
pPage
);
}
// 4. Try a stress allocation
// 5. Page here are just created from a free list
// or by recycling or allocated streesly,
// need to initialize it
if
(
pPage
)
{
memcpy
(
&
pPage
->
pgid
,
pPgid
,
sizeof
(
*
pPgid
));
pPage
->
pCache
=
pCache
;
pPage
->
pLruNext
=
NULL
;
tdbPCacheAddPageToHash
(
pPage
);
}
return
pPage
;
}
static
void
tdbPCachePinPage
(
SPgHdr
*
pPage
)
{
if
(
PAGE_IS_UNPINNED
(
pPage
))
{
/* TODO */
SPCache
*
pCache
;
pCache
=
pPage
->
pCache
;
if
(
!
PAGE_IS_PINNED
(
pPage
))
{
pPage
->
pLruPrev
->
pLruNext
=
pPage
->
pLruNext
;
pPage
->
pLruNext
->
pLruPrev
=
pPage
->
pLruPrev
;
pPage
->
pLruNext
=
NULL
;
pCache
->
nRecyclable
--
;
}
}
static
void
tdbPCacheRemovePageFromHash
(
SPgHdr
*
pPage
)
{
SPCache
*
pCache
;
SPgHdr
**
ppPage
;
int
h
;
pCache
=
pPage
->
pCache
;
h
=
PCACHE_PAGE_HASH
(
&
(
pPage
->
pgid
));
for
(
ppPage
=
&
(
pCache
->
pgHash
[
h
%
pCache
->
nHash
]);
*
ppPage
!=
pPage
;
ppPage
=
&
((
*
ppPage
)
->
pHashNext
))
;
ASSERT
(
*
ppPage
==
pPage
);
*
ppPage
=
pPage
->
pHashNext
;
pCache
->
nPage
--
;
}
static
void
tdbPCacheAddPageToHash
(
SPgHdr
*
pPage
)
{
SPCache
*
pCache
;
int
h
;
pCache
=
pPage
->
pCache
;
h
=
PCACHE_PAGE_HASH
(
&
pPage
->
pgid
)
%
pCache
->
nHash
;
pPage
->
pHashNext
=
pCache
->
pgHash
[
h
];
pCache
->
pgHash
[
h
]
=
pPage
;
pCache
->
nPage
++
;
}
\ No newline at end of file
source/libs/tdb/src/inc/tdbPgCache.h
浏览文件 @
b38e6907
...
...
@@ -24,17 +24,22 @@ typedef struct SPCache SPCache;
typedef
struct
SPgHdr
SPgHdr
;
struct
SPgHdr
{
void
*
pData
;
void
*
pExtra
;
SPgid
pgid
;
uint8_t
isLocalPage
;
SPgHdr
*
pFreeNext
;
SPgHdr
*
pHashNext
;
void
*
pData
;
void
*
pExtra
;
SPgid
pgid
;
uint8_t
isAnchor
;
uint8_t
isLocalPage
;
SPCache
*
pCache
;
SPgHdr
*
pFreeNext
;
SPgHdr
*
pHashNext
;
SPgHdr
*
pLruNext
;
SPgHdr
*
pLruPrev
;
};
int
tdbOpenPCache
(
int
pageSize
,
int
cacheSize
,
int
extraSize
,
SPCache
**
ppCache
);
int
tdbPCacheClose
(
SPCache
*
pCache
);
SPgHdr
*
tdbPCacheFetch
(
SPCache
*
pCache
,
const
SPgid
*
pPgid
,
bool
alcNewPage
);
void
tdbFetchFinish
(
SPCache
*
pCache
,
SPgHdr
*
pPage
);
void
tdbPCacheRelease
(
SPgHdr
*
pHdr
);
#ifdef __cplusplus
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录