Project

General

Profile

Bug #15661

Updated by nobu (Nobuyoshi Nakada) over 5 years ago

`Dir.chdir` Dir.chdir with a block should disallow concurrent use, since it will almost never produce the results a user expects. 

 In https://bugs.ruby-lang.org/issues/9785 calls for `Dir.chdir` Dir.chdir to be made thread-safe were rejected because the underlying native call is process-global. This is reasonable because there's no way to easily make the native chdir be thread-local (at least not without larger changes to CRuby itself). 

 However the block form of `chdir` chdir is explicitly bounded, and clearly indicates that the dir should be changed only for the given block. I believe `Dir.chdir` Dir.chdir should prevent multiple threads from attempting to do this bounded `chdir` chdir at the same time. 

 Currently, if two threads attempt to do a `Dir.chdir` Dir.chdir with a block, one of them will see a warning: "conflicting chdir during another chdir block". This warning is presumably intended to inform the user that they may see unpredictable results, but I can think of no cases where you would ever see predictable results. 

 In other words, there's no reason to allow a user to do concurrent `Dir.chdir` Dir.chdir with a block because they will always be at risk of unpredictable results, and I believe this only leads to hard-to-diagnose bugs. 

 The warning should be a hard error. 

 The warning should also be turned into an error if a non-block `Dir.chdir` Dir.chdir call happens while a block Dir.chdir is in operation. The important thing is to protect the integrity of the current directory during the lifetime of that block invocation. 

 In CRuby terms, the patch would be to check for `chdir_blocking chdir_blocking > 0` 0 and then simply error out, unless it's happening on the same thread. 

 Concurrent non-block `Dir.chdir` Dir.chdir would be unaffected. This only protects the block form from having the current dir change while it is executing. 

 See https://github.com/jruby/jruby/issues/5649

Back