Actions
Bug #20456
openHash can get stuck marked as iterating through process forking
Bug #20456:
Hash can get stuck marked as iterating through process forking
Description
Steps to Reproduce¶
- Iterate over a hash
- While that iteration is happening, fork the process
a. This should be done in a way that causes the iteration to never finish from the child process's view, e.g. fork with a block, or iteration is happening in a different thread than fork - Attempt to add a new key to the hash in the child process
a. This can be before or after the iteration finishes in the parent process, doesn't matter
Observed Behavior¶
The child process can never add a new key to the hash, always fails with RuntimeError: can't add a new key into hash during iteration
Desired¶
The hash is no longer iterating in the child process, so it can be modified as needed
Examples¶
With threads:¶
h = { a: 1 }
t = Thread.new do
sleep 0.05
pid = fork do
sleep 0.1
puts 'child: before'
h[:b] = 2
puts 'child: after'
end
Process.wait2(pid)
end
puts 'parent: before'
h.each do
sleep 0.1
end
puts 'parent: after'
puts t.join.value.inspect
produces:
parent: before
parent: after
child: before
can't add a new key into hash during iteration (RuntimeError)
[34450, #<Process::Status: pid 34450 exit 1>]
Without threads:¶
h = { a: 1 }
pid = nil
puts 'parent: before'
h.each do
pid = fork do
sleep 0.05
puts 'child: before'
h[:b] = 2
puts 'child: after'
end
end
puts 'parent: after'
puts Process.wait2(pid).inspect
produces:
parent: before
parent: after
child: before
can't add a new key into hash during iteration (RuntimeError)
[17809, #<Process::Status: pid 17809 exit 1>]
Platform information¶
This behavior has been observed in the following environments
Actions