这是aof.c中函数末尾的代码片段flushAppendOnlyFile
,它将aof缓冲区写入磁盘。
/* Perform the fsync if needed. */
if (server.aof_fsync == AOF_FSYNC_ALWAYS) {
server.aof_last_fsync = server.unixtime;
} else if ((server.aof_fsync == AOF_FSYNC_EVERYSEC &&
server.unixtime > server.aof_last_fsync)) {
// Why create fsync job only while sync_in_progress is false?
if (!sync_in_progress) aof_background_fsync(server.aof_fd);
server.aof_last_fsync = server.unixtime;
}
Redis bio 为 fsync 实现了一个后台作业列表。函数aof_background_fsync
将一个新的 fsync 作业附加到列表中。
为什么 redis 只在此文件上创建 fsync 作业时才sync_in_progress
为假?如果sync_in_progress
为真,则有多个 fsync 作业等待执行。为什么redis拒绝在这种情况下附加这个fsync作业?
(这里是整个flushAppendOnlyFile 函数)