Project

General

Profile

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.

Status:
Closed
Priority:
Normal
Target version:
-
ruby -v:
ruby 3.1.0dev (2021-01-14T00:06:39Z master f4ce78d5c1) [x86_64-linux]
[ruby-core:102136]

Description

Steps to reproduce

git clone https://github.com/rails/rails.git
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

:0
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:

..E

Error:
FinderTest#test_find_by_id_with_hash:
SystemStackError: stack level too deep
    /home/yahonda/src/github.com/rails/rails/activerecord/lib/active_record/dynamic_matchers.rb:33:in `block in match'
    /home/yahonda/src/github.com/rails/rails/activerecord/lib/active_record/dynamic_matchers.rb:33:in `each'
    /home/yahonda/src/github.com/rails/rails/activerecord/lib/active_record/dynamic_matchers.rb:33:in `find'
    /home/yahonda/src/github.com/rails/rails/activerecord/lib/active_record/dynamic_matchers.rb:33:in `match'
    /home/yahonda/src/github.com/rails/rails/activerecord/lib/active_record/dynamic_matchers.rb:16:in `method_missing'
    ... repeat about 8700 times ...
    /home/yahonda/src/github.com/rails/rails/activerecord/lib/active_record/dynamic_matchers.rb:20:in `method_missing'
    /home/yahonda/src/github.com/rails/rails/activerecord/test/cases/finder_test.rb:33:in `block in test_find_by_id_with_hash'
    /home/yahonda/src/github.com/rails/rails/activesupport/lib/active_support/testing/assertions.rb:34:in `assert_nothing_raised'
    /home/yahonda/src/github.com/rails/rails/activerecord/test/cases/finder_test.rb:32:in `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
#2

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 https://github.com/rails/rails.git
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
#3

Updated by ko1 (Koichi Sasada) 16 days ago

Thank you!

The small repro-script:

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

patch: https://github.com/ruby/ruby/pull/4201

#4

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]

#5

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