dfdfa913ba
- Add two new ActiveRecord models: - RootNamespaceStoragestatistics will persist root namespace statistics - NamespaceAggregationSchedule will save information when a new update to the namespace statistics needs to be scheduled - Inject into UpdateProjectStatistics concern a new callback that will call an async job to insert a new row onto NamespaceAggregationSchedule table - When a new row is inserted a new job is scheduled. This job will update call an specific service to update the statistics and after that it will delete thee aggregated scheduled row - The RefresherServices makes heavy use of arel to build composable queries to update Namespace::RootStorageStatistics attributes. - Add an extra worker to traverse pending rows on NAmespace::AggregationSchedule table and schedule a worker for each one of this rows. - Add an extra worker to traverse pending rows on NAmespace::AggregationSchedule table and schedule a worker for each one of this rows
38 lines
1.1 KiB
Ruby
38 lines
1.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Namespace::RootStorageStatistics < ApplicationRecord
|
|
STATISTICS_ATTRIBUTES = %w(storage_size repository_size wiki_size lfs_objects_size build_artifacts_size packages_size).freeze
|
|
|
|
self.primary_key = :namespace_id
|
|
|
|
belongs_to :namespace
|
|
has_one :route, through: :namespace
|
|
|
|
delegate :all_projects, to: :namespace
|
|
|
|
def recalculate!
|
|
update!(attributes_from_project_statistics)
|
|
end
|
|
|
|
private
|
|
|
|
def attributes_from_project_statistics
|
|
from_project_statistics
|
|
.take
|
|
.attributes
|
|
.slice(*STATISTICS_ATTRIBUTES)
|
|
end
|
|
|
|
def from_project_statistics
|
|
all_projects
|
|
.joins('INNER JOIN project_statistics ps ON ps.project_id = projects.id')
|
|
.select(
|
|
'COALESCE(SUM(ps.storage_size), 0) AS storage_size',
|
|
'COALESCE(SUM(ps.repository_size), 0) AS repository_size',
|
|
'COALESCE(SUM(ps.wiki_size), 0) AS wiki_size',
|
|
'COALESCE(SUM(ps.lfs_objects_size), 0) AS lfs_objects_size',
|
|
'COALESCE(SUM(ps.build_artifacts_size), 0) AS build_artifacts_size',
|
|
'COALESCE(SUM(ps.packages_size), 0) AS packages_size'
|
|
)
|
|
end
|
|
end
|