Skip to content
Snippets Groups Projects

Migrate GitLab Pages to zip storage in the background

Compare and Show latest version
3 files
+ 77
5
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -37,19 +37,39 @@ class Project < ActiveRecord::Base
alias_attribute :parent_id, :namespace_id
has_one :pages_metadatum, class_name: 'ProjectPagesMetadatum', inverse_of: :project
has_many :pages_deployments, class_name: 'PagesDeployment'
def pages_path
File.join(Settings.pages.path, build_full_path)
end
def set_first_pages_deployment!(deployment)
ensure_pages_metadatum
# where().update_all to perform update in the single transaction with check for null
ProjectPagesMetadatum
.where(project_id: id, pages_deployment_id: nil)
.update_all(pages_deployment_id: deployment.id)
end
private
def ensure_pages_metadatum
pages_metadatum || create_pages_metadatum!
rescue ActiveRecord::RecordNotUnique
reset
retry
end
end
# copy class with only required code
class ProjectPagesMetadatum < ActiveRecord::Base
extend SuppressCompositePrimaryKeyWarning
self.primary_key = :project_id
self.table_name = 'project_pages_metadata'
self.inheritance_column = :_type_disabled
include EachBatch
belongs_to :project, inverse_of: :pages_metadatum, class_name: 'Project'
belongs_to :pages_deployment, class_name: 'PagesDeployment'
@@ -88,9 +108,25 @@ def set_size
end
def perform(start_id, stop_id)
ProjectPagesMetadatum.only_on_legacy_storage.where(id: start_id..stop_id).each do |metadatum|
ProjectPagesMetadatum.only_on_legacy_storage.where(project_id: start_id..stop_id).each do |metadatum|
migrate_project(metadatum.project)
end
end
def migrate_project(project)
result = nil
time = Benchmark.realtime do
result = ::Pages::MigrateLegacyStorageToDeploymentService.new(project, ignore_invalid_entries: true).execute
end
if result[:status] == :success
Gitlab::AppLogger.info("MigratingPagesToZipStorage: project_id: #{project.id} #{project.pages_path} has been migrated in #{time.round(2)} seconds")
else
Gitlab::AppLogger.error("MigratingPagesToZipStorage: project_id: #{project.id} #{project.pages_path} failed to be migrated in #{time.round(2)} seconds: #{result[:message]}")
end
rescue => e
Gitlab::AppLogger.error("MigratingPagesToZipStorage: project_id: #{project&.id} #{project&.pages_path} failed to be migrated: #{e.message}")
Gitlab::ErrorTracking.track_exception(e, project_id: project&.id)
end
end
end
Loading