0%

LevelDB源码解析(一)- 文件类型与文件名

前言

在源码中,特地有个枚举是表示FileType

1
2
3
4
5
6
7
8
9
10
public enum FileType
{
LOG,
DB_LOCK,
TABLE,
DESCRIPTOR,
CURRENT,
TEMP,
INFO_LOG // Either the current one, or an old one
}

DB创建文件时将FileNumber加上特定的后缀作为文件名,FileNumber在内部是一个uint64_t类型,并且全局递增。不同类型的文件的拓展名不同,例如sstable文件是.sst,wal日志文件是.log。LevelDB有以下文件类型:

一. FileNumber

每个文件的文件名都是一个数字,文件类型用后缀区分,即使是不同的后缀,文件的FileNumer也不会重复。

所以FileNumber类似于数据库的主键一下,自增的进行分配。

在VersionSet的变量中:

1
private final AtomicLong nextFileNumber = new AtomicLong(2);

可以看到默认的FileNumber是从2开始的。

为什么不是从1开始,因为1默认是给第一个Manifest文件

如果是重启的应用:

FileNumber会被写到CURRENT文件中,在VersionSet::recover中读取CURRENT文件指向的Manifest文件时恢复出来。

对于recover方法,本质上是CURRENT和Manifest文件,下面再讲。

二. FileType

2.1 DB_LOCK文件

这个文件作为文件锁存在,文件名就叫LOCK,里面不会保存任何东西

2.2 TABLE文件

就是SSTable文件,以.sst结尾

2.3 LOG文件

类似于WAL文件,以.log结尾

注意,这里指的是文件类型,并不是文件格式。

项目中有个LogWriter类,这个生成的文件的文件格式相同,但是既可以作为LOG文件,又可以作为Manifest文件。

数据目录下只会有一个LOG文件,每次新启时,会将旧的删除,但是文件名中仍然带有FileNumber。

2.4 DESCRIPTOR

就是常说的Manifest文件,以MANIFEST-开头

每次Compact之后,都会产生当前Compact后SSTable文件的修改VersionEdit。

同时将VersionEdit文件的内容写入Append到Manifest文件。

2.5 CURRENT

文件名就叫CURRENT,里面的内容是当前的MANIFEST文件的文件名。

2.6 Temp

因为Log文件和Manifest文件都只有一个,在使用新的覆盖的时候,需要先创建一个Temp文件,然后再rename成真正的。

2.7 INFO_LOG

似乎没用到