[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