From: "georgeclaghorn (George Claghorn)" Date: 2021-12-30T17:54:12+00:00 Subject: [ruby-core:106923] [Ruby master Bug#18453] YJIT breaks Rails collection caching Issue #18453 has been reported by georgeclaghorn (George Claghorn). ---------------------------------------- Bug #18453: YJIT breaks Rails collection caching https://bugs.ruby-lang.org/issues/18453 * Author: georgeclaghorn (George Claghorn) * Status: Open * Priority: Normal * ruby -v: ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) +YJIT [x86_64-linux] * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- A minimal app that demonstrates this issue is available [on GitHub](https://github.com/georgeclaghorn/yjit-rails-collection-caching-bug). It has: * One model, `Post`, with a string `title` attribute. * One controller action, `posts#index`, which fetches `Post`s in reverse order of creation into `@posts`. * A root route to `posts#index`. * One view, `app/views/posts/index.html.erb`, which uses Rails collection rendering and caching as follows: ```erb ``` * A partial, `app/views/posts/_post.html.erb` as follows: ```erb <% cache post do %>
  • <%= post.title %>
  • <% end %> ``` I deployed this app to Heroku [here](https://yjit-rails-caching-bug.herokuapp.com). I configured it to use a Redis cache store. I added 100 posts like so: ```ruby $ heroku run rails c > 100.times do |i| * Post.create! title: "Post ##{i + 1}" * end ``` All requests to the app index, `/`, show the posts in reverse chronological order as expected, with cold and warm cache: ``` * Post #100 * Post #99 * Post #98 * Post #97 * Post #96 * Post #95 ... ``` I enabled YJIT by setting the `RUBYOPT` environment variable to `--yjit --yjit-exec-mem-size=32` and restarted the app server. I cleared the Redis cache with `heroku run rails r 'Rails.cache.redis.flushall`. The first request to `/` with cold cache begins repeating Post #1 after #92: ``` * Post #100 * Post #99 * Post #98 * Post #97 * Post #96 * Post #95 * Post #94 * Post #93 * Post #92 * Post #1 * Post #1 * Post #1 * Post #1 * Post #1 * Post #1 ... ``` All subsequent requests repeat Post #1 100 times: ``` * Post #1 * Post #1 * Post #1 * Post #1 * Post #1 * Post #1 * Post #1 * Post #1 * Post #1 ... ``` On restart, Post #1 is repeated after #92 for the first request (as in the second-to-last example). Post #1 is repeated 100 times for subsequent requests (as in the last example). Disabling YJIT and flushing the Redis cache restores the correct behavior. **Rails version:** GitHub `rails/rails`, `7-0-stable` branch, revision `499f12f6c03a4114eb649310e65200fe5d894db0` -- https://bugs.ruby-lang.org/ Unsubscribe: