fix: Blocking commands respect canceled context #2433
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.
Description
This fixes an issue where blocking commands like
XRead
andXReadGroup
could not be canceled using the provided context. Similarly with*PubSub.Receive
.Fixes #2276
Supersedes #2432
Approach
I looked holistically at places in the code where a connection was being used without inspecting the context and applied the same basic pattern. Once a timeout is reached, the recommendation is to close the connection. Note that the change to
*PubSub.ReceiveTimeout
does not explicitly close the connection since that is already handled by the subsequent*PubSub.releaseConnWithLock
.Note that with this change, the
ContextTimeoutEnabled
client option is redundant. Can we deprecate it?Testing
The new tests that I added all failed without this change. Note that I did not add new tests for the
processPipeline
andprocessTxPipeline
changes, since pipelining blocking commands does not make sense. However, if you can think of a good test case I will be happy to add it.