Project

General

Profile

Actions

Bug #10540

closed

Yielded fibers do not execute ensure blocks

Added by wycats (Yehuda Katz) almost 10 years ago. Updated almost 8 years ago.

Status:
Closed
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 1 (0 open1 closed)

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

Also available in: Atom PDF

Like0
Like0Like0Like0Like0