Bug #17553

Rails CI shows infinite loop of method_missing since f4ce78d5c139a8825ee2d09f39aef03ef762dfc6

Added by yahonda (Yasuo Honda) about 2 months ago. Updated 16 days ago.

Target version:
ruby -v:
ruby 3.1.0dev (2021-01-14T00:06:39Z master f4ce78d5c1) [x86_64-linux]


Steps to reproduce

git clone
cd rails/activerecord
bundle install
bin/test test/cases/relations_test.rb test/cases/callbacks_test.rb test/cases/finder_test.rb -n "/^(?:RelationTest#(?:test_dynamic_find
er)|CallbacksTest#(?:test_before_destroy_throwing_abort)|FinderTest#(?:test_find_by_id_with_hash))$/" --seed 64098

Expected results

It should pass.

Actual Results

Using sqlite3
Run options: -n "/^(?:RelationTest#(?:test_dynamic_finder)|CallbacksTest#(?:test_before_destroy_throwing_abort)|FinderTest#(?:test_find_by_id_with_hash))$/" --seed 64098

# Running:


SystemStackError: stack level too deep
    /home/yahonda/src/ `block in match'
    /home/yahonda/src/ `each'
    /home/yahonda/src/ `find'
    /home/yahonda/src/ `match'
    /home/yahonda/src/ `method_missing'
    ... repeat about 8700 times ...
    /home/yahonda/src/ `method_missing'
    /home/yahonda/src/ `block in test_find_by_id_with_hash'
    /home/yahonda/src/ `assert_nothing_raised'
    /home/yahonda/src/ `test_find_by_id_with_hash'

bin/test test/cases/finder_test.rb:31

Finished in 0.203552s, 14.7383 runs/s, 39.3020 assertions/s.
3 runs, 8 assertions, 0 failures, 1 errors, 0 skips

Updated by ko1 (Koichi Sasada) 19 days ago

  • Assignee set to ko1 (Koichi Sasada)
  • Status changed from Open to Assigned

Updated by yahonda (Yasuo Honda) 17 days ago

The steps to reproduce provided does not reproduce the error anymore with "minitest-5.14.2 requires ruby version >= 2.2, < 3.1, which is incompatible with the current version, ruby 3.1.0p-1" message. This message itself is Rails matter then let me provide another steps to reproduce.

git clone
cd rails/activerecord
bundle update
bin/test test/cases/finder_respond_to_test.rb test/cases/finder_test.rb -n "/^(?:FinderRespondToTest#(?:test_should_respond_to_find_by_with_bang)|FinderTest#(?:test_find_by_one_attribute_bang_with_blank_defined|test_find_by_one_attribute_bang))$/" --seed 18085

Updated by ko1 (Koichi Sasada) 16 days ago

Thank you!

The small repro-script:

    c0 ={}
    c1 ={} rescue nil rescue nil
    c1.module_eval{ def foo = :c1 }
    c0.module_eval{ def foo = :c0 } # should return :c0, but raise



Updated by ko1 (Koichi Sasada) 16 days ago

  • Status changed from Assigned to Closed

Applied in changeset git|9c769575bfa2a5c9e7078eb2840bba640dc46077.

invalidate negative cache any time.

negative cache on a class which does not have subclasses was not
invalidated, but it should be invalidated because other classes
can cache this negative cache.
[Bug #17553]


Updated by yahonda (Yasuo Honda) 16 days ago

Thanks for the fix. I also have confirmed this issue has been fixed.

$ ruby -v
ruby 3.1.0dev (2021-02-19T08:27:53Z master a319c04818) [x86_64-linux]
$ bin/test test/cases/finder_respond_to_test.rb test/cases/finder_test.rb -n "/^(?:FinderRespondToTest#(?:test_should_respond_to_find_by_with_bang)|FinderTest#(?:test_find_by_one_attribute_bang_with_blank_defined|test_find_by_one_attribute_bang))$/" --seed 18085
Using sqlite3
Run options: -n "/^(?:FinderRespondToTest#(?:test_should_respond_to_find_by_with_bang)|FinderTest#(?:test_find_by_one_attribute_bang_with_blank_defined|test_find_by_one_attribute_bang))$/" --seed 18085

# Running:


Finished in 0.047764s, 62.8084 runs/s, 125.6168 assertions/s.
3 runs, 6 assertions, 0 failures, 0 errors, 0 skips

Also available in: Atom PDF