Skip to content

Display related merge requests in commit detail page

What does this MR do?

Display merge requests in the commit that was introduced in page.

Are there points in the code the reviewer needs to double check?

  • UX (Following to #2383 (closed))
  • SQL performance (Adding index on merge_request_diff_commits.sha)

The following is EXPLAIN ANALYSE output made by commit.merge_requests.

Data
SELECT COUNT(*) FROM merge_requests;
 count
-------
   945

SELECT COUNT(*) FROM merge_request_diffs; count

947

SELECT COUNT(*) FROM merge_request_diff_commits; count

58990

Query
SELECT "merge_requests".*
FROM "merge_requests"
WHERE
  "merge_requests"."deleted_at" IS NULL AND
  "merge_requests"."target_project_id" = 1 AND
  (EXISTS (
    SELECT 1
    FROM "merge_request_diffs"
    INNER JOIN "merge_request_diff_commits"
    ON "merge_request_diff_commits"."merge_request_diff_id" = "merge_request_diffs"."id"
    WHERE
      (merge_requests.latest_merge_request_diff_id = merge_request_diffs.id) AND
      "merge_request_diff_commits"."sha" = '\xf74b1b58339452106f173d34f722831619500c5c'
  ));
Query plan
                                                                                  QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=86.82..92.70 rows=4 width=739) (actual time=0.576..0.623 rows=11 loops=1)
   Join Filter: (merge_requests.latest_merge_request_diff_id = merge_request_diff_commits.merge_request_diff_id)
   ->  HashAggregate  (cost=86.55..86.64 rows=9 width=8) (actual time=0.565..0.566 rows=11 loops=1)
         Group Key: merge_request_diffs.id
         ->  Hash Join  (cost=52.11..86.52 rows=9 width=8) (actual time=0.540..0.556 rows=11 loops=1)
               Hash Cond: (merge_request_diff_commits.merge_request_diff_id = merge_request_diffs.id)
               ->  Bitmap Heap Scan on merge_request_diff_commits  (cost=4.48..38.78 rows=9 width=4) (actual time=0.035..0.045 rows=11 loops=1)
                     Recheck Cond: (sha = '\xf74b1b58339452106f173d34f722831619500c5c'::bytea)
                     Heap Blocks: exact=11
                     ->  Bitmap Index Scan on index_merge_request_diff_commits_on_sha  (cost=0.00..4.48 rows=9 width=0) (actual time=0.020..0.020 rows=11 loops=1)
                           Index Cond: (sha = '\xf74b1b58339452106f173d34f722831619500c5c'::bytea)
               ->  Hash  (cost=35.61..35.61 rows=961 width=4) (actual time=0.488..0.488 rows=947 loops=1)
                     Buckets: 1024  Batches: 1  Memory Usage: 42kB
                     ->  Seq Scan on merge_request_diffs  (cost=0.00..35.61 rows=961 width=4) (actual time=0.006..0.253 rows=947 loops=1)
   ->  Index Scan using index_merge_requests_on_latest_merge_request_diff_id on merge_requests  (cost=0.28..0.66 rows=1 width=739) (actual time=0.004..0.004 rows=1 loops=11)
         Index Cond: (latest_merge_request_diff_id = merge_request_diffs.id)
         Filter: ((deleted_at IS NULL) AND (target_project_id = 1))
 Planning time: 1.093 ms
 Execution time: 0.859 ms

Results from staging, using the above query with target_project_id = 13083 (this project) and SHAs 7e71f958ac721f5c36c20a5366c1e46adce4c67d (single result) and 593070a01a29647d6101a5fa3943ec55dbf61b9c (no result):

  1. Single result - 0.402ms.
  2. No results - 0.149ms.

Why was this MR needed?

I use git blame to know why lines in source code have been changed.

I can know the commit that the lines changed in, but it is difficult to find merge requests from the commit.

Screenshots (if relevant)

  • MR exists

    mr-in-commit-02

  • MR does not exist or exists but that commit does not exist in latest diff

    mr-in-commit-01

Does this MR meet the acceptance criteria?

What are the relevant issue numbers?

Closes #2383 (closed)

Edited by Sean McGivern

Merge request reports