我在 Centos 5 上运行的 C++ 应用程序中遇到如下问题:
在机器 A 上有一个来自机器 C 的 NFS 安装驱动器,其中包含一个文件:
/nfs/mounted/drive/path/directory/file
我的应用程序从机器 A 重命名目录:
mv /nfs/mounted/drive/path/directory /nfs/mounted/drive/path/directory.old
机器 A 上的应用程序然后 ssh(s) 到机器 B 以运行我创建的应用程序,该应用程序首先检查文件是否存在:
/nfs/mounted/drive/path/directory/file
发现文件存在(这是一个竞争条件,机器 B 仍然看到旧状态),因此机器 B 继续进行,就好像文件存在一样,但随后机器 B 在打开文件时失败,并且它不是真的存在。
sync()
在检查文件之前,我尝试通过在机器 B 上调用我的应用程序来解决此问题。我也尝试过这样做echo 2 > /proc/sys/vm/drop_caches
,但这些都没有导致我在机器 B 上的应用程序立即看到文件的当前状态消失了。
在机器 B 上的 C++ 应用程序检查文件以确保数据是最新状态之前,我可以在它执行什么操作?我不想通过打开它来明确测试有问题的文件,而是希望使磁盘处于当前状态。我想从 C++ 以相对快速的方式进行这种强制同步,因为所用时间不到四分之一秒。