[#115984] [Ruby master Misc#20107] Update required Oracle Solaris Studio version to 12.5 — "kddnewton (Kevin Newton) via ruby-core" <ruby-core@...>

Issue #20107 has been reported by kddnewton (Kevin Newton).

7 messages 2024/01/02

[#115985] [Ruby master Feature#20108] Introduction of Happy Eyeballs Version 2 (RFC8305) in Socket.tcp — "shioimm (Misaki Shioi) via ruby-core" <ruby-core@...>

Issue #20108 has been reported by shioimm (Misaki Shioi).

14 messages 2024/01/02

[#116028] [Ruby master Feature#20152] mkmf / extconf: Add a proper way to not compile the extension — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>

Issue #20152 has been reported by byroot (Jean Boussier).

21 messages 2024/01/05

[#116039] [Ruby master Bug#20154] aarch64: configure overrides `-mbranch-protection` if it was set in CFLAGS via environment — "jprokop (Jarek Prokop) via ruby-core" <ruby-core@...>

Issue #20154 has been reported by jprokop (Jarek Prokop).

11 messages 2024/01/05

[#116041] [Ruby master Bug#20155] Using value of rb_fiber_scheduler_current() crashes Ruby — "paddor (Patrik Wenger) via ruby-core" <ruby-core@...>

Issue #20155 has been reported by paddor (Patrik Wenger).

12 messages 2024/01/05

[#116065] [Ruby master Feature#20160] rescue keyword for case expressions — "lloeki (Loic Nageleisen) via ruby-core" <ruby-core@...>

Issue #20160 has been reported by lloeki (Loic Nageleisen).

9 messages 2024/01/08

[#116083] [Ruby master Feature#20163] Introduce #bit_count method on Integer — "garrison (Garrison Jensen) via ruby-core" <ruby-core@...>

Issue #20163 has been reported by garrison (Garrison Jensen).

25 messages 2024/01/08

[#116114] [Ruby master Bug#20169] `GC.compact` can raises `EFAULT` on IO — "ko1 (Koichi Sasada) via ruby-core" <ruby-core@...>

Issue #20169 has been reported by ko1 (Koichi Sasada).

14 messages 2024/01/09

[#116129] [Ruby master Bug#20172] Socket.addrinfo failing randomly — "mwaldvogel (Michael Waldvogel) via ruby-core" <ruby-core@...>

Issue #20172 has been reported by mwaldvogel (Michael Waldvogel).

9 messages 2024/01/09

[#116182] [Ruby master Bug#20180] Inconsistent evaluation of `**{}` depending on position in array — "ozydingo (Andrew Schwartz) via ruby-core" <ruby-core@...>

Issue #20180 has been reported by ozydingo (Andrew Schwartz).

8 messages 2024/01/12

[#116203] [Ruby master Bug#20185] String#ascii_only? buggy in ruby 3.3 — "chucke (Tiago Cardoso) via ruby-core" <ruby-core@...>

SXNzdWUgIzIwMTg1IGhhcyBiZWVuIHJlcG9ydGVkIGJ5IGNodWNrZSAoVGlhZ28gQ2FyZG9zbyku

7 messages 2024/01/14

[#116223] [Ruby master Bug#20188] `Module#const_source_location` returns wrong information when real constant was defined but autoload is still ongoing — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>

Issue #20188 has been reported by byroot (Jean Boussier).

32 messages 2024/01/16

[#116315] [Ruby master Misc#20193] DevMeeting-2024-02-14 — "mame (Yusuke Endoh) via ruby-core" <ruby-core@...>

Issue #20193 has been reported by mame (Yusuke Endoh).

16 messages 2024/01/19

[#116347] [Ruby master Bug#20197] Postponed job invocations are significantly reduced in Ruby 3.3 — "osyoyu (Daisuke Aritomo) via ruby-core" <ruby-core@...>

Issue #20197 has been reported by osyoyu (Daisuke Aritomo).

8 messages 2024/01/20

[#116370] [Ruby master Bug#20203] `TestEnumerable` test failures with GCC 14 — "vo.x (Vit Ondruch) via ruby-core" <ruby-core@...>

Issue #20203 has been reported by vo.x (Vit Ondruch).

13 messages 2024/01/22

[#116382] [Ruby master Feature#20205] Enable `frozen_string_literal` by default — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>

Issue #20205 has been reported by byroot (Jean Boussier).

77 messages 2024/01/23

[#116395] [Ruby master Bug#20207] Segmentation fault for a regexp containing positive and negative lookaheads — "Sundeep (Sundeep Agarwal) via ruby-core" <ruby-core@...>

Issue #20207 has been reported by Sundeep (Sundeep Agarwal).

7 messages 2024/01/24

[#116399] [Ruby master Bug#20208] Net::HTTP errors with Errno::EAFNOSUPPORT when setting local_host with Addrinfo — "jprokop (Jarek Prokop) via ruby-core" <ruby-core@...>

Issue #20208 has been reported by jprokop (Jarek Prokop).

9 messages 2024/01/24

[#116435] [Ruby master Misc#20210] Invalid source encoding raises ArgumentError, not SyntaxError — "kddnewton (Kevin Newton) via ruby-core" <ruby-core@...>

Issue #20210 has been reported by kddnewton (Kevin Newton).

8 messages 2024/01/25

[#116456] [Ruby master Feature#20215] Introduce `IO#readable?` — "ioquatix (Samuel Williams) via ruby-core" <ruby-core@...>

Issue #20215 has been reported by ioquatix (Samuel Williams).

17 messages 2024/01/26

[#116460] [Ruby master Bug#20218] aset/masgn/op_asgn with keyword arguments — "jeremyevans0 (Jeremy Evans) via ruby-core" <ruby-core@...>

Issue #20218 has been reported by jeremyevans0 (Jeremy Evans).

18 messages 2024/01/27

[#116491] [Ruby master Bug#20225] Inconsistent behavior of regex matching for a regex has a null loop — "make_now_just (Hiroya Fujinami) via ruby-core" <ruby-core@...>

Issue #20225 has been reported by make_now_just (Hiroya Fujinami).

10 messages 2024/01/30

[#116493] [Ruby master Bug#20226] Inconsistent Sort results on 3.3.0 compared to previous versions — "omerby (Omer Ben Yosef) via ruby-core" <ruby-core@...>

Issue #20226 has been reported by omerby (Omer Ben Yosef).

14 messages 2024/01/30

[ruby-core:116143] [Ruby master Feature#20057] Change behaviour of rb_register_postponed_job for Ruby 3.3

From: "kjtsanaktsidis (KJ Tsanaktsidis) via ruby-core" <ruby-core@...>
Date: 2024-01-10 10:07:22 UTC
List: ruby-core #116143
Issue #20057 has been updated by kjtsanaktsidis (KJ Tsanaktsidis).

Status changed from Open to Closed

This was merged for Ruby 3.3 - f8effa209adb3ce050c100ffaffe6f3cc1508185

----------------------------------------
Feature #20057: Change behaviour of rb_register_postponed_job for Ruby 3.3
https://bugs.ruby-lang.org/issues/20057#change-106148

* Author: kjtsanaktsidis (KJ Tsanaktsidis)
* Status: Closed
* Priority: Normal
----------------------------------------
This ticket is to discuss some changes to `rb_register_postponed_job` that @ko1 and myself propose to make for Ruby 3.3. The motivation for this work is to fix a bug in the current implementation, which can cause the registered functions to be called with the wrong `data` argument (https://bugs.ruby-lang.org/issues/19991).

There's a long discussion on the associated PR (https://github.com/ruby/ruby/pull/8949) but in the end we came to the conclusion that the best way to fix this bug involved actually changing the current semantics of `rb_register_postponed_job`. I'm opening this issue to get feedback on this approach and to see if anybody knows of a reason why we should not release this for Ruby 3.3.

## Current behaviour in Ruby 3.2

Currently, Ruby has two functions for interacting with postponed jobs. These jobs can be enqueued from anywhere (including signal handlers), and will be executed next time Ruby checks for `RUBY_VM_CHECK_INTS()`.

* `rb_postponed_job_register(func, data)`: Schedules `func(data)` to be executed the next time `RUBY_VM_CHECK_INTS` is checked.
* `rb_postponed_job_register_once(func, data)`: Works like `rb_postponed_job_register`, _except_ if `func` is already scheduled to be executed (either with this `data` or with different `data`), in which case it does nothing.

The postponed jobs are stored in a fixed sized array (of length 1024), so it's possible that enqueuing them could fail if the buffer is full. In this case, they signal this by returning `0` (otherwise, they return `1` for successful enqueue or `2` because `rb_postponed_job_register_once` did nothing because `func` was already in the queue).

Unfortunately, as I mentioned before, the implementation of these functions are subject to a race condition because `func` and `data` are not written into the postponed job buffer together atomically (they are two separate variables and CPUs tend not to have double-word atomic instructions). Again, see https://bugs.ruby-lang.org/issues/19991 for the full details.

## What we have done

Whilst working on this issue, we had a look at all of the in-the-wild usages of these APIs on rubygems. The only real usage of these APIs is for profiling tools, and the following was true for essentially all of them:

* Each gem only is registering a single callback function,
* Almost all of the usages either make no use of the `data` argument at all, or pass some kind of never-changing global context into it.
* There are only a very small handful of gems using these APIs at all

Thus, we concluded that the current behaviour of allowing scheduling and execution of arbitrary `(func, data)` pairs is actually not really needed. Instead, we could offer a more limited API which would meet the needs of all current users, whilst making it easy to avoid the race conditions in the current implementation.

The new API is as follows:

* `rb_postponed_job_preregister(func, data)`: This function registers `func`/`data` into a small, fixed-size table, and return a handle to this registration. Subsequent calls to this function with the same `func` will return the same handle, and overwrite the `data` with new data if it is different. The size of the table is 32 entries on most systems, which is still enough to use literally every gem on rubygems that actually uses these APIs at the same time. The intention is that libraries would call this function in their initialization routines, storing the handle for later.
* `rb_postponed_job_trigger(handle)`: This function takes the handle from `rb_postponed_job_preregister` and schedules it for execution the next time `RUBY_VM_CHECK_INTS` is called. If the handle is already scheduled, this will not cause it to be scheduled twice; each `func` can only be called a maximum of one time for each call to `RUBY_VM_CHECK_INTS`, essentially.

All of the usages of the old `rb_postponed_job_register{,_once}` functions in the Ruby tree have been replaced by calls to the above two functions, and these two old functions have been marked with the deprecated attribute. They have also been re-implemented in terms of the new functions; both `rb_postponed_job_register` and `rb_postponed_job_register_once` are now both equivalent to `rb_postponed_job_trigger(rb_postponed_job_prereigster(func, data))`. This means that:

* `rb_postponed_job_register` now works like `rb_postponed_job_register_once` i.e. `func` can only be executed one time per `RUBY_VM_CHECK_INTS`, no matter how many times it is registered
* They are also called with the _last_ `data` to be registered, not the first (which is how `rb_postponed_job_register_once` previously worked)

I verified that stackprof still builds & works correctly with the new implementation of `rb_postponed_job_register`.

## What else we tried

I tried a couple of things to keep the current semantics of `rb_postponed_job_register{,_once}` intact, without introducing new APIs.

* First, I tried protecting postponed job buffer by masking signals around the critical section & using a POSIX semaphore instead of a pthread mutex: https://github.com/ruby/ruby/pull/8856. However, there was a concern that this would be too slow (since `RUBY_VM_CHECK_INTS` is called very often, and both the semaphore and the signal mask require calling into the kernel).
* Then, I implemented a lock-free ringbuffer to store the postponed job queue: https://github.com/ruby/ruby/compare/master...KJTsanaktsidis:ruby:old_circular_ringbuffer. However, the concern with this implementation was that it was too complex.

## Ruby 3.3

As of right now, we have merged these changes (from https://github.com/ruby/ruby/pull/8949), and @ko1 plans for them to go out in 3.3-rc1. The point of opening this issue is to ask: does anybody foresee any problem with our approach?



-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/

In This Thread

Prev Next