[prev in list] [next in list] [prev in thread] [next in thread]
List: ruby-core
Subject: [ruby-core:107358] [Ruby master Bug#18453] YJIT breaks Rails collection caching
From: "naruse (Yui NARUSE)" <noreply () ruby-lang ! org>
Date: 2022-01-30 10:06:37
Message-ID: redmine.journal-96259.20220130100637.27474 () ruby-lang ! org
[Download RAW message or body]
Issue #18453 has been updated by naruse (Yui NARUSE).
Backport changed from 2.6: DONTNEED, 2.7: DONTNEED, 3.0: DONTNEED, 3.1: REQUIRED to \
2.6: DONTNEED, 2.7: DONTNEED, 3.0: DONTNEED, 3.1: DONE
ruby_3_1 2640161df5cf18d08ec86a0c1b913d4ee99e102a merged revision(s) \
5414de4b6e4372af832e338f8eb7a9fe8de17c84.
----------------------------------------
Bug #18453: YJIT breaks Rails collection caching
https://bugs.ruby-lang.org/issues/18453#change-96259
* Author: georgeclaghorn (George Claghorn)
* Status: Closed
* Priority: Normal
* Assignee: jhawthorn (John Hawthorn)
* ruby -v: ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) +YJIT [x86_64-linux]
* Backport: 2.6: DONTNEED, 2.7: DONTNEED, 3.0: DONTNEED, 3.1: DONE
----------------------------------------
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
<ul>
<li><%= render partial: "posts/post", collection: @posts, cached: true %></li>
</ul>
```
* A partial, `app/views/posts/_post.html.erb` as follows:
```erb
<% cache post do %>
<li><%= post.title %></li>
<% 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: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic