【问题标题】:data integrity issue with ntfs but not ext3ntfs 但不是 ext3 的数据完整性问题
【发布时间】:2014-05-12 03:12:43
【问题描述】:

在我的应用程序中,我不断将数据写入 file1 并将其刷新到设备。在另一个线程中,我正在从 file1 读取数据并将其写入 file2

每次我对 file1 执行 fwrite + fflush 时,我都会向另一个线程发出信号以开始读取它。另一个线程从file1 中读取数据并将其转储到file2 中。很简单的逻辑。此外,每隔几分钟,我就会回到 file1 的开头并开始覆盖旧数据。

现在我的问题是,一旦我开始覆盖 file1 中的数据,读入 file2 的数据有时是旧数据(即在上一次迭代中写入的数据)甚至尽管写入器线程已经发出信号,它写入了新数据(并刷新了它)。

我正在 [C + linux + arm 平台] 上写入和读取固态驱动器(128 GB SAMSUNG 470 系列,如果有帮助的话)。我觉得处理器缓存有问题。也许 write 进入缓存,而 reader 线程的 read 来自闪存,因此是陈旧的数据。

这里的问题是,如果 SSD 使用 NTFS 格式化,则会出现此问题。如果我用 ext3 格式化它,问题就消失了。不幸的是,NTFS 是一项硬性要求。另一个有趣的观察是,如果我有两个阅读器线程,它们都会在不同的时刻获得陈旧的数据。

禁用 SSD 写入缓存后的事件(使用 hdparm -W0 /dev/sda1),我遇到了与 NTFS 相同的问题。一个多星期以来,我一直坚持这一点。

知道发生了什么,为什么会这样?

任何帮助都将物超所值......

编辑 原来 NTFS 驱动程序不喜欢我通过倒回文件指针来覆盖文件。这是众所周知的事情吗?

【问题讨论】:

  • 您是否尝试在线程一中以覆盖模式重新打开文件?另外,你如何在线程 2 中从 file1 读取数据,你是否重新打开了文件?
  • 您使用的是 ntfs-3g 还是内核中的 ntfs 驱动程序?
  • @Asad:不,我不重新打开文件,我只是倒带(fp)。我会试试你的建议。 @Bdonlan:我使用 tuxera 嵌入式 ntfs 驱动程序(商业)
  • 我不熟悉 Tuxera 驱动程序,但这听起来像是您正在使用的特定 NTFS 实现的错误。 SSD问题是一个暗示。如果这是在 Microsoft NTFS 驱动程序中,我们会密切关注。

标签: linux caching filesystems ntfs ext3


【解决方案1】:

好的,所以我自己发现了这个问题(而且这种情况很少发生!!!)。

我发现 C 库缓冲 (fread/fwrite) 存在问题。所以我在每个 fread() 之前做 fflush()。这解决了我的问题(我不知道驱动程序到底出了什么问题,但我假设从文件的同一位置读取时,C 库 I/O 函数的“读取”缓冲存在一些问题第二次)。

感谢@Asad Rasheed 和@jrtipton 的投入:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多