Fix ThreadError on calling stop in Signal.trap #1295
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
When
Appsignal.stop
is called inside aSignal.trap
block, it raises aThreadError
. This is because ourCheckIn::Scheduler
callsMutex#synchronize
and this is not allowed in Ruby.Source: https://docs.ruby-lang.org/en/master/signals_rdoc.html
To fix this, wrap the entire
Appsignal.stop
method contents in a Thread, and join it at the end. This does exactly the same, but in a thread, and makes Ruby happy.This solution is inspired by this StackOverflow answer: https://stackoverflow.com/a/28052251/543643
To test this, I didn't want to declare
Signal.trap
inside the RSpec process for a unit test. Instead created an integration test that runs a script that has a signal trap and callsAppsignal.stop
from within that signal trap.The Runner helper class implementation is largely copied from the Diagnose integration test submodule.