diff --git a/config/feature_flags/development/log_discrepancies_repository_info_for_repository_size.yml b/config/feature_flags/development/log_discrepancies_repository_info_for_repository_size.yml new file mode 100644 index 0000000000000000000000000000000000000000..ea63d86eb008e4216cc90cfcf415e522550fb4c1 --- /dev/null +++ b/config/feature_flags/development/log_discrepancies_repository_info_for_repository_size.yml @@ -0,0 +1,8 @@ +--- +name: log_discrepancies_repository_info_for_repository_size +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/127050 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/419300 +milestone: '16.3' +type: development +group: group::source code +default_enabled: false diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index 71be986882ce36caadb3a539bfe44b2d22e637bc..b573bbbc1f5f35c66d4ab8197892f2d6ee66a631 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -338,13 +338,24 @@ def archive_version_path # Return repo size in megabytes def size if Feature.enabled?(:use_repository_info_for_repository_size) - bytes = gitaly_repository_client.repository_info.size - - (bytes.to_f / 1024 / 1024).round(2) + repository_info_size_megabytes else kilobytes = gitaly_repository_client.repository_size + repository_size_megabytes = (kilobytes.to_f / 1024).round(2) + + if Feature.enabled?(:log_discrepancies_repository_info_for_repository_size) + repository_info_megabytes = repository_info_size_megabytes + if repository_info_megabytes != repository_size_megabytes + Gitlab::AppJsonLogger.info( + message: "Discrepancy between RepositorySize and RepositoryInfo", + repository_size_megabytes: repository_size_megabytes, + repository_info_megabytes: repository_info_megabytes, + project_id: container.id + ) + end + end - (kilobytes.to_f / 1024).round(2) + repository_size_megabytes end end @@ -1166,6 +1177,12 @@ def replicas private + def repository_info_size_megabytes + bytes = gitaly_repository_client.repository_info.size + + Gitlab::Utils.bytes_to_megabytes(bytes).round(2) + end + def empty_diff_stats Gitlab::Git::DiffStatsCollection.new([]) end diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb index 9ce8a674146738b1d66a7f5c786160cfe96b12db..9c7f393490e4208a513d8910301f993385914d82 100644 --- a/spec/lib/gitlab/git/repository_spec.rb +++ b/spec/lib/gitlab/git/repository_spec.rb @@ -306,6 +306,36 @@ subject end + + context 'when repository_size does not match repository_info' do + before do + allow(repository.gitaly_repository_client).to receive(:repository_size).and_return(0) + allow(repository.gitaly_repository_client).to receive(:repository_info).and_return( + Gitaly::RepositoryInfoResponse.new(size: 1.megabytes) + ) + end + + it 'logs the difference' do + expect(Gitlab::AppJsonLogger).to receive(:info).with( + message: "Discrepancy between RepositorySize and RepositoryInfo", + repository_size_megabytes: 0.0, + repository_info_megabytes: 1.0, + project_id: project.id + ).and_call_original + subject + end + + context 'when the log_discrepancies_repository_info_for_repository_size flag is disabled' do + before do + stub_feature_flags(log_discrepancies_repository_info_for_repository_size: false) + end + + it 'does not log' do + expect(Gitlab::AppJsonLogger).not_to receive(:info) + subject + end + end + end end end