Skip to content

Commit 49d5c09

Browse files
committed
Merge branch '44191-reduce-redis-usage-from-merge-request-diffs-caching' into 'master'
Resolve "Reduce Redis usage from merge request diffs caching" Closes #44191 See merge request gitlab-org/gitlab-ce!17746
2 parents b53c427 + db90882 commit 49d5c09

File tree

7 files changed

+57
-18
lines changed

7 files changed

+57
-18
lines changed

app/models/merge_request.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -579,9 +579,10 @@ def reload_diff(current_user = nil)
579579
return unless open?
580580

581581
old_diff_refs = self.diff_refs
582+
new_diff = create_merge_request_diff
583+
584+
MergeRequests::MergeRequestDiffCacheService.new.execute(self, new_diff)
582585

583-
create_merge_request_diff
584-
MergeRequests::MergeRequestDiffCacheService.new.execute(self)
585586
new_diff_refs = self.diff_refs
586587

587588
update_diff_discussion_positions(
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
module MergeRequests
22
class MergeRequestDiffCacheService
3-
def execute(merge_request)
3+
def execute(merge_request, new_diff)
44
# Executing the iteration we cache all the highlighted diff information
55
merge_request.diffs.diff_files.to_a
6+
7+
# Remove cache for all diffs on this MR. Do not use the association on the
8+
# model, as that will interfere with other actions happening when
9+
# reloading the diff.
10+
MergeRequestDiff.where(merge_request: merge_request).each do |merge_request_diff|
11+
next if merge_request_diff == new_diff
12+
13+
merge_request_diff.diffs.clear_cache!
14+
end
615
end
716
end
817
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
title: Stop caching highlighted diffs in Redis unnecessarily
3+
merge_request: 17746
4+
author:
5+
type: performance

lib/gitlab/diff/file_collection/merge_request_diff.rb

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ def real_size
2929
@merge_request_diff.real_size
3030
end
3131

32+
def clear_cache!
33+
Rails.cache.delete(cache_key)
34+
end
35+
36+
def cache_key
37+
[@merge_request_diff, 'highlighted-diff-files', diff_options]
38+
end
39+
3240
private
3341

3442
def highlight_diff_file_from_cache!(diff_file, cache_diff_lines)
@@ -64,16 +72,12 @@ def highlight_cache
6472
end
6573

6674
def store_highlight_cache
67-
Rails.cache.write(cache_key, highlight_cache) if @highlight_cache_was_empty
75+
Rails.cache.write(cache_key, highlight_cache, expires_in: 1.week) if @highlight_cache_was_empty
6876
end
6977

7078
def cacheable?(diff_file)
7179
@merge_request_diff.present? && diff_file.text? && diff_file.diffable?
7280
end
73-
74-
def cache_key
75-
[@merge_request_diff, 'highlighted-diff-files', diff_options]
76-
end
7781
end
7882
end
7983
end

spec/lib/gitlab/diff/file_collection/merge_request_diff_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
diff_files
1313
end
1414

15-
it 'does not files marked as undiffable in .gitattributes' do
15+
it 'does not highlight files marked as undiffable in .gitattributes' do
1616
allow_any_instance_of(Gitlab::Diff::File).to receive(:diffable?).and_return(false)
1717

1818
expect_any_instance_of(Gitlab::Diff::File).not_to receive(:highlighted_diff_lines)

spec/models/merge_request_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1544,7 +1544,7 @@ def set_compare(merge_request)
15441544
end
15451545

15461546
it "executes diff cache service" do
1547-
expect_any_instance_of(MergeRequests::MergeRequestDiffCacheService).to receive(:execute).with(subject)
1547+
expect_any_instance_of(MergeRequests::MergeRequestDiffCacheService).to receive(:execute).with(subject, an_instance_of(MergeRequestDiff))
15481548

15491549
subject.reload_diff
15501550
end
Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,39 @@
11
require 'spec_helper'
22

3-
describe MergeRequests::MergeRequestDiffCacheService do
3+
describe MergeRequests::MergeRequestDiffCacheService, :use_clean_rails_memory_store_caching do
44
let(:subject) { described_class.new }
5+
let(:merge_request) { create(:merge_request) }
56

67
describe '#execute' do
7-
it 'retrieves the diff files to cache the highlighted result' do
8-
merge_request = create(:merge_request)
9-
cache_key = [merge_request.merge_request_diff, 'highlighted-diff-files', Gitlab::Diff::FileCollection::MergeRequestDiff.default_options]
10-
11-
expect(Rails.cache).to receive(:read).with(cache_key).and_return({})
12-
expect(Rails.cache).to receive(:write).with(cache_key, anything)
8+
before do
139
allow_any_instance_of(Gitlab::Diff::File).to receive(:text?).and_return(true)
1410
allow_any_instance_of(Gitlab::Diff::File).to receive(:diffable?).and_return(true)
11+
end
12+
13+
it 'retrieves the diff files to cache the highlighted result' do
14+
new_diff = merge_request.merge_request_diff
15+
cache_key = new_diff.diffs.cache_key
16+
17+
expect(Rails.cache).to receive(:read).with(cache_key).and_call_original
18+
expect(Rails.cache).to receive(:write).with(cache_key, anything, anything).and_call_original
19+
20+
subject.execute(merge_request, new_diff)
21+
end
22+
23+
it 'clears the cache for older diffs on the merge request' do
24+
old_diff = merge_request.merge_request_diff
25+
old_cache_key = old_diff.diffs.cache_key
26+
27+
subject.execute(merge_request, old_diff)
28+
29+
new_diff = merge_request.create_merge_request_diff
30+
new_cache_key = new_diff.diffs.cache_key
31+
32+
expect(Rails.cache).to receive(:delete).with(old_cache_key).and_call_original
33+
expect(Rails.cache).to receive(:read).with(new_cache_key).and_call_original
34+
expect(Rails.cache).to receive(:write).with(new_cache_key, anything, anything).and_call_original
1535

16-
subject.execute(merge_request)
36+
subject.execute(merge_request, new_diff)
1737
end
1838
end
1939
end

0 commit comments

Comments
 (0)