技术解析
在创建文件、重命名等需要修改目录文件的文件列表数据的操作之后,需要不需要进行 sync directory 呢?
具体到 LevelDB 的实现,在 flush manifest 文件的时候,会进行 sync directory 操作,大致原因在注释中有提到,是为了确保 manifest 中引用的文件在文件系统中存在。
然而在创建 WAL 文件时,并没有任何 sync directory 的操作。如此,是否会因为服务器宕机造成数据丢失呢?虽然现有的日志文件系统似乎可以通过重做日志恢复文件系统的元信息。那在非日志文件系统上,岂不是凉凉?
LevelDB 创建 WAL 文件的代码: https://github.com/google/leveldb/blob/6721eda0b46654d3531b4a0a00c90dc659b337d6/db/db_impl.cc#L1360
LevelDB flush manifest 文件的代码: https://github.com/google/leveldb/blob/6721eda0b46654d3531b4a0a00c90dc659b337d6/util/env_posix.cc#L306