• Stan Hu's avatar
    Eliminate cached N+1 queries for projects in Issue API · ef253a1e
    Stan Hu authored
    In CE, every `Issue` entity is also a `ProjectEntity`, which calls
    `entity&.project.try(:id)` to show the project ID. In an API
    request with 100 issues, this would hit the Rails statement cache 100 times
    for the same project and cause unnecessary overhead as related models would
    also be loaded.
    
    In EE, we call `Issue#supports_weight?` for each issue, which then calls
    `project&.feature_available?(:issue_weights)`. If the project is not
    preloaded, this incurs additional overhead, as each individual Project
    object has to be queried. This can lead to a significant performance hit.
    In loading the CE project with 100 issues, this contributed to at least 22%
    of the load time.
    
    See https://gitlab.com/gitlab-org/gitlab-ce/issues/47031 for why testing this
    is a bit tricky.
    ef253a1e
issues.rb 13 KB