枚举所有可用的变更日志记录

Posted

技术标签:

【中文标题】枚举所有可用的变更日志记录【英文标题】:Enumerating all available change journal records 【发布时间】:2013-04-07 10:41:49 【问题描述】:

我在枚举变更日志记录时遇到问题。

//my params    
READ_USN_JOURNAL_DATA read_journal_data;
read_journal_data.StartUsn = ... //next USN
read_journal_data.ReasonMask = 0xFFFFFFFF;
read_journal_data.ReturnOnlyOnClose = FALSE;
read_journal_data.UsnJournalID = ... //ID of current journal
read_journal_data.BytesToWaitFor = 9000;
read_journal_data.Timeout = 5; //5 seconds

BOOL result = DeviceIoControl(this->volume_handle_, FSCTL_READ_USN_JOURNAL,
         &read_journal_data, sizeof(read_journal_data), this->change_journal_data_buffer_,
         this->change_journal_data_buffer_, &this->valid_bytes_in_buffer_, NULL);

如您所见,Timeout 非零,BytesToWaitFor 也非零。 我明白当FSCTL_READ_USN_JOURNAL调用到达更改日志的末尾时,它必须等待Timeout秒然后返回所有(0个或更多) BytesToWaitFor 范围内的可用记录。但是,由于某种原因,我正在观察完全不同的行为:DeviceIoControlFSCTL_READ_USN_JOURNAL 和其他列出的参数可能需要几分钟 - 直到文件系统中发生了一些新的更改。 为什么READ_USN_JOURNAL_DATA.Timeout 不限制FSCTL_READ_USN_JOURNAL 请求的持续时间?

【问题讨论】:

【参考方案1】:

具体而言,它的行为与预期的行为完全相同:

在任何一种情况下,在超时期限之后,附加到更改日志的任何新数据都会被处理。如果仍然没有从指定集合返回的记录,则重复超时期限。在这种模式下,FSCTL_READ_USN_JOURNAL 保持未完成状态,直到至少返回一条记录或取消 I/O。

见MSDN, section Timeout

【讨论】:

谢谢...我只是误解了这些参数的用途。更多信息可以在here(超时和BytesToWaitFor)中找到 是的,这是对 NTFS 期刊的很好介绍。无论如何,关于 NTFS 期刊的相当全面的信息来源在这里:msdn.microsoft.com/en-us/library/aa363798.aspx

以上是关于枚举所有可用的变更日志记录的主要内容,如果未能解决你的问题,请参考以下文章

redo log buffer刷写变更日志到redo log的策略

redo log buffer刷写变更日志到redo log的策略

MySQL二进制日志总结

第9节 MySQL之BinLog日志

MySQL高可用架构的注意事项

LeetCode 1598. 文件夹操作日志搜集器:模拟 + 记录深度