从 java 轮询 NFS 共享会破坏文件系统
Posted
技术标签:
【中文标题】从 java 轮询 NFS 共享会破坏文件系统【英文标题】:Polling NFS share from java breaks filesystem 【发布时间】:2011-03-14 13:50:24 【问题描述】:我们有两个服务器,每个服务器都有一个通过 NFS 映射到它们的目录。
服务器 A 上的进程(shell 脚本)将文件放入映射驱动器。
服务器 B 上的 Java 进程定期轮询映射的驱动器并在找到文件后立即处理该文件。处理文件后 - 它被重命名(然后由服务器 A 上的 cron 进程删除)
该文件是一个小的 .properties 文件。在几个周期内一切正常。之后,服务器 A 和服务器 B 开始以不同的方式查看映射驱动器的内容。我们禁用了 NFS 缓存和属性查找。问题依然存在。
如果我去一个视野不好的服务器并这样做:
ls
我会看到停滞的文件。但是,如果我再做一次 - 会打印正确的文件列表。
我们将不胜感激有关此问题的任何帮助。
【问题讨论】:
【参考方案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();
如果您知道此解决方法背后的机制 - 请分享!
【讨论】:
【参考方案2】:使用哪个 NFS 服务器?如果该服务器支持文件更改通知,您可以使用它而不是轮询。
【讨论】:
其实我不确定 - 需要检查 NFS 服务器。我一到办公室就会这样做。你说的通知是什么意思?它会以某种方式通知 java 进程有一个新文件吗? 是的,任何程序都可以注册以获取文件更改或目录中新文件的通知。 我们使用 NFSv3。很遗憾,没有通知。【参考方案3】:您禁用了哪种缓存? NFS 支持目录条目缓存,请参阅nfs Linux man page 中的选项acdirmin
和acdirmax
。或同一手册中的“数据和元数据一致性”一章。
【讨论】:
以上是关于从 java 轮询 NFS 共享会破坏文件系统的主要内容,如果未能解决你的问题,请参考以下文章