Actions
Bug #13941
closedFile.exist? doesn't release gvl while waiting for (f)stat to return
Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.5.0dev (2017-09-26 no_gvl_rb_stat 60025) [x86_64-linux]
Description
When using File.exist?
, I noticed that it doesn't release gvl while waiting for system to return from (f)stat call. This causes issues on high-latency network drives, since it freezes whole mri while waiting for system to reach the other end and get (f)stat of the file in question. Attached patched resolved this issue by using rb_thread_call_without_gvl
to wrap the (f)stat calls. There is performance hit, but in my opinion not significant one:
$ ~/releaseruby_patch/bin/ruby bench.rb
Rehearsal ------------------------------------------------
File.exist?: 0.036412 0.056616 0.093028 ( 0.093075)
--------------------------------------- total: 0.093028sec
user system total real
File.exist?: 0.042953 0.049783 0.092736 ( 0.092804)
$ ~/releaseruby_no_patch/bin/ruby bench.rb
Rehearsal ------------------------------------------------
File.exist?: 0.056094 0.026293 0.082387 ( 0.082389)
--------------------------------------- total: 0.082387sec
user system total real
File.exist?: 0.037250 0.046702 0.083952 ( 0.083956)
It's important to stress out the these numbers are over 100000 iterations. Benchmarking script is attached as well as patch to the file.c
, simple blocking filesystem to test this thing and test script.
Notice that File.read is not blocking already.
Files
Actions
Like0
Like0Like0Like0