From 85dc423f7090da0a52c73eb66faf22ddb20efff9 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Sat, 19 Sep 2020 01:45:44 +0000 Subject: Add latest changes from gitlab-org/gitlab@13-4-stable-ee --- app/models/merge_request_diff.rb | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'app/models/merge_request_diff.rb') diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index b70340a98cd..880e3cc1ba5 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -17,6 +17,10 @@ class MergeRequestDiff < ApplicationRecord # diffs to external storage EXTERNAL_DIFF_CUTOFF = 7.days.freeze + # The files_count column is a 2-byte signed integer. Look up the true value + # from the database if this sentinel is seen + FILES_COUNT_SENTINEL = 2**15 - 1 + belongs_to :merge_request manual_inverse_association :merge_request, :merge_request_diff @@ -150,10 +154,10 @@ class MergeRequestDiff < ApplicationRecord # All diff information is collected from repository after object is created. # It allows you to override variables like head_commit_sha before getting diff. after_create :save_git_content, unless: :importing? - after_create :set_count_columns after_create_commit :set_as_latest_diff, unless: :importing? after_save :update_external_diff_store + after_save :set_count_columns def self.find_by_diff_refs(diff_refs) find_by(start_commit_sha: diff_refs.start_sha, head_commit_sha: diff_refs.head_sha, base_commit_sha: diff_refs.base_sha) @@ -202,6 +206,17 @@ class MergeRequestDiff < ApplicationRecord end end + def files_count + db_value = read_attribute(:files_count) + + case db_value + when nil, FILES_COUNT_SENTINEL + merge_request_diff_files.count + else + db_value + end + end + # This method will rely on repository branch sha # in case start_commit_sha is nil. Its necesarry for old merge request diff # created before version 8.4 to work @@ -423,7 +438,7 @@ class MergeRequestDiff < ApplicationRecord # external storage. If external storage isn't an option for this diff, the # method is a no-op. def migrate_files_to_external_storage! - return if stored_externally? || !use_external_diff? || merge_request_diff_files.count == 0 + return if stored_externally? || !use_external_diff? || files_count == 0 rows = build_merge_request_diff_files(merge_request_diff_files) rows = build_external_merge_request_diff_files(rows) @@ -449,7 +464,7 @@ class MergeRequestDiff < ApplicationRecord # If this diff isn't in external storage, the method is a no-op. def migrate_files_to_database! return unless stored_externally? - return if merge_request_diff_files.count == 0 + return if files_count == 0 rows = convert_external_diffs_to_database @@ -666,7 +681,7 @@ class MergeRequestDiff < ApplicationRecord def set_count_columns update_columns( commits_count: merge_request_diff_commits.size, - files_count: merge_request_diff_files.size + files_count: [FILES_COUNT_SENTINEL, merge_request_diff_files.size].min ) end -- cgit v1.2.1