Bug #21172
Updated by byroot (Jean Boussier) 30 days ago
This is a rare bug with very low criticality, but it can cause occasional CI failures. I leave it to branch maintainers to decide if it's worth backporting or not.
### Timeline
- A `"foo" oid=1` string is interned.
- `"foo" oid=1` is no longer referenced and will be swept in the future.
- Another `"foo" oid=2` string is interned.
- `register_fstring` finds `"foo" oid=1`, but since it is about to be swept, removes it from `fstring_table` and insert `"foo" oid=2` instead.
- `"foo" oid=1` is swept, since it has the `RSTRING_FSTR` flag, a `st_delete` is issued in `fstring_table` which removes `"foo" oid=2`.
Unfortunately, I couldn't come up with a minimal reproduction for this, but it did reproduce consistently with a large amount of tests and a very specific seed.
### Consequence
This has little to no consequence on real world code. It just breaks a few ruby tests that is attempting to ensure some strings were interned.
Example:
```
1) Failure:
JSONParserTest#test_freeze [/tmp/ruby/src/trunk/test/json/json_parser_test.rb:361]:
Expected "foo" (oid=416) to be the same as "foo" (oid=424).
make: *** [uncommon.mk:953: yes-test-all] Error 1
```