From 4177ade69aea16948ba097e67ed7ebe05f6e1993 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 21 Apr 2021 14:14:25 +0000 Subject: Add latest changes from gitlab-org/gitlab@13-11-stable-ee --- app/models/namespaces/traversal/linear.rb | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/namespaces/traversal/linear.rb b/app/models/namespaces/traversal/linear.rb index dd9ca8d9bea..294ef83b9b4 100644 --- a/app/models/namespaces/traversal/linear.rb +++ b/app/models/namespaces/traversal/linear.rb @@ -86,7 +86,25 @@ module Namespaces raise UnboundedSearch.new('Must bound search by a top') unless top without_sti_condition - .traversal_ids_contains("{#{top.id}}") + .traversal_ids_contains(latest_traversal_ids(top)) + end + + # traversal_ids are a cached value. + # + # The traversal_ids value in a loaded object can become stale when compared + # to the database value. For example, if you load a hierarchy and then move + # a group, any previously loaded descendant objects will have out of date + # traversal_ids. + # + # To solve this problem, we never depend on the object's traversal_ids + # value. We always query the database first with a sub-select for the + # latest traversal_ids. + # + # Note that ActiveRecord will cache query results. You can avoid this by + # using `Model.uncached { ... }` + def latest_traversal_ids(namespace = self) + without_sti_condition.where('id = (?)', namespace) + .select('traversal_ids as latest_traversal_ids') end end end -- cgit v1.2.3