迁移到 s3 失败 - 但只有检查失败

多年来,我们在迁移到 S3 的过程中看到了许多问题,包括恢复备份时的隐式迁移。

EXCEPTION: 8 个帖子未重新映射到新的 S3 上传 URL。 数据库 'default' 的 S3 迁移失败。

许多例子中的一些:

今天,我遇到了另一个这样的问题,因为是星期五,我决定深入研究一下,而不是简单地注释掉检查。

所以我们有以下情况:

  • 我们在多站点上
  • 假设 dbname 是此示例的数据库名称
  • 我们设置了 S3_CDN_URL
  • 我们没有设置 CDN_URL

这是在 /lib/file_store/to_s3_migration.rb 中发生的情况

首先这里决定前缀

prefix = @migrate_to_multisite ? "uploads/#{@current_db}/original/" : "original/"

然后文件上传到 s3,然后进行重新映射,这基本上是这个以及一些变体

        from = "/uploads/#{@current_db}/original/"
        to = "#{SiteSetting.Upload.s3_base_url}/#{prefix}"

所以在多站点中,这将重新映射

  • /uploads/dbname/original/
  • https://bucket-location-url.com/uploads/dbname/original/

然后最后进行检查

      cdn_path = SiteSetting.cdn_path("/uploads/#{@current_db}/original").sub(/https?:/, "")
      count = Post.where("cooked LIKE '%#{cdn_path}%'").count
      if count > 0
        error_message = "#{count} posts are not remapped to new S3 upload URL. #{failure_message}"
        raise_or_log(error_message, should_raise)
        success = false
      end

现在 SiteSetting.cdn_path 来自 lib/global_path.rb 并且如下所示

  def cdn_path(p)
    GlobalSetting.cdn_url.blank? ? p : "#{GlobalSetting.cdn_url}#{path(p)}"
  end

所以,如果我们有一个 S3 CDN 但没有常规的 CDN,那么 SiteSetting.cdn_path("/uploads/#{@current_db}/original") 将是 /uploads/dbname/original

并且,根据我们的重新映射,新的路径是 https://bucket-location-url.com/uploads/dbname/original/

这意味着

  1. cdn_path 是新目标路径的子字符串
  2. 因此 Post.where("cooked LIKE '%#{cdn_path}%'").count 将始终找到帖子
  3. 它会虚报警报并退出 :scream: :scream: :scream:
3 个赞