Set autoclose: false on socket to prevent GC from closing it #59
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.
Hiredis::Ext::Connection#sock
creates aSocket
object usingSocket.for_fd
, wrapping the socket managed in C by hiredis and returns it to the caller. TheSocket
does not haveautoclose
set tofalse
, so this has the unwanted side-effect that once the object becomes stale and is GC'd, the underlying file descriptor will be closed. This can causeErrno::EBADF
errors, as outlined in Ruby Bug #1174, especially when the Redis driver performs a reconnect and creates a new instance ofHiredis::Ext::Connection
, forgetting the old one completely.Note that
Errno::EBADF
errors might affect other parts of the program, as the FD is closed at GC time and it may refer to something else. The following script reproduces the issue:Fix this by setting
autoclose
tofalse
when creating theSocket
object.