summaryrefslogtreecommitdiff
path: root/lib/banzai
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2017-09-30 14:22:52 -0700
committerStan Hu <stanhu@gmail.com>2017-10-02 07:16:00 -0700
commit15bebda7f8621ebae87c9ee5a79b4a016eff35b9 (patch)
tree68cf3a4ef5780d45fcc1a36549b1d05ba08eee04 /lib/banzai
parent6c33fb846683ca9213dadaa79b0f32f482ebc0bf (diff)
downloadgitlab-ce-15bebda7f8621ebae87c9ee5a79b4a016eff35b9.tar.gz
Make Redcarpet Markdown renderer thread-safe
The Redcarpet library is not thread-safe as described in https://github.com/vmg/redcarpet/issues/570. Since we instantiate the Redcarpet renderer in a class variable, multiple Sidekiq threads can access the work buffer and corrupt the state. We work around this issue by memoizing the renderer on a thread basis. Closes #36637
Diffstat (limited to 'lib/banzai')
-rw-r--r--lib/banzai/filter/markdown_filter.rb32
1 files changed, 14 insertions, 18 deletions
diff --git a/lib/banzai/filter/markdown_filter.rb b/lib/banzai/filter/markdown_filter.rb
index ee73fa91589..9cac303e645 100644
--- a/lib/banzai/filter/markdown_filter.rb
+++ b/lib/banzai/filter/markdown_filter.rb
@@ -1,6 +1,18 @@
module Banzai
module Filter
class MarkdownFilter < HTML::Pipeline::TextFilter
+ # https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use
+ REDCARPET_OPTIONS = {
+ fenced_code_blocks: true,
+ footnotes: true,
+ lax_spacing: true,
+ no_intra_emphasis: true,
+ space_after_headers: true,
+ strikethrough: true,
+ superscript: true,
+ tables: true
+ }.freeze
+
def initialize(text, context = nil, result = nil)
super text, context, result
@text = @text.delete "\r"
@@ -13,27 +25,11 @@ module Banzai
end
def self.renderer
- @renderer ||= begin
+ Thread.current[:banzai_markdown_renderer] ||= begin
renderer = Banzai::Renderer::HTML.new
- Redcarpet::Markdown.new(renderer, redcarpet_options)
+ Redcarpet::Markdown.new(renderer, REDCARPET_OPTIONS)
end
end
-
- def self.redcarpet_options
- # https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use
- @redcarpet_options ||= {
- fenced_code_blocks: true,
- footnotes: true,
- lax_spacing: true,
- no_intra_emphasis: true,
- space_after_headers: true,
- strikethrough: true,
- superscript: true,
- tables: true
- }.freeze
- end
-
- private_class_method :redcarpet_options
end
end
end