btrfs连载(一) test目录代码走读之extent-buffer-test.c

来源:互联网 发布:单片机设计项目 编辑:程序博客网 时间:2024/04/28 01:15

概述:本文作为ceph-btrfs块存储系类的第一遍文章,没想有什么大的出息,只作为记录,而且的确很多的地方不明白希望找到志同道合者共同解疑,本系列的文章都会围绕ceph以及btrfs这两部分展开,首先从btrfs开始,对于btrfs的简要描述不在重复,只求共同弄明白btrfs这个基于btree为基础存储metadata而设计的filesystem的技术细节,并且如果有能力深入,弄明白基于btree的cow机制如何实现metadata的cow。

第一章,首先从btrfs的基础test目录开始,从这个test目录,我们可以很清楚地知道btrfs各个模块到底提供了那些主要的interface供其他模块使用,对于了解btrfs的软件层次以及各个层次的interface是有大帮助的,其次,通过这些主要的interface的测试用例也可以大致了解到这些模块实现的基本功能以及数据结构和设计思想。

本章首先展开讲述extent-buffer-test.c这个文件,这个c文件主要提供的interface测试为:

setup_items_for_insert

write_extent_buffer

read_extent_buffer

等;

针对这个extent_buffer测试首先我们得弄明白什么是extent_buffer。btrfs通过btree来管理各种元数据,比如inode、目录项,等。这些B+树的每一个节点(包括叶子节点和上层节点)都存储在一个单位的extent中。extent_buffer,即是extent在内存中的缓冲,它是btrfs文件系统磁盘空间管理的核心,每次要读取元数据或者要向磁盘写入元数据,则通常先先将数据读入extent_buffer或者向extent_buffe写入数据。

下图让我们看看extent数据的具体结构


详细内容请移步官方wikibtrfs.wiki.kernel.org/index.php/btrfs_design


因此,extent就是btree的管理单元,区分上层节点和叶子节点的区别,首先让我们看看整体的测试代码包含alloc write 以及read:

// please read follow explain, at here, path is the key words, path->nodes[BTRFS_MAX_LEVEL] means the btree structure in this

// code is 8 level deep btree, the longest read for an block's cost is 8 * 15ms, mostly, cost 10ms as metadata has already read into buffer cache.

// 这个setup item for insert 函数包含具体的对整个btree的操作,具体就是针对extent的item部分进行操作,extent节点如果非叶子节点item中只包含key和location对,
 // 如果是叶子节点extent就是包含item以及data的对应关系让我们来看看extent_buffer是如何构造的。

最重要的函数:

alloc_dummy_extent_buffer

setup_items_for_insert

write_extent_buffer

read_extent_buffer


// nodesize is the data size already exsit in node->pages

这其中最重要的应该算是setup_items_for_insert,接下来的分析我们将单独开一个页来讲解这个函数


0 0
原创粉丝点击