页面缓存行为保证和日志文件

页面缓存行为保证和日志文件

是否可以保证脏页何时以何种顺序写入磁盘?在日志结构文件(仅追加的文件)的特定情况下,脏页是否可能累积并无序写入磁盘?

例如,想象一个日志文件,其中累积了以下脏页......

1: file_offset=16kb page_len=4kb <-- dirty
2: file_offset=20kb page_len=4kb <-- dirty
3: file_offset=24kb page_len=4kb <-- dirty

Linux 是否会按顺序写出上述脏页,或者它们是否有可能被乱序写出?如果可能发生乱序写入,那么生成日志文件的数据库和应用程序如何处理这种情况?例如,如果第 3 页首先被写出,并且操作系统在写出第 1 和第 2 页之前崩溃,则会出现 8kb 文件洞。

答案1

Linux 是否会按顺序写出上述脏页,或者它们是否有可能被乱序写出?

我不知道。

如果可能发生乱序写入,那么生成日志文件的数据库和应用程序如何处理这种情况?

https://www.sqlite.org/atomiccommit.html#_dealing_with_garbage_writing_into_journal_files

SQLite 假设底层文件系统可以重新排序写入请求,并且页计数可以首先被烧成氧化物,即使其写入请求最后发生。因此,作为第二道防线,SQLite 还在回滚日志中的每页数据上使用 32 位校验和。如第 4.4 节所述,在回滚日志时,会在回滚期间对每个页面评估此校验和。如果发现错误的校验和,则放弃回滚。请注意,校验和并不能保证页面数据正确,因为即使数据损坏,校验和也可能正确的概率虽小但有限。但校验和至少使这种错误不太可能发生。

相关内容