Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use spawn_blocking to increase request throughput #243

Merged
merged 3 commits into from
Jul 20, 2021
Merged

Conversation

giarc3
Copy link
Member

@giarc3 giarc3 commented Jul 20, 2021

Description in #241 (comment) by @skeet70:

AES decrypts and Recrypt transforms were both happening in the decrypt future after the network DocumentGet for metadata comes back. This meant that the future was doing a big chunk of CPU heavy crypto work without yielding or doing anything special to accommodate it. We should have a PR soon that uses tokio::spawn_blocking to explicitly move that section of the future onto a threadpool for heavy stuff, allowing the normal threadpool to keep cranking on the network work. This immediately improved CPU utilization.

Copy link
Contributor

@clintfred clintfred left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

src/internal.rs Outdated
@@ -195,6 +195,9 @@ quick_error! {
OperationTimedOut{operation: SdkOperation, duration: std::time::Duration} {
display("Operation {} timed out after {}ms", operation, duration.as_millis())
}
JoinError(err: tokio::task::JoinError) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the addition of this error type means we should do a minor version bump.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://doc.rust-lang.org/cargo/reference/semver.html#enum-variant-new looks like major is actually the recommendation for adding more variants to an enum, should probably do that.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a cool page @skeet70, hadn't seen that before. It makes sense that it's considered a breaking change because someone matching over it would need to include the new type for the match to be exhaustive. Should we do a major bump or work to avoid that? If someone has a recommendation for an existing variant that works, I could use that.

If we do bump major, we could consider adding #[non_exhaustive] onto it so that we're free to add new variants in the future without a major bump.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was also wondering about non_exhaustive. I also realized, looking at this, that we would be adding a tokio error to our public API. We already expose error from ring and protobuf, but maybe we should stop doing that.

The chances of a consumer enumerating all of these error types in a match is effectively zero, so maybe allowing non-exhaustive would be fine.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://doc.rust-lang.org/reference/attributes/type_system.html#the-non_exhaustive-attribute for reference. In TSP code recently I wrote that matches! that enumerates the couple that mattered to me there and ignored the rest. AFAIK non_exhaustive would just always force people to do something with the "rest" even if they've enumerated everything that exists right now. I don't think that would've affected my code. It could be a minor annoyance if you really did want to be exhaustive (and know you were) but I can't think of a use case where you wouldn't be able to have some catch all fallback at the application level.

https://rust-lang.github.io/rfcs/2008-non-exhaustive.html#enums the RFC for it explicitly called out error types being the most common use case.

I think we make this non_exhaustive.

src/internal/document_api.rs Outdated Show resolved Hide resolved
Copy link
Contributor

@clintfred clintfred left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Merge on green and release, please.

@giarc3 giarc3 merged commit 12e77df into main Jul 20, 2021
@giarc3 giarc3 deleted the spawn-blocking branch July 20, 2021 19:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants