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)
subblock.call
end
end
end
p "Doing recursive call in a fiber"
Fiber.new { recursive.call }.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.)
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
subblock.call
end
end
...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) { block.call }
end
Fiber.new { recursive {} }.resume
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".