Disconnect clients from pool safely #753
Closed
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.
This PR tries to solve the issues raised by #732 regarding
the danger of disconnect clients from the
ConnectionPool.disconnect
method executed by a Thread different that those ones that are in charge
of the connections.
Instead of call the
Connection.disconnect
method it uses the syscallshutdown
to leave the socket unusable. Once the connection tries to usethe socket, even when it is already blocked such us the
PubSub
pattern, itgets a
socket.error
exception that will be cactched by theConnection
class to then raise anConnectionError
and disconnect thesocket in a clean and safe way.
The
Client.execute_command
function catches theConnectionError
exceptionand tries to connect again and run the command that raised the error.
Worth mentioning that in the case of the
Sentinel
environment, if the disconnect was because of achange of the Redis pool servers - perhaps the master went
down and a slave was promoted, the next command will be executed using a new connection that will take into account these changes.