怎么能写出可靠地数据持久化引擎?假如你是基于VFS来做,那么下面这几点posix规范下的问题点很重要。
- 保证持久化的话,需要调用fsync。但也不是百分百OK,fsync只能保证数据到达了disk,由于disk有缓存,如果是write back(写缓存异步刷)而非write through(直写持久化)的策略,断电是不一定持久化了的。但企业硬盘特别是RAID卡一般都有备用保护电池。另外,也有指令刷缓存,ext4默认会保证刷缓存。所以ext4的fsync是安全的,别的不一定需要调查。
- close无论是c标准库的还是posix的都是不安全的,默认没有数据会在close前持久化的语义。
- 新建一个文件,写一些数据fsync之后不代表文件就一定存在了。它本身确实存在了,但不一定能被索引到,因为其父目录的目录项可能还在缓存中没有持久化。所以想百分百保证这个文件的持久化需要fsync其父目录一下。
- rename一个文件,系统调用成功了不代表父的目录项元数据真的持久化了,需要fsync其父目录才行。
转载请附链接:https://blog.csdn.net/maxlovezyy/article/details/100254353