diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-18 12:45:46 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-18 12:45:46 +0300 |
commit | a7b3560714b4d9cc4ab32dffcd1f74a284b93580 (patch) | |
tree | 7452bd5c3545c2fa67a28aa013835fb4fa071baf /app/models/namespaces | |
parent | ee9173579ae56a3dbfe5afe9f9410c65bb327ca7 (diff) |
Add latest changes from gitlab-org/gitlab@14-8-stable-eev14.8.0-rc42
Diffstat (limited to 'app/models/namespaces')
-rw-r--r-- | app/models/namespaces/sync_event.rb | 4 | ||||
-rw-r--r-- | app/models/namespaces/traversal/linear.rb | 11 | ||||
-rw-r--r-- | app/models/namespaces/traversal/linear_scopes.rb | 22 | ||||
-rw-r--r-- | app/models/namespaces/traversal/recursive_scopes.rb | 5 | ||||
-rw-r--r-- | app/models/namespaces/user_namespace.rb | 4 |
5 files changed, 42 insertions, 4 deletions
diff --git a/app/models/namespaces/sync_event.rb b/app/models/namespaces/sync_event.rb index 8534d8afb8c..fbe047f2c5a 100644 --- a/app/models/namespaces/sync_event.rb +++ b/app/models/namespaces/sync_event.rb @@ -13,4 +13,8 @@ class Namespaces::SyncEvent < ApplicationRecord def self.enqueue_worker ::Namespaces::ProcessSyncEventsWorker.perform_async # rubocop:disable CodeReuse/Worker end + + def self.upper_bound_count + select('COALESCE(MAX(id) - MIN(id) + 1, 0) AS upper_bound_count').to_a.first.upper_bound_count + end end diff --git a/app/models/namespaces/traversal/linear.rb b/app/models/namespaces/traversal/linear.rb index 757a0e40eb3..99a5b8cb063 100644 --- a/app/models/namespaces/traversal/linear.rb +++ b/app/models/namespaces/traversal/linear.rb @@ -43,14 +43,23 @@ module Namespaces included do before_update :lock_both_roots, if: -> { sync_traversal_ids? && parent_id_changed? } - after_create :sync_traversal_ids, if: -> { sync_traversal_ids? } after_update :sync_traversal_ids, if: -> { sync_traversal_ids? && saved_change_to_parent_id? } + # sync traversal_ids on namespace create, which can happen quite early within a transaction, thus keeping the lock on root namespace record + # for a relatively long time, e.g. creating the project namespace when a project is being created. + after_create :sync_traversal_ids, if: -> { sync_traversal_ids? && !sync_traversal_ids_before_commit? } + # This uses rails internal before_commit API to sync traversal_ids on namespace create, right before transaction is committed. + # This helps reduce the time during which the root namespace record is locked to ensure updated traversal_ids are valid + before_commit :sync_traversal_ids, on: [:create], if: -> { sync_traversal_ids? && sync_traversal_ids_before_commit? } end def sync_traversal_ids? Feature.enabled?(:sync_traversal_ids, root_ancestor, default_enabled: :yaml) end + def sync_traversal_ids_before_commit? + Feature.enabled?(:sync_traversal_ids_before_commit, root_ancestor, default_enabled: :yaml) + end + def use_traversal_ids? return false unless Feature.enabled?(:use_traversal_ids, default_enabled: :yaml) diff --git a/app/models/namespaces/traversal/linear_scopes.rb b/app/models/namespaces/traversal/linear_scopes.rb index 9f0f49e729c..09d69a5f77a 100644 --- a/app/models/namespaces/traversal/linear_scopes.rb +++ b/app/models/namespaces/traversal/linear_scopes.rb @@ -12,7 +12,7 @@ module Namespaces def as_ids return super unless use_traversal_ids? - select('namespaces.traversal_ids[array_length(namespaces.traversal_ids, 1)] AS id') + select(Arel.sql('namespaces.traversal_ids[array_length(namespaces.traversal_ids, 1)]').as('id')) end def roots @@ -53,7 +53,7 @@ module Namespaces end def self_and_descendants(include_self: true) - return super unless use_traversal_ids? + return super unless use_traversal_ids_for_descendants_scopes? if Feature.enabled?(:traversal_ids_btree, default_enabled: :yaml) self_and_descendants_with_comparison_operators(include_self: include_self) @@ -65,7 +65,7 @@ module Namespaces end def self_and_descendant_ids(include_self: true) - return super unless use_traversal_ids? + return super unless use_traversal_ids_for_descendants_scopes? if Feature.enabled?(:traversal_ids_btree, default_enabled: :yaml) self_and_descendants_with_comparison_operators(include_self: include_self).as_ids @@ -75,6 +75,12 @@ module Namespaces end end + def self_and_hierarchy + return super unless use_traversal_ids_for_self_and_hierarchy_scopes? + + unscoped.from_union([all.self_and_ancestors, all.self_and_descendants(include_self: false)]) + end + def order_by_depth(hierarchy_order) return all unless hierarchy_order @@ -109,6 +115,16 @@ module Namespaces use_traversal_ids? end + def use_traversal_ids_for_descendants_scopes? + Feature.enabled?(:use_traversal_ids_for_descendants_scopes, default_enabled: :yaml) && + use_traversal_ids? + end + + def use_traversal_ids_for_self_and_hierarchy_scopes? + Feature.enabled?(:use_traversal_ids_for_self_and_hierarchy_scopes, default_enabled: :yaml) && + use_traversal_ids? + end + def self_and_descendants_with_comparison_operators(include_self: true) base = all.select( :traversal_ids, diff --git a/app/models/namespaces/traversal/recursive_scopes.rb b/app/models/namespaces/traversal/recursive_scopes.rb index 583c53f8221..c6f09a4d134 100644 --- a/app/models/namespaces/traversal/recursive_scopes.rb +++ b/app/models/namespaces/traversal/recursive_scopes.rb @@ -53,6 +53,11 @@ module Namespaces self_and_descendants(include_self: include_self).as_ids end alias_method :recursive_self_and_descendant_ids, :self_and_descendant_ids + + def self_and_hierarchy + Gitlab::ObjectHierarchy.new(all).all_objects + end + alias_method :recursive_self_and_hierarchy, :self_and_hierarchy end end end diff --git a/app/models/namespaces/user_namespace.rb b/app/models/namespaces/user_namespace.rb index 14b867b2607..408acb6dcce 100644 --- a/app/models/namespaces/user_namespace.rb +++ b/app/models/namespaces/user_namespace.rb @@ -25,5 +25,9 @@ module Namespaces def self.sti_name 'User' end + + def owners + Array.wrap(owner) + end end end |