Bug #20587
opendir.c calls blocking filesystem APIs/system calls while holding the GVL
Description
Hey! I work for Datadog on the Ruby profiler part of the datadog
(previously ddtrace
) gem.
While I was investigating https://bugs.ruby-lang.org/issues/20586, I spotted that there's a number of cases where, in dir.c
, blocking system calls are being made (e.g. readdir()
, opendir()
, etc) without releasing the GVL.
This means that if they block for a long time (as happens in the gcsfuse example in https://bugs.ruby-lang.org/issues/20586 ), the Ruby VM will just be blocked and not make any progress.
The combination of not releasing the GVL + slow system calls actually makes the issue in https://bugs.ruby-lang.org/issues/20586 more likely to happen with the Datadog profiler, although even if the code releases the GVL the underlying issue could still happen, and this is why I decided to file this bug separately.