没有合适的资源?快使用搜索试试~ 我知道了~
glusterfs的那些事-3.4.51
需积分: 0 0 下载量 115 浏览量
2022-08-03
20:38:09
上传
评论
收藏 351KB PDF 举报
温馨提示
试读
21页
下面就先简单来了解一下 glusterfs 中的 inode_table 结构吧//调用 xlator 进行清除// lru 缓存最大值// 活跃的 inode
资源详情
资源评论
资源推荐
97
3.4.5. inode
相关问题
3.4.5.1. inode table
这一节将要分享一下,当一个文件或者目录被创建的时候,在 glusterfs 中
inode_t 结构会经历哪些过程,而为什么要关注这点呢?因为在文件系统中,因
为文件句柄或者 inode 等导致的异常很容易出现严重的 bug,而 glusterfs 的
历史版本中,在 7.9 以前关于 open-behind 参数有一个重大的 bug,就是因为
统计文件引用出错,文件引用数据为 0,但是实际上文件正在被使用,而导致挂
载进程被清理的异常。当然,关于这个问题,会在后面分享一下本人在生产环境
使用中遇到的一些版本 bug,希望能引起注意。同时,了解这些内容,对于以
后分析内存泄露等问题,也有非常大的帮助。
首先这里先要介绍一下 inode table,所有的 inode 被进程创建之后,都要
关 联 到 inode-table 中 , 而 在 一 般 的 顶 级 的 xlators 功 能 里 面 , 例 如
fuse/server/NFS/gfapi 等不同功能模块中,都会创建一个 inode tables 给它
的子集,用于管理 inode,只要进程还存活的,那么 inode table 就一直存在。
下面就先简单来了解一下 glusterfs 中的 inode_table 结构吧
1. struct _inode_table {
2. pthread_mutex_t lock;
3. size_t dentry_hashsize;
4. size_t inode_hashsize;
5. char *name;
6. inode_t *root;
7.
//
调用
xlator
进行清除
8. xlator_t *xl;
98
9. // lru 缓存最大值
10.
uint32_t lru_limit;
11. // inode hash 表
12.
struct list_head *inode_hash;
13. // dentry hash 表
14.
struct list_head *name_hash;
15. // 活跃的 inode 信息记录表
16.
struct list_head active;
17. // 记录活跃的 inode 数量
18.
uint32_t active_size;
19.
struct list_head lru;
20.
21.
uint32_t lru_size;
22.
struct list_head purge;
23.
uint32_t purge_size;
24.
25. //下面是和内存池有关的
26.
struct mem_pool *inode_pool;
27.
struct mem_pool *dentry_pool;
28.
struct mem_pool *fd_mem_pool;
29.
int ctxcount;
30.
31. //这里是和 inode invalidation 操作有关的
32.
int32_t (*invalidator_fn)(xlator_t *, inode_t *);
33.
xlator_t *invalidator_xl;
34.
struct list_head invalidate;
35.
uint32_t invalidate_size;
36.
37.
38. //用于标识清理 inode table 操作 是否启动
39.
gf_boolean_t cleanup_started;
40.
};
通过这里的结构成员信息,可以知道主要就是记录活跃的 inode 信息,
还有将要销毁清理的 inode 信息等内容。注意,在关于 inode 这里,主要是三
99
个重要的东西,分别是 nlookup,ref 和 invalidation。
那么这里 nlookup 到底是什么呢?这个在前面的 inode_t 结构介绍中出现
过,nlookup 维护内核查找 inode 的次数。当 fuse 内核认为不再需要 inode
时,将会调用 FUSE_FORGET 或者 FUSE_BATCH_FORGET 进行处理。
这 里 FUSE_FORGET 是 定 义 在 fuse-bridge.c 文 件 中 的
fuse_handler_t operations ,这些是内核 fuse 和 glusterfs 之间接口的一部
分。简单地来理解,可以理解成为,当内核要清理这个 inode 的时候的回调函
数,类似 unref 在 gluster 中的实现一样。这里又是怎么理解呢?其实对于
glusterfs 来说,因为是一个自定义的 fuse ,因为可能 inode 会被接口调用释放
掉,例如文件被删掉这样的,这时候就是系统自行触发的,但是也有一种可能,
就类似底层操作系统释放掉了这个 inode,这时候就要通知到上层的 glusterfs
了,这就是 forget 这个功能存在的意义了,当然这部分内容比较绕,需要仔细
了解一下,后面也会不断讲解分析。
那 么 这 里 inode_table 是 如 何 创 建 的 呢 ? 这 里 代 码 在
libglusterfs/src/inode.c 中 的 inode_table_new 函 数 , 这 里 会 调 用
inode_table_with_invalidator 函数,然后调用
__inode_table_init_root,下面先来看看代码的一些内容。
1.
inode_table_t *
2.
inode_table_with_invalidator(uint32_t lru_limit, xlator_t
*xl,
3.
int32_t (*invalidator_fn)(xl
ator_t *, inode_t *),
4.
xlator_t *invalidator_xl, ui
nt32_t dentry_hashsize,
100
5.
uint32_t inode_hashsize)
6.
{
7.
inode_table_t *new = NULL;
8.
uint32_t mem_pool_size = lru_limit;
9.
int ret = -1;
10.
int i = 0;
11.
12.
new = (void *)GF_CALLOC(1, sizeof(*new), gf_common_mt
_inode_table_t);
13.
if (!new)
14.
return NULL;
15.
16.
new->xl = xl;
17.
new->ctxcount = xl->graph->xl_count + 1;
18.
19.
new->lru_limit = lru_limit;
20.
new->invalidator_fn = invalidator_fn;
21.
new->invalidator_xl = invalidator_xl;
22.
23.
if (dentry_hashsize == 0) {
24.
/* Prime number for uniform distribution */
25.
new->dentry_hashsize = 14057;
26.
} else {
27.
new->dentry_hashsize = dentry_hashsize;
28.
}
29.
30.
if (inode_hashsize == 0) {
31.
32.
new->inode_hashsize = 65536;
33.
} else {
34.
new->inode_hashsize = inode_hashsize;
35.
}
36.
37.
38.
if (!mem_pool_size || (mem_pool_size > DEFAULT_INODE_
MEMPOOL_ENTRIES))
39.
mem_pool_size = DEFAULT_INODE_MEMPOOL_ENTRIES;
40.
41.
new->inode_pool = mem_pool_new(inode_t, mem_pool_size)
;
42.
if (!new->inode_pool)
43.
goto out;
44.
剩余20页未读,继续阅读
Unique先森
- 粉丝: 25
- 资源: 327
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0