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,
SystemErrorwill be thrown. However, in this case,PyErr_SetInterruptwill be called and next time a blocking API is called,std::system_errorwill be somehow thrown.The failure of
https://lists.apache.org/thread/cmzykd9qz9x1d0s35nc5912o3slwpxpv is caused by this issue. The
SystemErroris not called, thenclient.close()will be skipped, which leads to thebad_weak_ptrerror.P.S. Currently we have to call
client.close()on aClientinstance, otherwise, thebad_weak_ptrwill be thrown.However, even if we caught the
SystemErrorlike:we would still see the following error:
Modifications
ResultInterruptedinto thepulsar.Interruptedexception.waitForAsyncValueandwaitForAsyncResultfunctions and raisepulsar.InterruptedwhenPyErr_CheckSignalsdetects a signal.InterruptedTestto cover this case.future.hsince we now usestd::futureinstead of the manually implementedFuture.examples/consumer.pyto support stopping by Ctrl+C.