Actions
Bug #10540
closedYielded 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
Like0
Like0Like0Like0Like0