这是wiredtiger
的第一个提交。
0. 项目依赖安装
MacOS
brew install autoconf automake libtool
Posix
apt-get install build-essential autoconf automake libtool
1. 构建系统
1.1 GNU Autotools构建系统概述
首先wiredtiger
采用GNU Autotools
构建系统构建整个项目, 这是一套用于生成跨平台Makefile
的工具链, 主要包括:
- Autoconf: 生成
configure
脚本. - Automake: 生成
Makefile.in
模板. - Libtool: 处理共享库的创建.
1.2 构建系统的关键文件
configure.ac
- 项目的主要配置文件
- 定义项目信息(名称、版本、联系方式等)
- 检查编译器和必要依赖工具
- 配置头文件和输出文件
Makefile.am
- 有
Make.base
和动态生成的内容组合而成 - 定义源文件列表
- 设置变异选项和依赖关系
reconf脚本
- 重新生成构建系统文件
- 清理旧的构建文件
- 初始化标准的
automake
文件 - 生成
Makefile.am
1.3 构建过程
构建过程如下图所示:
1.4 关键构建工具的作用
- aclocal
- 收集所有m4宏定义
- 生成aclocal.m4文件
- autoconf
- 处理configure.ac
- 生成configure脚本
- automake
- 读取Makefile.am
- 生成Makefile.in
- configure
- 检测系统特性
- 生成最终的Makefile
1.5 构建
$ cd build_posix
$ chmod +x ./reconf
$ ./reconf
$ ./configure
$ make
注:
目前这个版本还编译不过, 应该是本次提交只是第一次将基础文件进行提交。
2. 源码部分
tree . ├── inc_posix │ ├── cache.h │ ├── fh.h │ ├── misc.h │ ├── queue.h │ ├── wiredtiger.in │ └── wt_internal.in └── os_posix └── os_rw.c
2.1. inc_posix
2.1.1 cache.h 缓存管理
存储引擎的缓存管理模块定义文件,其主要要实现的功能如下:
- 缓存策略定义
- 缓存结构体
- 缓存操作接口 (局限于语言, 这个项目是C语言编写的)
本次提交cache.h
文件之定义了如下几个结构体,并没有具体写成员:
__db_internal
数据库句柄结构内部版本__dbc_internal
游标句柄结构的内部版本__env_internal
数据库环境句柄结构的内部版本
2.1.2 fh.h 文件句柄
主要内容:
- 文件操作抽象
- 文件句柄结构定义
这个提交主要定义了一个posix
平台的文件句柄结构, 其定义如下:
struct __wt_fh_t {
char *name; /* File name(文件名称) */
int fd; /* POSIX file handle (posix的文件句柄)*/
TAILQ_ENTRY(__wt_fh_t) q; /* List of open handles (将这个结构组织为链表结构)*/
WT_STAT_DECL(read_count); /* Statistics (统计数据, 用于性能监控)*/
WT_STAT_DECL(write_count);
};
2.1.3 misc.h 杂项功能
主要内容:
- 通用工具函数
- 辅助宏定义
首先,定义了数据基本块
的大小为512字节, 并且存储在一个32bit的变量中, 其定义如下:
#define WT_BLOCK_SIZE 512
然后,定义一个工具宏, 在给定块个数时返回块的字节数:
#define WT_BLOCKS_TO_BYTES(blocks) (blocks) * WT_BLOCK_SIZE
定义这个的原因是块的大小不是固定512
byte的, 如果以后需要改变, 那么在需要计算块大小的地方无需再进行更改.
接着, 作者又定义了一个统计数据类型, 并提供了类型定义方法:
// 只有没有调用--disable_statistics时才生效, 在options.m4中.
#ifdef HAVE_STATISTICS
#define WT_STAT_DECL(v) wt_stat_t v
#define WT_STAT(v) v
typedef u_int64_t wt_stat_t;
else
#define WT_STAT_DECL(v)
#deifne WT_STAT(v)
#endif
2.1.4 queue.h 队列实现
拷贝的FreeBSD
开源队列实现.
2.1.5 wiredtiger.in 公共API模板
主要内容:
- 外部接口定义
- 数据类型声明
- API函数声明
.in
文件是一个模板文件,在configyre.ac
的autoconf
的宏中,将这个.in
文件映射为.h
文件:
AC_CONFIG_FILES([
Makefile
wiredtiger.h:../inc_posix/wiredtiger.in
wt_internal.h:../inc_posix/wt_internal.in])
AC_OUTPUT
在执行,.configure
时, 会讲.in
文件中的所有宏进行替换.
2.1.6 wt_internal.in 内部API模板
- 内部数据结构
- 内部函数声明
目前这个模板文件的内容和cache.h
中基本一致, 可能cache.h
在后续版本中要引入wt_internal.h
。
2.2 os_posix
os_rw.c posix读写操作
- 文件读写实现
- 系统调用封装
- 错误处理
本次提交os_rw.c
中定义了如下两个函数:
- __wt_read
int __wt_read(ENV_INTERNAL *env, /** 环境句柄 */ WT_FH *fh, /** 文件句柄 */ u_int32_t block_number, /** 起始块号 */ u_int32_t blocks, /** 要读取的块数 */ void *buf, /** 输出缓冲区 */ ssize_t *bytes_read_ret /** 实际读取的字节数 */ )
- __wt_write
int __wt_write(ENV_INTERNAL *env, /** 环境句柄 */ WT_FH *fh, /** 文件句柄 */ u_int32_t block_number, /** 起始块号 */ u_int32_t blocks, /** 要写入的块数 */ void *buf, /** 输入缓冲区 */ ssize_t *bytes_written_ret /** 实际写入的字节数 */ )
3.总结
以上就是大名鼎鼎的wiredtiger
的首次提交的主要内容了, 这次提交不是一个可编译的版本, 只是进行了针对于平台的简单定义与函数实现, 可以说还和数据库存储引擎没有任何关系;由于作者实现这个引擎是在08年左右,使用了较为古早的autotools
进行构建, 虽说其可以灵活配置和修改,但复杂程度远超cmake
工程, 增加了学习的难度。
注释源码同步仓库:https://github.com/ULis3h/wiredtiger_1.0.0_reading