WiredTiger 1.0.0 源码阅读01.commit_1f62f73

Today is new!

By ULis3h

这是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 关键构建工具的作用

  1. aclocal
    • 收集所有m4宏定义
    • 生成aclocal.m4文件
  2. autoconf
    • 处理configure.ac
    • 生成configure脚本
  3. automake
    • 读取Makefile.am
    • 生成Makefile.in
  4. 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

定义这个的原因是块的大小不是固定512byte的, 如果以后需要改变, 那么在需要计算块大小的地方无需再进行更改.

接着, 作者又定义了一个统计数据类型, 并提供了类型定义方法:

// 只有没有调用--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.acautoconf的宏中,将这个.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

Share: X (Twitter) Facebook LinkedIn