Bug #20081
openTransfered Fiber doesn't return to Fiber that started it
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?