Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'db/post_migrate/20190418132125_populate_project_statistics_packages_size.rb')
-rw-r--r--db/post_migrate/20190418132125_populate_project_statistics_packages_size.rb46
1 files changed, 46 insertions, 0 deletions
diff --git a/db/post_migrate/20190418132125_populate_project_statistics_packages_size.rb b/db/post_migrate/20190418132125_populate_project_statistics_packages_size.rb
new file mode 100644
index 00000000000..a6bee3453c1
--- /dev/null
+++ b/db/post_migrate/20190418132125_populate_project_statistics_packages_size.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+class PopulateProjectStatisticsPackagesSize < ActiveRecord::Migration[5.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ class ProjectStatistics < ActiveRecord::Base
+ self.table_name = 'project_statistics'
+ end
+
+ def up
+ stats_ids = ProjectStatistics.joins(
+ <<~SQL.strip_heredoc
+ INNER JOIN projects ON projects.id = project_statistics.project_id
+ INNER JOIN packages_packages ON packages_packages.project_id = projects.id
+ INNER JOIN packages_package_files ON packages_package_files.package_id = packages_packages.id
+ SQL
+ ).distinct.select(:id)
+
+ packages_size = Arel.sql(
+ '(SELECT SUM(size) FROM packages_package_files ' \
+ 'JOIN packages_packages ON packages_packages.id = packages_package_files.package_id ' \
+ 'WHERE packages_packages.project_id = project_statistics.project_id)'
+ )
+ update_column_in_batches(:project_statistics, :packages_size, packages_size) do |table, query|
+ query.where(table[:id].in(stats_ids))
+ end
+
+ storage_size = Arel.sql('(repository_size + lfs_objects_size + build_artifacts_size + COALESCE(packages_size, 0))')
+ update_column_in_batches(:project_statistics, :storage_size, storage_size) do |table, query|
+ query.where(table[:id].in(stats_ids))
+ end
+ end
+
+ def down
+ storage_size = Arel.sql('(repository_size + lfs_objects_size + build_artifacts_size)')
+ update_column_in_batches(:project_statistics, :storage_size, storage_size) do |table, query|
+ query.where(table[:packages_size].gt(0))
+ end
+
+ update_column_in_batches(:project_statistics, :packages_size, nil)
+ end
+end