Project

General

Profile

Bug #13276

Updated by floehopper (James Mead) over 7 years ago

The following terminal session demonstrates how `Dir.glob` returns an empty array when the OS has run out of file handles; whereas `File.new` raises a `Errno::EMFILE` exception. 

 I would expect `Dir.glob` to fail fast in a similar way to `File.new`. 

 ~~~ 
 $ mkdir /tmp/ruby-dir-glob-returns-empty-array-when-too-many-open-files 
 $ cd /tmp/ruby-dir-glob-returns-empty-array-when-too-many-open-files 
 $ touch foo 
 $ ulimit -n 16 
 $ ruby -e "1.upto(16).map { |i| p [i, Dir.glob('*')]; File.new('foo') }" 
 [1, ["foo"]] 
 [2, ["foo"]] 
 [3, ["foo"]] 
 [4, ["foo"]] 
 [5, ["foo"]] 
 [6, ["foo"]] 
 [7, ["foo"]] 
 [8, ["foo"]] 
 [9, ["foo"]] 
 [10, []] # Dir.glob returns empty array and does not raise exception 
 -e:1:in `initialize': Too many open files @ rb_sysopen - foo (Errno::EMFILE) 
	 from -e:1:in `new' 
	 from -e:1:in `block in <main>' 
	 from -e:1:in `upto' 
	 from -e:1:in `each' 
	 from -e:1:in `map' 
	 from -e:1:in `<main>' 
 ~~~ 

 The following is a counter example which shows how `Dir.new` raises an exception under the same conditions. 

 ~~~ 
 $ mkdir /tmp/ruby-dir-new-raises-exception-when-too-many-files-open 
 $ cd /tmp/ruby-dir-new-raises-exception-when-too-many-files-open 
 $ touch foo 
 $ mkdir bar 
 $ ulimit -n 16 
 $ ruby -e "1.upto(16).map { |i| p [i, Dir.new('bar')]; File.new('foo') }" 
 [1, #<Dir:bar>] 
 [2, #<Dir:bar>] 
 [3, #<Dir:bar>] 
 [4, #<Dir:bar>] 
 [5, #<Dir:bar>] 
 [6, #<Dir:bar>] 
 [7, #<Dir:bar>] 
 [8, #<Dir:bar>] 
 [9, #<Dir:bar>] 
 -e:1:in `initialize': Too many open files @ dir_initialize - bar (Errno::EMFILE) 
	 from -e:1:in `new' 
	 from -e:1:in `block in <main>' 
	 from -e:1:in `upto' 
	 from -e:1:in `each' 
	 from -e:1:in `map' 
	 from -e:1:in `<main>' 
 ~~~ 

 This is what I would expect for `Dir.glob`, i.e. I would expect an exception like this: `Too many open files @ dir_s_glob (Errno::EMFILE)` in the first example. 

Back