fix: the cpuload 100% in case the tcpstream WouldBlock #3029
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.
Fix #3025
In #2855, we refactored the p2p code to use blocking IO instead of non-blocking, which returns us the dramatically reduced CPU load.
But the Rust
TcpStream
behavior for blocking mode is not as expected in some cases.For example, the
stream.read_exact()
will practically return immediately if the underlined stream would block.i.e. the so-called
WouldBlock
error:Err(Os { code: 35, kind: WouldBlock, message: "Resource temporarily unavailable" })
Then, the p2p
poll()
will just seamlessly call thestream.read_exact()
in the loop, which in result will give us a 100% cpu load at this case.