Guarantee exclusive use of HttpClientConnection
.
#273
Merged
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.
When calling the HTTP
send
/open
functions,acquireConnection
iscalled to obtain a connection in state
Ready
. In the next code block,the connection state is advanced to
RequestHeadersSending
. However,returning from chronos
async
procs yields control, similar toawait
.This means that a connection may be added to the pool in
Ready
state,and then a different
acquireConnection
call may obtain a second ref.Introducing a new
Acquired
state ensures consistency in this case.No tests added due to this being scheduler dependent; ran manual tests
by adding a
doAssert item.state != HttpClientConnectionState.Acquired
between
if not(isNil(conn)):
andreturn conn
. Eventually, the assertgot hit after several hours of repeated tests, confirming the edge case
to be solved by applying this fix.
Not sure if it is by design that returning from an
async
proc yields.Even if it's not, this should solve current HTTP issues in nimbus-eth2.