Prevent deadlock due to system call error #159
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.
The MQTT client runs in the main thread which consumes incoming MQTT messages from a
Thread::Queue
called@read_queue
. This queue is fed by the@read_thread
, a child thread which reads from a socket in an infinite loop.We noticed that our application stopped processing incoming MQTT messages, but did not seem to exit or throw an exception either. Upon inspecting the logs, we saw that the
@read_thread
had crashed due to an unhandledErrno::ECONNRESET
while reading from the socket. This had the consuming thread then sleep forever while waiting for new meassages on the@read_queue
.It turned out that the
MQTT::Client#receive_packet
method had appropriate error handling in placebut this did not rescue
Errno::ECONNRESET
even thoughException
is at the top of the hierarchy ofRuby's built-in exception classes.
The root cause was that the library also defines a class
MQTT::Exception
and in the context of#receive_packet
the constantException
refers only toMQTT::Exception
(which does not coverErrno::ECONNRESET
) where it actually should rescue any subclass of::Exception
.