From 71ea4ad7fca483e2f5ddc7fff0ad97120074be4c Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Sun, 6 Oct 2019 23:57:03 -0400 Subject: [PATCH] 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. --- app/mailers/user_notifications.rb | 2 +- app/services/user_notification_renderer.rb | 6 ++++++ lib/email/message_builder.rb | 4 +--- lib/email/renderer.rb | 4 +--- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/mailers/user_notifications.rb b/app/mailers/user_notifications.rb index ee5a516a734..de8ac561eb9 100644 --- a/app/mailers/user_notifications.rb +++ b/app/mailers/user_notifications.rb @@ -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, diff --git a/app/services/user_notification_renderer.rb b/app/services/user_notification_renderer.rb index 8ad7d209145..edf11712838 100644 --- a/app/services/user_notification_renderer.rb +++ b/app/services/user_notification_renderer.rb @@ -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 diff --git a/lib/email/message_builder.rb b/lib/email/message_builder.rb index d1e83b03e01..654c4ae3c67 100644 --- a/lib/email/message_builder.rb +++ b/lib/email/message_builder.rb @@ -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 } diff --git a/lib/email/renderer.rb b/lib/email/renderer.rb index 641fb207bed..2f9203bd6c3 100644 --- a/lib/email/renderer.rb +++ b/lib/email/renderer.rb @@ -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 }