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

S

sera

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?
 
D

Daniel Berger

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
 
S

sera

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top