Fix N+1 queries in Jira Development Panel API endpoint
What does this MR do?
There were three sources of N+1 queries here: the license check, the path and namespace information, and the root namespace.
The license check was the worst. We were checking the license information on each project individually. This meant we couldn't paginate in SQL, but did so in Ruby, so it was not only an N+1, it was loading too many records.
To fix this, we use the fact that this API endpoint can only return projects in a particular namespace. License checks end up at one of two places: for most instances, it's the instance's license itself. For GitLab.com, where individual namespaces have their own plan, it's the root namespace (subgroups can't have plans; they inherit their plan from the root).
This means that we only ever need a single check. If it passes, every project returned has the feature available. If it fails, we return a 404, like the other endpoints here. That way we can paginate in SQL, as we should.
The path and namespace information N+1 was simple to fix: just preload that information.
The final N+1 was on the root namespace, which we return as the owner
field for compatibility with GitHub. Again, this was always the same for
all items in the response, but we can't preload it easily because
different projects will be at different levels of the hierarchy.
Instead, we just calculate the root namespace once, and pass that as an
option to the entity. The entity uses that value if it's given, and
falls back to calculating it if it's not (in case this entity is used
elsewhere without that option).
For #29741 (closed).
Screenshots
Does this MR meet the acceptance criteria?
Conformity
Performance and Testing
-
Review and add/update tests for this feature/bug. Consider all test levels. See the Test Planning Process.