Rails: Fixing the memory leak / performance issues in prepend_view_path

Updated . Posted . Visible to the public. Repeats.

Recently we detected a memory leak in one of our applications. Hunting it down, we found that the memory leak was located in Rails' #prepend_view_path. It occurs when the instance method prepend_view_path is called in each request, which is a common thing in a multi-tenant application.

On top of leaking memory, it also causes a performance hit, since templates rendered using the prepended view path will not be cached and compiled anew on each request.

This is not a new memory leak. It was first reported in in 2014 Show archive.org snapshot . Five years later, Frederick cheung wrote in detail how he chased down this memory leak Show archive.org snapshot . Last year, mudge added some dev improvement Show archive.org snapshot .

We took their solution a little further to prevent the leak at its root. When you include the attached module in your ApplicationController, you can just use #prepend_view_path as before. Note that Rails 7 version differs slightly.

Known affected Rails versions (maybe more): Rails 4.0 - 7.0

This issue is now fixed Show archive.org snapshot and available in Rails 7.1+.

Dominik Schöler
Last edit
Dominic Beger
License
Source code in this card is licensed under the MIT License.
Posted by Dominik Schöler to makandra dev (2022-08-04 07:38)