File system IO可靠性

怎么能写出可靠地数据持久化引擎?假如你是基于VFS来做,那么下面这几点posix规范下的问题点很重要。

  1. 保证持久化的话,需要调用fsync。但也不是百分百OK,fsync只能保证数据到达了disk,由于disk有缓存,如果是write back(写缓存异步刷)而非write through(直写持久化)的策略,断电是不一定持久化了的。但企业硬盘特别是RAID卡一般都有备用保护电池。另外,也有指令刷缓存,ext4默认会保证刷缓存。所以ext4的fsync是安全的,别的不一定需要调查。
  2. close无论是c标准库的还是posix的都是不安全的,默认没有数据会在close前持久化的语义。
  3. 新建一个文件,写一些数据fsync之后不代表文件就一定存在了。它本身确实存在了,但不一定能被索引到,因为其父目录的目录项可能还在缓存中没有持久化。所以想百分百保证这个文件的持久化需要fsync其父目录一下。
  4. rename一个文件,系统调用成功了不代表父的目录项元数据真的持久化了,需要fsync其父目录才行。

转载请附链接:https://blog.csdn.net/maxlovezyy/article/details/100254353

上一篇:浏览器是怎样向网卡发送数据的


下一篇:在stdout / stderr文件描述符上调用os.fsync将杀死一个子进程