GODRIVER-2109 Prevent a data race between connecting and checking out a connection from the resourcePool. #728
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.
GODRIVER-2109
There is currently a data race on the field
connection.desc
between setting it at connection.go#L231 and reading it at pool.go#L199 and pool.go#L535. The data race occurs when theresourcePool.Maintain()
function adds connections to satisfyminPoolSize
(only whenminPoolSize > 0
). The unconnected connections are added to theresourcePool
and then connected in a separate goroutine, which results in concurrent access to theconnection.desc
field when another goroutine attempts to get the connection from theresourcePool
.Changes:
connection
that guards access to thedesc
field, preventing a data race between setting and reading the value.Note that the logic for determining if a connection is stale based on the
poolGenerationMap
is intentionally unchanged. There is currently no way to know exactly what state a connection is in whileconn.connected == connected
without waiting forconn.wait()
, which may take an indefinite amount of time. Instead, we preserve the existing behavior until the refactor in GODRIVER-2038.