PERF: reuse renderer when rendering email templates

Previous to this fix we were leaking methods on the internal action view
template class per render.

This caused email generation to be very low and a steady memory leak in the
application in sidekiq when sending out emails

The behavior change is new to Rails 6 so this fix does not need to be
backported into stable.
This commit is contained in:
Sam Saffron 2019-10-06 23:57:03 -04:00
parent d45866eb5c
commit 71ea4ad7fc
4 changed files with 9 additions and 7 deletions

@ -589,7 +589,7 @@ class UserNotifications < ActionMailer::Base
end
unless translation_override_exists
html = UserNotificationRenderer.with_view_paths(Rails.configuration.paths["app/views"]).render(
html = UserNotificationRenderer.instance.render(
template: 'email/notification',
format: :html,
locals: { context_posts: context_posts,

@ -4,4 +4,10 @@ class UserNotificationRenderer < ActionView::Base
include ApplicationHelper
include UserNotificationsHelper
include EmailHelper
def self.instance
@instance ||= UserNotificationRenderer.with_view_paths(
Rails.configuration.paths["app/views"]
)
end
end

@ -94,9 +94,7 @@ module Email
html_override.gsub!("%{respond_instructions}", "")
end
html = UserNotificationRenderer.with_view_paths(
Rails.configuration.paths["app/views"]
).render(
html = UserNotificationRenderer.instance.render(
template: 'layouts/email_template',
format: :html,
locals: { html_body: html_override.html_safe }

@ -18,9 +18,7 @@ module Email
style = if @message.html_part
Email::Styles.new(@message.html_part.body.to_s, @opts)
else
unstyled = UserNotificationRenderer.with_view_paths(
Rails.configuration.paths["app/views"]
).render(
unstyled = UserNotificationRenderer.instance.render(
template: 'layouts/email_template',
format: :html,
locals: { html_body: PrettyText.cook(text).html_safe }