summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/gitlab/background_migration/backfill_project_repositories.rb37
-rw-r--r--spec/support/shared_examples/lib/gitlab/background_migration/backfill_project_repositories_examples.rb4
2 files changed, 31 insertions, 10 deletions
diff --git a/lib/gitlab/background_migration/backfill_project_repositories.rb b/lib/gitlab/background_migration/backfill_project_repositories.rb
index 2a7f10c21e1..d03ad813d9e 100644
--- a/lib/gitlab/background_migration/backfill_project_repositories.rb
+++ b/lib/gitlab/background_migration/backfill_project_repositories.rb
@@ -99,10 +99,12 @@ module Gitlab
end
end
+ # Route model
class Route < ActiveRecord::Base
+ belongs_to :source, inverse_of: :route
end
- # Namespace model.
+ # Namespace model
class Namespace < ActiveRecord::Base
self.table_name = 'namespaces'
self.inheritance_column = nil
@@ -111,12 +113,10 @@ module Gitlab
belongs_to :parent, class_name: 'Namespace', inverse_of: 'namespaces'
+ has_one :route, -> { where(source_type: 'Namespace') }, inverse_of: :source, foreign_key: :source_id
+
has_many :projects, inverse_of: :parent
has_many :namespaces, inverse_of: :parent
-
- def route
- Route.find_by(source_type: 'Namespace', source_id: self.id)
- end
end
# ProjectRegistry model
@@ -141,6 +141,7 @@ module Gitlab
belongs_to :parent, class_name: 'Namespace', foreign_key: :namespace_id, inverse_of: 'projects'
+ has_one :route, -> { where(source_type: 'Project') }, inverse_of: :source, foreign_key: :source_id
has_one :project_repository, inverse_of: :project
delegate :disk_path, to: :storage
@@ -172,10 +173,6 @@ module Gitlab
end
end
- def route
- Route.find_by(source_type: 'Project', source_id: self.id)
- end
-
def storage
@storage ||=
if hashed_storage?
@@ -192,7 +189,11 @@ module Gitlab
end
def perform(start_id, stop_id)
+ ActiveRecord::Base.logger = Logger.new(STDOUT)
+
Gitlab::Database.bulk_insert(:project_repositories, project_repositories(start_id, stop_id))
+
+ ActiveRecord::Base.logger = nil
end
private
@@ -203,13 +204,31 @@ module Gitlab
end
def project_repositories(start_id, stop_id)
+# .eager_load(:route, :parent, parent: [:route])
+# .includes(:parent, :route, parent: [:route]).references(:namespaces)
+# .includes(:parent).references(:namespaces)
+# .joins(*routes_joins).references(:routes)
+
+
projects
.without_project_repository
+ .includes(:route, parent: [:route]).references(:routes)
+ .includes(:parent).references(:namespaces)
.where(id: start_id..stop_id)
.map { |project| build_attributes_for_project(project) }
.compact
end
+ def routes_joins
+ routes = Route.arel_table
+ projects = Project.arel_table
+ routes_projects = routes.alias('routes_projects')
+
+ projects.join(routes, Arel::Nodes::OuterJoin).on(projects[:namespace_id].eq(routes[:source_id]).and(routes[:source_type].eq('Namespace')))
+ .join(routes_projects, Arel::Nodes::OuterJoin).on(projects[:id].eq(routes_projects[:source_id]).and(routes_projects[:source_type].eq('Project')))
+ .join_sources
+ end
+
def build_attributes_for_project(project)
{
project_id: project.id,
diff --git a/spec/support/shared_examples/lib/gitlab/background_migration/backfill_project_repositories_examples.rb b/spec/support/shared_examples/lib/gitlab/background_migration/backfill_project_repositories_examples.rb
index 1f688c0f9d3..dcf7c1a90c2 100644
--- a/spec/support/shared_examples/lib/gitlab/background_migration/backfill_project_repositories_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/background_migration/backfill_project_repositories_examples.rb
@@ -32,11 +32,13 @@ shared_examples 'backfill migration for project repositories' do |storage|
it 'inserts rows in a single query' do
projects.create!(name: 'foo', path: 'foo', namespace_id: group.id, storage_version: storage_version, repository_storage: shard.name)
+ group2 = namespaces.create!(name: 'gro', path: 'gro')
control_count = ActiveRecord::QueryRecorder.new { described_class.new.perform(1, projects.last.id) }
projects.create!(name: 'bar', path: 'bar', namespace_id: group.id, storage_version: storage_version, repository_storage: shard.name)
- projects.create!(name: 'zoo', path: 'zoo', namespace_id: group.id, storage_version: storage_version, repository_storage: shard.name)
+ projects.create!(name: 'top', path: 'top', namespace_id: group.id, storage_version: storage_version, repository_storage: shard.name)
+ projects.create!(name: 'zoo', path: 'zoo', namespace_id: group2.id, storage_version: storage_version, repository_storage: shard.name)
expect { described_class.new.perform(1, projects.last.id) }.not_to exceed_query_limit(control_count)
end