Too many open files - getcwd (Errno::EMFILE)

So I'm working on my wonky FileSystem library, and right now it makes a
lot of calls to Dir.getwd. I find that if I use it enough -- right now
I'm integrating it into my main web site's unit tests, all 500 of them
-- then I get a traceback like this:

/usr/local/lib/ruby/site_ruby/1.8/filesystem.rb:251:in
`getwd'(TestArtbaseSubmissionPhaseChange): Too many open files - getcwd
(Errno::EMFILE)
        from /usr/local/lib/ruby/site_ruby/1.8/filesystem.rb:251:in
`absolute'
        from /usr/local/lib/ruby/site_ruby/1.8/filesystem.rb:154:in
`fill_path'
        from ./test/ts_domain.rb:43:in `setup'
        from /usr/bin/runtest.rb:23:in `run'
        from /usr/bin/runtest.rb:33

The ruby-talk archives lead me to believe that Errno::EMFILE is thrown
when you have too many open files lying around, hence the error,
obviously. This is easy enough for me to work around, but I'm curious:
Why would Dir.getwd have this problem? Is it opening some files for
some reason?

sera@fhwang.net wrote:

So I'm working on my wonky FileSystem library, and right now it makes

a

lot of calls to Dir.getwd. I find that if I use it enough -- right

now

I'm integrating it into my main web site's unit tests, all 500 of

them

-- then I get a traceback like this:

/usr/local/lib/ruby/site_ruby/1.8/filesystem.rb:251:in
`getwd'(TestArtbaseSubmissionPhaseChange): Too many open files -

getcwd

(Errno::EMFILE)
        from /usr/local/lib/ruby/site_ruby/1.8/filesystem.rb:251:in
`absolute'
        from /usr/local/lib/ruby/site_ruby/1.8/filesystem.rb:154:in
`fill_path'
        from ./test/ts_domain.rb:43:in `setup'
        from /usr/bin/runtest.rb:23:in `run'
        from /usr/bin/runtest.rb:33

The ruby-talk archives lead me to believe that Errno::EMFILE is

thrown

when you have too many open files lying around, hence the error,
obviously. This is easy enough for me to work around, but I'm

curious:

Why would Dir.getwd have this problem? Is it opening some files for
some reason?

I cannot duplicate this on Solaris or Windows with 1.8.2:

irb(main):006:0> 10000.times{ Dir.getwd }
=> 10000
irb(main):007:0> 100000.times{ Dir.getwd }
=> 100000

There are no filehandles being opened in ruby_getcwd (in util.h) that I
can see, just some xmalloc/xrealloc, which is freed before you get the
result.

Very strange.

Regards,

Dan

Yeah, attempts to narrow it down were pretty difficult ... Every time I
ran my 500 test cases, I got bit by that bug a couple of times, but it
hit different test cases on different runs. So I just locally cached
the value, calling Dir.getwd 1 time instead of a couple thousand, and
it seems to be working fine now.