我的问题可能是由于我对谷歌存储的全球一致性产生了误解,但由于我直到最近(11 月中旬)才遇到这个问题,现在它似乎很容易重现,我想澄清一下。该问题开始发生在使用 bdutil 在计算引擎上运行的一段 spark 代码中,但我可以使用 gsutil 从命令行重现。
我的代码正在删除目标路径,然后立即将源路径重命名为目标路径。由于目标路径不再存在,我希望具有全局一致性,src 将被重命名为目标,但是 src 被嵌套在目标内部,就好像目标仍然存在并且不一致。
重现的 hadoop 代码如下所示:
fs.delete(new Path(dest), true)
fs.rename(new Path(src), new Path(dest))
从命令行我可以重现:
gsutil -m rm -r gs://mybucket/dest
gsutil -m cp -r gs://mybucket/src gs://mybucket/dest
如果原因是因为列表操作最终一致并且FileSystem实现是使用列表操作来确定目标是否仍然存在,那么我明白了,那么有没有推荐的解决方案来确保在重命名之前目标不再存在?
谢谢,卢克