Make PooledSocket.ReadAsync respect receive timeout setting #257
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.
We have seen examples of our memcached clients not timing out for several minutes on reads and/or writes in our Kubernetes environment under certain conditions occurring after node rebalancing and subsequent mecached pod rescheduling. This was despite us setting a very short (10ms) receive timeout in the client configuration.
After some digging, we realized that
Socket.ReceiveTimeout
only affects blocking receive calls. This is well-documented in the Socket.ReceiveTimeout docs, as well as the documentation for the underlyingsetsockopt
documentation (emphasis mine):This PR wraps calls to
NetworkStream.ReadAsync
inPooledSocket
in aTask.WhenAny(readTask, timeoutTask)
, a pattern already in use several other places in this codebase for other asynchronous socket operations. I also added tests to verify that the receive timeout setting is respected in both blocking and non-blockingPooledSocket
reads.