Wrap the interruption to a custom exception when a blocking API is interrupted #99
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.
Motivation
Currently, when a blocking API is interrupted by a signal,
SystemError
will be thrown. However, in this case,PyErr_SetInterrupt
will be called and next time a blocking API is called,std::system_error
will be somehow thrown.The failure of
https://lists.apache.org/thread/cmzykd9qz9x1d0s35nc5912o3slwpxpv is caused by this issue. The
SystemError
is not called, thenclient.close()
will be skipped, which leads to thebad_weak_ptr
error.P.S. Currently we have to call
client.close()
on aClient
instance, otherwise, thebad_weak_ptr
will be thrown.However, even if we caught the
SystemError
like:we would still see the following error:
Modifications
ResultInterrupted
into thepulsar.Interrupted
exception.waitForAsyncValue
andwaitForAsyncResult
functions and raisepulsar.Interrupted
whenPyErr_CheckSignals
detects a signal.InterruptedTest
to cover this case.future.h
since we now usestd::future
instead of the manually implementedFuture
.examples/consumer.py
to support stopping by Ctrl+C.