Actions
Bug #10540
closedYielded fibers do not execute ensure blocks
    Bug #10540:
    Yielded fibers do not execute ensure blocks
  
Description
When a thread has paused fibers, if an exception occurs anywhere in the thread, ensure blocks in the paused fibers do not execute.
The effect of this is that block-scoped resources (like File.open, Mutex#synchronize, ActiveRecord transactions) can easily leak due to non-local effects. This may result in strange effects, like checking connections back into a connection pool that are in the wrong state, where the correct state was guarded with an ensure block.
Here is a very simple repro of this situation:
Thread.new {
  Fiber.new {
    begin
      puts "YIELD"
      Fiber.yield
    ensure
      puts "UNWIND"
    end
  }.resume
  raise
}
Expected result: YIELD is printed, followed by UNWIND
Actual result: YIELD is printed, but UNWIND is never printed
Actions