From: ko1@... Date: 2017-01-31T13:53:10+00:00 Subject: [ruby-core:79365] [Ruby trunk Bug#10540][Closed] Yielded fibers do not execute ensure blocks Issue #10540 has been updated by Koichi Sasada. Status changed from Open to Closed See #595 ---------------------------------------- Bug #10540: Yielded fibers do not execute ensure blocks https://bugs.ruby-lang.org/issues/10540#change-62795 * Author: Yehuda Katz * Status: Closed * Priority: Normal * Assignee: Koichi Sasada * Target version: next minor * ruby -v: ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- 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 -- https://bugs.ruby-lang.org/ Unsubscribe: