Commit d1682ef3 authored by Douwe Maan's avatar Douwe Maan

Merge branch 'fix/get-cached-rendered-html-using-single-redis-request' into 'master'

Retrieve rendered HTML from cache in one request

## What does this MR do?
It consolidates requests made to cache store to check for cached HTML of multiple Markdown texts (for reference extracting purposes) into one request.

## Are there points in the code the reviewer needs to double check?
N/A

## Why was this MR needed?
To improve the performance of `Participable#raw_participants`

## What are the relevant issue numbers?
#19985 

## Screenshots (if relevant)
N/A

## Does this MR meet the acceptance criteria?

- [x] [CHANGELOG](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CHANGELOG) entry added
- ~~[ ] [Documentation created/updated](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/development/doc_styleguide.md)~~
- ~~[ ] API support added~~
- ~~Tests~~
  - ~~[ ] Added for this feature/bug~~
  - ~~[ ] All builds are passing~~
- [x] Conform by the [style guides](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#style-guides)
- [x] Branch has no merge conflicts with `master` (if you do - rebase it please)
- [x] [Squashed related commits together](https://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits)

See merge request !5406
parents 3f03699e 0c14c633
...@@ -3,6 +3,7 @@ Please view this file on the master branch, on stable branches it's out of date. ...@@ -3,6 +3,7 @@ Please view this file on the master branch, on stable branches it's out of date.
v 8.11.0 (unreleased) v 8.11.0 (unreleased)
- Fix of 'Commits being passed to custom hooks are already reachable when using the UI' - Fix of 'Commits being passed to custom hooks are already reachable when using the UI'
- Limit git rev-list output count to one in forced push check - Limit git rev-list output count to one in forced push check
- Retrieve rendered HTML from cache in one request
v 8.10.0 (unreleased) v 8.10.0 (unreleased)
- Fix profile activity heatmap to show correct day name (eanplatter) - Fix profile activity heatmap to show correct day name (eanplatter)
......
...@@ -2,11 +2,11 @@ module Banzai ...@@ -2,11 +2,11 @@ module Banzai
# Extract possible GFM references from an arbitrary String for further processing. # Extract possible GFM references from an arbitrary String for further processing.
class ReferenceExtractor class ReferenceExtractor
def initialize def initialize
@texts = [] @texts_and_contexts = []
end end
def analyze(text, context = {}) def analyze(text, context = {})
@texts << Renderer.render(text, context) @texts_and_contexts << { text: text, context: context }
end end
def references(type, project, current_user = nil) def references(type, project, current_user = nil)
...@@ -21,9 +21,10 @@ module Banzai ...@@ -21,9 +21,10 @@ module Banzai
def html_documents def html_documents
# This ensures that we don't memoize anything until we have a number of # This ensures that we don't memoize anything until we have a number of
# text blobs to parse. # text blobs to parse.
return [] if @texts.empty? return [] if @texts_and_contexts.empty?
@html_documents ||= @texts.map { |html| Nokogiri::HTML.fragment(html) } @html_documents ||= Renderer.cache_collection_render(@texts_and_contexts)
.map { |html| Nokogiri::HTML.fragment(html) }
end end
end end
end end
...@@ -135,22 +135,30 @@ describe Note, models: true do ...@@ -135,22 +135,30 @@ describe Note, models: true do
let!(:note2) { create(:note_on_issue) } let!(:note2) { create(:note_on_issue) }
it "reads the rendered note body from the cache" do it "reads the rendered note body from the cache" do
expect(Banzai::Renderer).to receive(:render). expect(Banzai::Renderer).to receive(:cache_collection_render).
with(note1.note, with([{
pipeline: :note, text: note1.note,
cache_key: [note1, "note"], context: {
project: note1.project, pipeline: :note,
author: note1.author) cache_key: [note1, "note"],
project: note1.project,
expect(Banzai::Renderer).to receive(:render). author: note1.author
with(note2.note, }
pipeline: :note, }]).and_call_original
cache_key: [note2, "note"],
project: note2.project, expect(Banzai::Renderer).to receive(:cache_collection_render).
author: note2.author) with([{
text: note2.note,
note1.all_references context: {
note2.all_references pipeline: :note,
cache_key: [note2, "note"],
project: note2.project,
author: note2.author
}
}]).and_call_original
note1.all_references.users
note2.all_references.users
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment