前言
在源码中,特地有个枚举是表示FileType1
2
3
4
5
6
7
8
9
10public 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
似乎没用到