重命名期间是否有文件 "doesn't exist" 的时刻?
Is there a moment where a file "doesn't exist" during a rename?
我们有一个黑盒第三方 Java 程序,可以从某个位置获取输入文件并生成 PDF。对于每个输入,它每次都会将一个清单文件放在相同的位置,这需要我们以受控的方式提供文件。清单(或 .xen/.que)是否仍然存在?不要提供输入文件。
我们的提要脚本出现了非常罕见的(成千上万个文件中的一个)实例,找不到任何东西,提要文件,以及清单被覆盖且内容不匹配时产生的错误.我写了一个 perl 脚本,除了将时间打印到 100-thousandths 之外什么都不做,glob 我们关心的目录中的任何内容,然后打印它。下面您可以看到 .xen 和 .que 文件,其中 .xen 是输入,.que 是它的重命名版本以指示处理。
那么我的问题是:94.26493怎么会缺少文件呢? OS 在重命名时是否隐藏文件?当 feed 程序在那一刻寻找文件时,我们遇到了问题,所以我计划的 hack 是检查文件两次;希望足够慢以赶上重命名的两端。我还应该指出,一旦 2 个文件出现在一行中,那就是 feed 程序将另一个文件放入的位置。它与重命名之前的文件不同。
1421417394.26392/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen
1421417394.26416/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen
1421417394.26442/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen
1421417394.26468/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen
1421417394.26493
1421417394.26907/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265
1421417394.27426/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265
1421417394.27456/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265
1421417394.27486/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265
1421417394.27528/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265
实际的guarantee in POSIX是,如果你将a
重命名为b
,而b
已经存在,那么在重命名的过程中没有时间点,当b
不存在。它将引用以前存在的 b
或以前称为 a
的新 b
。
如果 b
尚不存在(在您的示例中似乎就是这种情况),则保证不适用。有可能有 a
和 b
都不存在的时刻(这取决于特定文件系统的工作方式)。也有可能 a
和 b
都存在(并且引用同一个文件)。
您提出的以短延迟检查两次的解决方案可能是最简单的方法。
我们有一个黑盒第三方 Java 程序,可以从某个位置获取输入文件并生成 PDF。对于每个输入,它每次都会将一个清单文件放在相同的位置,这需要我们以受控的方式提供文件。清单(或 .xen/.que)是否仍然存在?不要提供输入文件。
我们的提要脚本出现了非常罕见的(成千上万个文件中的一个)实例,找不到任何东西,提要文件,以及清单被覆盖且内容不匹配时产生的错误.我写了一个 perl 脚本,除了将时间打印到 100-thousandths 之外什么都不做,glob 我们关心的目录中的任何内容,然后打印它。下面您可以看到 .xen 和 .que 文件,其中 .xen 是输入,.que 是它的重命名版本以指示处理。
那么我的问题是:94.26493怎么会缺少文件呢? OS 在重命名时是否隐藏文件?当 feed 程序在那一刻寻找文件时,我们遇到了问题,所以我计划的 hack 是检查文件两次;希望足够慢以赶上重命名的两端。我还应该指出,一旦 2 个文件出现在一行中,那就是 feed 程序将另一个文件放入的位置。它与重命名之前的文件不同。
1421417394.26392/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen
1421417394.26416/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen
1421417394.26442/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen
1421417394.26468/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen
1421417394.26493
1421417394.26907/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265
1421417394.27426/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265
1421417394.27456/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265
1421417394.27486/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265
1421417394.27528/gpfs/fsdd/projects/corr_esch/corr_esch.d.xen /gpfs/fsdd/projects/corr_esch/corr_esch.d.xen.que_142_1421417394265
实际的guarantee in POSIX是,如果你将a
重命名为b
,而b
已经存在,那么在重命名的过程中没有时间点,当b
不存在。它将引用以前存在的 b
或以前称为 a
的新 b
。
如果 b
尚不存在(在您的示例中似乎就是这种情况),则保证不适用。有可能有 a
和 b
都不存在的时刻(这取决于特定文件系统的工作方式)。也有可能 a
和 b
都存在(并且引用同一个文件)。
您提出的以短延迟检查两次的解决方案可能是最简单的方法。