0

我们有两个服务器,每个服务器都有一个通过 NFS 映射到它们的目录。

服务器 A(shell 脚本)上的进程将文件放入映射驱动器。

服务器 B 上的 Java 进程定期轮询映射驱动器并在找到文件后立即处理该文件。处理文件后 - 它被重命名(然后由服务器 A 上的 cron'ed 进程删除)

该文件是一个小的 .properties 文件。在几个周期内一切正常。之后,服务器 A 和服务器 B 开始以不同的方式查看映射驱动器的内容。我们禁用了 NFS 缓存和属性查找。问题仍然存在。

如果我去一个视野不好的服务器并执行以下操作:

ls

我会看到停滞的文件。但是,如果我再做一次 - 打印正确的文件列表。

我们将不胜感激有关此问题的任何帮助。

4

3 回答 3

1

我的问题是,当使用计时器循环时,下面的命令会停止查看实际目录内容。它与 NFS 服务器不同步。

File[] files = dir.listFiles(new MyFileFilter() );

我得到的解决方案是请求故意不存在的文件。我假设这会使 NFS 客户端修复或刷新其状态。

// Key point is here: we ask NFS client to obtain unexisting file. Since the client
// cannot find it locally - it will make a call to the NFS server which will 
// fix client cache or whatever it uses locally when cache is disabled.
File temp = new File(dir, "unexisting.file");
temp.exists();

如果您知道此解决方法背后的机制 - 请分享!

于 2011-03-17T14:29:50.123 回答
0

您禁用了哪种缓存?NFS 支持目录条目缓存,请参见选项和acdirminnfs Linux 手册页。或同一手册中的“数据和元数据一致性”一章。acdirmax

于 2011-12-07T08:07:31.700 回答
0

使用哪个 NFS 服务器?如果该服务器支持文件更改通知,您可以使用它而不是轮询。

于 2011-03-14T14:40:33.263 回答