Bug #7212

"stack level too deep" in Fiber much earlier in new versions of 1.9.3

Added by Fredrik Liljegren over 3 years ago. Updated about 3 years ago.

ruby -v:
ruby 1.9.3p286 (2012-10-12 revision 37165) [x86_64-linux] (and others, see description)


I was getting SystemStackError in my application on some servers and not others; on all with 1.9.3-p286 and on some with p194, and on none with 1.9.2-head. I boiled it down to this:

def recursive(level = 0)
-> do
p "In block #{level}"
if level < 1000
subblock = recursive(level + 1)

p "Doing recursive call in a fiber" { }.resume

On server A, 1.9.3-p194 and 1.9.3-p286 got up to 11 levels of recursion, while 1.9.2-head got up to 97 levels.
On server B (without 1.9.2), 1.9.3-p194 got 55 levels while p286 still got 11 levels.

I don't know what changes are made, but I think 11 levels are way on the low side for many applications.

(My original problem was with a thin-server running rack-fiber_pool with em-synchrony getting too deep in a regexp in Addressable::URI.)

recursive.rb Magnifier (228 Bytes) Fredrik Liljegren, 10/24/2012 11:21 PM


#1 [ruby-core:48215] Updated by Usaku NAKAMURA over 3 years ago

  • Status changed from Open to Assigned
  • Assignee set to Koichi Sasada

#2 [ruby-core:48222] Updated by Fredrik Liljegren over 3 years ago

Here's a little more debug-info (not sure if it's needed, but anyhow...)

I tried the patch from #3187, increasing the stack size of fibers. I confirmed that the patch is working on a normal recursing method (without lambda block), increasing recursability 4 times by setting 16kb stacksize. That did NOT affect this bug at all, still on 11 levels of recursion.

Not knowing how it's implemented, I tried lambda-blocks without closure-behaviour; i.e. without using external variables, using just:
def recursive
-> do
p "Block"
subblock = recursive

...but it's exactly the same.

I also tried without the lambda notation, just sending in a block to recursive method. That got me up to level 250 on both 1.9.3-p194 and 1.9.2-p320. That's using:
def recursive(level=0, &block)
p "Level #{level}"
recursive(level+1) { }
end { recursive {} }.resume

Well, hope it helps.

#3 [ruby-core:48579] Updated by Koichi Sasada over 3 years ago

  • Target version set to 2.0.0

#4 [ruby-core:50991] Updated by Koichi Sasada over 3 years ago

  • Status changed from Assigned to Feedback

Do you use same compiler and compile option on each environments?

#5 [ruby-core:52185] Updated by Koichi Sasada about 3 years ago

  • Status changed from Feedback to Closed

No feedback.

#6 [ruby-core:53165] Updated by Fredrik Liljegren about 3 years ago

ko1 (Koichi Sasada) wrote:

Do you use same compiler and compile option on each environments?

Yes, it was compiled with rvm with no options specified.

I'm sorry for the late answer, for some reason I didn't get any mail notification even though my settings are to get email for things "I watch or I'm am involved in".

Also available in: Atom PDF