ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
From: ko1@atdot.net
To: ruby-core@ruby-lang.org
Subject: [ruby-core:96811] [Ruby master Bug#16503] "ret: 2, hash modified during iteration" error in Ruby 2.7.0
Date: Sun, 12 Jan 2020 18:36:01 +0000 (UTC)	[thread overview]
Message-ID: <redmine.journal-83806.20200112183600.f72f3c2dc833bce2@ruby-lang.org> (raw)
In-Reply-To: redmine.issue-16503.20200111224456@ruby-lang.org

Issue #16503 has been updated by ko1 (Koichi Sasada).


All right. I got a script:

```ruby
loop{
  h = {a:1, b:2, c:3, d:4, e:5, f:6, g:7, h:8}
  h.each{|k,v| GC.start; h.delete(k)}
}
```

The patch is:

```diff
diff --git a/hash.c b/hash.c
index 878f2b1790..644f85d6da 100644
--- a/hash.c
+++ b/hash.c
@@ -974,6 +974,7 @@ ar_foreach_check(VALUE hash, st_foreach_check_callback_func *func, st_data_t arg
 
             switch (retval) {
               case ST_CHECK: {
+                  pair = RHASH_AR_TABLE_REF(hash, i);
                   if (pair->key == never) break;
                   ret = ar_find_entry_hint(hash, hint, key);
                   if (ret == RHASH_AR_TABLE_MAX_BOUND) {
```

This patch should be back-ported for Ruby 2.6.

Thank you for your report.

----------------------------------------
Bug #16503: "ret: 2, hash modified during iteration" error in Ruby 2.7.0
https://bugs.ruby-lang.org/issues/16503#change-83806

* Author: jnchito (Junichi Ito)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux] (heroku-18 stack)
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN
----------------------------------------
I am running a Rails app on Heroku. After upgrading to Ruby 2.7, I sometimes get `ret: 2, hash modified during iteration` error.

The same issue is reported here (I'm using meta-tags gem too):
https://github.com/kpumuk/meta-tags/issues/209

This gem deletes elements while iterating hash (HashWithIndifferentAccess actually), so I guess it might involve this error:
https://github.com/kpumuk/meta-tags/blob/v2.13.0/lib/meta_tags/renderer.rb#L168
https://github.com/kpumuk/meta-tags/blob/v2.13.0/lib/meta_tags/renderer.rb#L181
https://github.com/kpumuk/meta-tags/blob/v2.13.0/lib/meta_tags/meta_tags_collection.rb#L85

However, this error does not occur every time (sometimes works, sometimes fails), and it didn't occur in Ruby 2.6. So I'm wondering why. Do you have any idea on this?



-- 
https://bugs.ruby-lang.org/

  parent reply	other threads:[~2020-01-12 18:36 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <redmine.issue-16503.20200111224456@ruby-lang.org>
2020-01-11 22:44 ` [ruby-core:96794] [Ruby master Bug#16503] "ret: 2, hash modified during iteration" error in Ruby 2.7.0 me
2020-01-12 18:19 ` [ruby-core:96810] " ko1
2020-01-12 18:36 ` ko1 [this message]
2020-01-12 18:40 ` [ruby-core:96813] " ko1
2020-01-12 18:44 ` [ruby-core:96815] " ko1
2020-01-12 23:34 ` [ruby-core:96819] " me

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.ruby-lang.org/en/community/mailing-lists/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=redmine.journal-83806.20200112183600.f72f3c2dc833bce2@ruby-lang.org \
    --to=ruby-core@ruby-lang.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).