Fix deadlock in nix-store when max-connections=1 #4262
Merged
+2
−2
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.
This fixes a bug I encountered where
nix-store -qR
will deadlock whenthe
--include-outputs
flag is passed andmax-connections=1
.The deadlock occurs because
RemoteStore::queryDerivationOutputs
takesthe only connection from the connection pool and uses it to check the
daemon version. If the version is new enough, it calls
Store::queryDerivationOutputs
, which eventually callsRemoteStore::queryPartialDerivationOutputMap
, where we take anotherconnection from the connection pool to check the version again. Because
we still haven't released the connection from the caller, this waits for
a connection to be available, causing a deadlock.
This diff solves the issue by using
getProtocol
to check the protocolversion in the caller
RemoteStore::queryDerivationOutputs
, whichimmediately frees the connection back to the pool before returning the
protocol version. That way we've already freed the connection by the
time we call
RemoteStore::queryPartialDerivationOutputMap
.