Project

General

Profile

Actions

Bug #20081

open

Transfered Fiber doesn't return to Fiber that started it

Added by rmosolgo (Robert Mosolgo) 5 months ago. Updated 4 months ago.

Status:
Open
Assignee:
-
Target version:
-
ruby -v:
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-darwin22]
[ruby-core:115879]

Description

Hi! I'm trying to figure out how to make sure that Fibers started with .transfer end up terminated, not just suspended. (If they're suspended, Rails thinks they're still alive, and they continue to hold onto database connections, see: https://github.com/rmosolgo/graphql-ruby/issues/4739#issuecomment-1866930914.)

So, I'm looking for way to make sure that any Fiber I start with .transfer will be properly terminated. But what I noticed is that when a transfer-based Fiber terminates, it gives control back to the top-most Fiber, not the Fiber which transfered to it. Is this intended? Here's a script to replicate the issue:

manager = Fiber.new do
  parent = Fiber.current
  worker = Fiber.new do
    puts "2. Begin Worker"
    parent.transfer
    puts "4. End Worker"
  end

  puts "1. Transfer 1"
  worker.transfer
  puts "3. Transfer 2"
  worker.transfer
  puts "5. Finished manager"
end

manager.transfer
puts "6. Finished script"

I expect the steps to print in order:

1. Transfer 1
2. Begin Worker
3. Transfer 2
4. End Worker
5. Finished manager
6. Finished script

But instead, 5. ... is skipped:

1. Transfer 1
2. Begin Worker
3. Transfer 2
4. End Worker
6. Finished script

I think that's because my worker fiber terminates and passes control back to the top-level Fiber.

Should it have passed control back to the manager? Or is there another way to make sure worker is terminated, and manager gets control?

Actions

Also available in: Atom PDF

Like1
Like0Like0Like0Like0