Timeout::ExitException can be raised by nested timeouts
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Ruby
- Sterne
- 168
- Forks
- 33
- Ø Merge
- 5 Std. 58 Min.
- Gemergte PRs (30 T.)
- 3
Beschreibung
Behavior
Nested timeout blocks can result in a Timeout::ExitException being raised, rather than a Timeout::Error
How to reproduce
The below will sometimes raise a Timeout::ExitException, sometimes a Timeout::Error (roughly 50/50).
begin
Timeout.timeout(2) do
Timeout.timeout(2) do
sleep 3
end
end
rescue Exception => e
puts "raised a #{e.class}"
end
Cause (maybe)
Hacking up the Timeout module as follows:
module Timeout
class Error
def self.handle_timeout(message) # :nodoc:
exc = ExitException.new(message)
begin
puts "yield #{exc.object_id} (#{message})"
yield exc
rescue ExitException => e
puts "test #{e.object_id} vs #{exc.object_id} => #{exc.equal?(e)} (#{message})"
raise new(message) if exc.equal?(e)
puts "re-raise #{e.object_id}('#{e}') (#{message})"
raise
end
end
end
end
Timeout.timeout(2, nil, "outer timeout") do
Timeout.timeout(2, nil, "inner timeout") do
sleep 3
end
end
shows that, when an ExitException is raised, the "inner" exception is being caught by the "outer" handle_timeout block. Suspicious this is the result of indeterminate Thread#raise behavior?
Environment
Ruby 3.3.5
Timeout 0.4.1
Ubuntu 24.04.1 running on WSL2
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne damit, den verschachtelten Timeout.timeout-Reproducer aus dem Issue auszuführen, und untersuche den Timeout.timeout-Pfad, insbesondere Timeout::Error.handle_timeout und die Behandlung von ExitException. Bestätige die Bedingungen, unter denen die innere Exception den äußeren Handler erreicht; als erledigt gilt die Aufgabe, wenn verschachtelte Timeouts konsistent Timeout::Error statt Timeout::ExitException auslösen, mit einer Regression-Prüfung für den Reproducer.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- ruby
- Bereich
- backend
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 42/100