diff options
author | Stan Hu <stanhu@gmail.com> | 2017-10-01 00:22:52 +0300 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2017-10-02 17:16:00 +0300 |
commit | 15bebda7f8621ebae87c9ee5a79b4a016eff35b9 (patch) | |
tree | 68cf3a4ef5780d45fcc1a36549b1d05ba08eee04 /lib/banzai | |
parent | 6c33fb846683ca9213dadaa79b0f32f482ebc0bf (diff) |
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.rb | 32 |
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 |