多年来,我们在迁移到 S3 的过程中看到了许多问题,包括恢复备份时的隐式迁移。
EXCEPTION: 8 个帖子未重新映射到新的 S3 上传 URL。 数据库 'default' 的 S3 迁移失败。
许多例子中的一些:
- False positives on "posts are not remapped to new S3 upload URL"
- Restore process cancelled at migrating uploads to S3 step
- Restore to New Host
今天,我遇到了另一个这样的问题,因为是星期五,我决定深入研究一下,而不是简单地注释掉检查。
所以我们有以下情况:
- 我们在多站点上
- 假设
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/
这意味着
cdn_path是新目标路径的子字符串- 因此
Post.where("cooked LIKE '%#{cdn_path}%'").count将始终找到帖子 - 它会虚报警报并退出
