Missing `merge_request_diffs` associations
Problem
Originally raised !19337 (comment 239858830).
It seems there are some merge requests missing merge_request_diffs
associations. For example,
project = Project.find_by_full_path('redacted')
[ gprd ] production> project.merge_requests.where('NOT EXISTS (SELECT 1 FROM merge_request_diffs WHERE merge_request_diffs.merge_request_id = merge_requests.id)').count
=> 347
This actually contributes to exceptions like https://sentry.gitlab.net/gitlab/gitlabcom/issues/1037137/?query=head_commit_sha and https://sentry.gitlab.net/gitlab/gitlabcom/issues/998669/?query=head_commit_sha.
[ gprd ] production> merge_request.merge_request_diff
=> nil
[ gprd ] production> merge_request.source_branch_head
=> #<Commit redacted>
[ gprd ] production> merge_request.diff_head_sha
Traceback (most recent call last):
3: from (irb):71
2: from lib/gitlab/metrics/instrumentation.rb:163:in `diff_head_sha'
1: from app/models/merge_request.rb:560:in `diff_head_sha'
NoMethodError (undefined method `head_commit_sha' for nil:NilClass)
For now, it seems this happens on merged MRs
[ gprd ] production> project.merge_requests.where('NOT EXISTS (SELECT 1 FROM merge_request_diffs WHERE merge_request_diffs.merge_request_id = merge_requests.id)').all? { |mr| mr.merged? }
=> true