Project

General

Profile

Bug #10540

Yielded fibers do not execute ensure blocks

Added by wycats (Yehuda Katz) over 5 years ago. Updated about 3 years ago.

Status:
Closed
Priority:
Normal
Target version:
ruby -v:
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
[ruby-core:66439]

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


Related issues

Related to Ruby master - Bug #595: Fiber ignores ensure clauseAssignedioquatix (Samuel Williams)Actions

Also available in: Atom PDF