Skip to content

initialize! raises FrozenError when called more than once from an app using zeitwerk #42319

@modosc

Description

@modosc

Steps to reproduce

initialize a rails app twice:

  require "action_controller/railtie"
  class App < Rails::Application; end

  a = App.new
  a.initialize!
  
  b = App.new
  b.initialize!

Expected behavior

no errors should be raised - this is the case on 6.0.3.7 and 6.1.3.2 with default configs

Actual behavior

on main i get this error:

Traceback (most recent call last):
	22: from ./bug.rb:8:in `<main>'
	21: from /Users/jon/.rvm/gems/ruby-2.7.3/bundler/gems/rails-b678667853b4/railties/lib/rails/application.rb:389:in `initialize!'
	20: from /Users/jon/.rvm/gems/ruby-2.7.3/bundler/gems/rails-b678667853b4/railties/lib/rails/initializable.rb:60:in `run_initializers'
	19: from /Users/jon/.rvm/rubies/ruby-2.7.3/lib/ruby/2.7.0/tsort.rb:205:in `tsort_each'
	18: from /Users/jon/.rvm/rubies/ruby-2.7.3/lib/ruby/2.7.0/tsort.rb:226:in `tsort_each'
	17: from /Users/jon/.rvm/rubies/ruby-2.7.3/lib/ruby/2.7.0/tsort.rb:347:in `each_strongly_connected_component'
	16: from /Users/jon/.rvm/rubies/ruby-2.7.3/lib/ruby/2.7.0/tsort.rb:347:in `call'
	15: from /Users/jon/.rvm/rubies/ruby-2.7.3/lib/ruby/2.7.0/tsort.rb:347:in `each'
	14: from /Users/jon/.rvm/rubies/ruby-2.7.3/lib/ruby/2.7.0/tsort.rb:349:in `block in each_strongly_connected_component'
	13: from /Users/jon/.rvm/rubies/ruby-2.7.3/lib/ruby/2.7.0/tsort.rb:415:in `each_strongly_connected_component_from'
	12: from /Users/jon/.rvm/rubies/ruby-2.7.3/lib/ruby/2.7.0/tsort.rb:415:in `call'
	11: from /Users/jon/.rvm/gems/ruby-2.7.3/bundler/gems/rails-b678667853b4/railties/lib/rails/initializable.rb:50:in `tsort_each_child'
	10: from /Users/jon/.rvm/gems/ruby-2.7.3/bundler/gems/rails-b678667853b4/railties/lib/rails/initializable.rb:50:in `each'
	 9: from /Users/jon/.rvm/rubies/ruby-2.7.3/lib/ruby/2.7.0/tsort.rb:421:in `block in each_strongly_connected_component_from'
	 8: from /Users/jon/.rvm/rubies/ruby-2.7.3/lib/ruby/2.7.0/tsort.rb:431:in `each_strongly_connected_component_from'
	 7: from /Users/jon/.rvm/rubies/ruby-2.7.3/lib/ruby/2.7.0/tsort.rb:422:in `block (2 levels) in each_strongly_connected_component_from'
	 6: from /Users/jon/.rvm/rubies/ruby-2.7.3/lib/ruby/2.7.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
	 5: from /Users/jon/.rvm/rubies/ruby-2.7.3/lib/ruby/2.7.0/tsort.rb:228:in `block in tsort_each'
	 4: from /Users/jon/.rvm/gems/ruby-2.7.3/bundler/gems/rails-b678667853b4/railties/lib/rails/initializable.rb:61:in `block in run_initializers'
	 3: from /Users/jon/.rvm/gems/ruby-2.7.3/bundler/gems/rails-b678667853b4/railties/lib/rails/initializable.rb:32:in `run'
	 2: from /Users/jon/.rvm/gems/ruby-2.7.3/bundler/gems/rails-b678667853b4/railties/lib/rails/initializable.rb:32:in `instance_exec'
	 1: from /Users/jon/.rvm/gems/ruby-2.7.3/bundler/gems/rails-b678667853b4/railties/lib/rails/engine.rb:588:in `block in <class:Engine>'
/Users/jon/.rvm/gems/ruby-2.7.3/bundler/gems/rails-b678667853b4/railties/lib/rails/engine.rb:588:in `unshift'
FrozenError (can't modify frozen Array: [])

i also found the same behavior when instantiating and initializing instances of two different classes.

a bisect gave me 0d523d8 as the first bad commit which is where zeitwerk becomes the default autoloader.

i found that in 6.1.3.2 i could get a similar error by enabling zeitwerk

  require "action_controller/railtie"
  class App < Rails::Application; end
  App.config.autoloader = :zeitwerk

  a = App.new
  a.config.autoloader = :zeitwerk
  a.initialize!
  
  b = App.new
  b.config.autoloader = :zeitwerk
  b.initialize!

System configuration

Rails version:
b678667
6.1.3.2
6.0.3.7

Ruby version:
ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-darwin20]

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions