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

View File

@ -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,

View File

@ -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

View File

@ -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 }

View File

@ -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 }