如果 DRA 存储桶的内容不可用,gsutil 命令会发生什么情况?

What will happen with a gsutil command if a DRA bucket's contents are unavailable?

我经常使用 DRA (Durable Reduced Availability) bucket and I perform the gsutil rsync 命令 upload/download 文件 to/from 存储桶。

由于文件) 可能不可用(因为 DRA),当遇到这种情况时 gsutil rsync 会话期间究竟会发生什么?

  1. gsutil 是否会等到不可用的文件变得可用并完成任务,从而始终从存储桶中下载所有内容?
  2. 或者 gsutil 是否会在退出时出现关于某个文件不可用的警告,如果是这样的话,到底使用了什么输出(以便我可以编写脚本来查找此类消息)?
  3. 在发现文件不可用的会话中,return 命令的 gsutil 代码是什么?

我需要 100% 确定我从存储桶中下载了所有内容,我猜在下载数百 GB 的数据时很难跟踪。如果 gsutil rsync 在没有下载不可用文件的情况下完成,是否可以构造一个命令来重试不可用文件,直到所有此类文件都已成功下载?

我对一个项目做了一些测试,但无法gsutil抛出任何错误。 Afaik,gsutil 在目录级别运行,它不是在寻找特定文件。

当您 运行 时,例如 $ gsutil rsync local_dir gs://bucket ,gsutil 不需要任何特定文件,它只会获取您在 "local_dir" 中的任何内容并将其上传到 gs://bucket , 所以 :

  1. gsutil 不会等待,它会完成。

  2. 您不会收到任何错误 - 我收到的唯一错误是本地目录或存储桶完全丢失。

  3. 如果,假设文件在 local_dir 上丢失,但它在存储桶中可用,然后你 运行 $ gsutil rsync -r local_dir gs://bucket,那么什么都没有将在桶中改变。使用“-d”选项,文件将在存储桶端被删除。

作为建议,您可以每天或晚上几次向 运行 gstuil 命令添加一个 crontab 条目。

另一种方法是创建一个简单的脚本并将其添加到您的 crontab 中,每隔一小时左右 运行。这将检查您的文件是否存在,如果存在,它将 运行 gsutil 命令:

#!/bin/bash
FILE=/home/user/test.txt

if [ -f $FILE ];
then
   echo "file exists..or something"
else
   gsutil rsync /home/user gs://bucket
fi

更新:

我想这可能是您所需要的。在 ~/ 你应该有一个 .boto 文件。

~$ more .boto | grep max
# num_retries = <integer value>
# max_retry_delay = <integer value> 

取消注释这些行并添加您的号码。默认为 6 次重试,因此您可以执行 24 次重试之类的操作,并在两者之间放置 3600 次。这在理论上应该始终保持循环。

希望这对您有所帮助!

  1. 如果您的文件超过可恢复阈值(从 4.7 开始,这是 8MB),任何可用性问题都将根据 num_retriesmax_retry_delay 配置变量以指数退避重试。如果文件小于阈值,则不会重试(这将在 4.8 中改进,因此小文件也可以重试)。
  2. 如果任何文件未能成功传输,gsutil 将停止并根据遇到的失败输出异常。如果您使用的是 gsutil -m rsyncgsutil rsync -C,gsutil 将在出现错误时继续,最后,您将收到带有消息 'N file(s)/object(s) could not be copied/removed'
  3. 的 CommandException
  4. 如果重试次数已用尽and/or发生#2 中描述的任一失败情况,退出代码将为非零。

为了确保从存储桶中下载所有文件,您可以简单地重新运行 gsutil rsync,直到获得非零退出代码。

请注意 gsutil rsync 依赖于列出对象。 Google Cloud Storage 中的列表是最终一致的。因此,如果您将文件上传到存储桶,然后立即 运行 gsutil rsync,您可能会错过新上传的文件,但 gsutil rsync 的下一个 运行 应该选择它们向上。