0

我在 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++ 以相对快速的方式进行这种强制同步,因为所用时间不到四分之一秒。

4

1 回答 1

1

NFS 对每个文件系统对象都有一个文件句柄。当您重命名目录时,filemhandle 没有更改,并且查找会为您提供积极的结果。为了更好地避免这种情况,最好创建一个新目录,将所有文件和目录从原始目录移动并删除源目录。这样,您将使旧文件句柄无效。

于 2013-03-07T18:10:23.580 回答