Read about our upcoming Code of Conduct on this issue

This instance will be upgraded to Heptapod 0.28.0 on 2022-01-18 at 14:00 UTC+1 (a few minutes of down time)

  1. 14 Sep, 2017 2 commits
  2. 13 Sep, 2017 2 commits
    • Yorick Peterse's avatar
      Constrain environment deployments to project IDs · 98f4339ff129
      Yorick Peterse authored
      When querying the deployments of an environment the query Rails produces
      will be along the lines of the following:
      
          SELECT *
          FROM deployments
          WHERE environment_id = X
      
      For queries such as this (or queries that use this as their base and add
      more conditions) there is no meaningful index that can be used as long
      as deployments.project_id is not part of a WHERE clause.
      
      To work around this we change that "has_many :deployments" relation to
      always add a "WHERE project_id = X" condition. This means that queries
      filtering deployments can make better use of the existing indexes. For
      example, when filtering by deployments.iid this will result in the
      following query:
      
          SELECT *
          FROM deployments
          WHERE environment_id = X
          AND project_id = Y
          AND iid = Z
      
      This means PostgreSQL can use the existing index on
      (project_id, environment_id, iid) instead of having to use a different
      index (or none at all) and having to scan over a large amount of data.
      
      Query plan wise this means that instead of this query and plan:
      
          EXPLAIN (BUFFERS, ANALYZE)
          SELECT deployments.*
          FROM deployments
          WHERE deployments.environment_id = 5
          AND deployments.iid = 225;
      
          Index Scan using index_deployments_on_project_id_and_iid on deployments  (cost=0.42..14465.75 rows=1 width=117) (actual time=6.394..38.048 rows=1 loops=1)
            Index Cond: (iid = 225)
            Filter: (environment_id = 5)
            Rows Removed by Filter: 839
            Buffers: shared hit=4534
          Planning time: 0.076 ms
          Execution time: 38.073 ms
      
      We produce the following query and plan:
      
          EXPLAIN (BUFFERS, ANALYZE)
          SELECT deployments.*
          FROM deployments
          WHERE deployments.environment_id = 5
          AND deployments.iid = 225
          AND deployments.project_id = 1292351;
      
          Index Scan using index_deployments_on_project_id_and_iid on deployments  (cost=0.42..4.45 rows=1 width=117) (actual time=0.018..0.018 rows=1 loops=1)
            Index Cond: ((project_id = 1292351) AND (iid = 225))
            Filter: (environment_id = 5)
            Buffers: shared hit=4
          Planning time: 0.088 ms
          Execution time: 0.039 ms
      
      On GitLab.com these changes result in a (roughly) 11x improvement in SQL
      timings for the CI environment status endpoint.
      
      Fixes https://gitlab.com/gitlab-org/gitlab-ce/issues/36877
      98f4339ff129
    • Lin Jen-Shin's avatar
      Also treat newlines as separator, as people would do that · b7784b5cb317
      Lin Jen-Shin authored
      Before this fix, I don't know if those emails would work
      having newlines in them.
      b7784b5cb317
  3. 12 Sep, 2017 6 commits
  4. 11 Sep, 2017 3 commits
  5. 09 Sep, 2017 1 commit
  6. 08 Sep, 2017 2 commits
  7. 07 Sep, 2017 3 commits
    • Yorick Peterse's avatar
      Rework how recent push events are retrieved · 9ec66da20412
      Yorick Peterse authored
      Whenever you push to a branch GitLab will show a button to create a
      merge request (should one not exist already). The underlying code to
      display this data was quite inefficient. For example, it involved
      multiple slow queries just to figure out what the most recent push event
      was.
      
      This commit changes the way this data is retrieved so it's much faster.
      This is achieved by caching the ID of the last push event on every push,
      which is then retrieved when loading certain pages. Database queries are
      only executed if necessary and the cached data is removed automatically
      once a merge request has been created, or 2 hours after being stored.
      
      A trade-off of this approach is that we _only_ track the last event.
      Previously if you were to push to branch A and B then create a merge
      request for branch B we'd still show the widget for branch A. As of this
      commit this is no longer the case, instead we will only show the widget
      for the branch you pushed to most recently. Once a merge request exists
      the widget is no longer displayed. Alternative solutions are either too
      complex and/or too slow, hence the decision was made to settle for this
      trade-off.
      
      Performance Impact
      ------------------
      
      In the best case scenario (= a user didn't push anything for more than 2
      hours) we perform a single Redis GET per page. Should there be cached
      data we will run a single (and lightweight) SQL query to get the
      event data from the database. If a merge request already exists we will
      run an additional DEL to remove the cache key.
      
      The difference in response timings can vary a bit per project. On
      GitLab.com the 99th percentile of time spent in User#recent_push hovers
      between 100 milliseconds and 1 second, while the mean hovers around 50
      milliseconds. With the changes in this MR the expected time spent in
      User#recent_push is expected to be reduced down to just a few
      milliseconds.
      
      Fixes https://gitlab.com/gitlab-org/gitlab-ce/issues/35990
      9ec66da20412
    • Kamil Trzcinski's avatar
      Add has_auto_devops_implicitly_disabled · 61bb99ba2e5c
      Kamil Trzcinski authored
      61bb99ba2e5c
    • Tiago Botelho's avatar
      Removes default scope from sortable · 5784156dffd7
      Tiago Botelho authored
      5784156dffd7
  8. 06 Sep, 2017 21 commits