diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-16 15:13:53 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-16 15:13:53 +0300 |
commit | abed3501da6ecd7ae31cfe2b8fa7654e91a26fb6 (patch) | |
tree | 65318870e1bff62cd176e7fe5bd26155cc38c08f /app/models/namespaces | |
parent | 6259da15b5ede93a9f688ddd062860166e7cf21a (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/models/namespaces')
-rw-r--r-- | app/models/namespaces/traversal/linear.rb | 11 |
1 files changed, 10 insertions, 1 deletions
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) |