-
Notifications
You must be signed in to change notification settings - Fork 89
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
[router] Reduced allocations in router read path #1367
Conversation
...ice-router/src/main/java/com/linkedin/venice/router/api/RouterExceptionAndTrackingUtils.java
Outdated
Show resolved
Hide resolved
3c28320
to
ccdca3e
Compare
Carved out a portion of this big-ish PR into this other fairly trivial PR: #1405. |
ccdca3e
to
9a5d502
Compare
Rebased after merging #1405 to reduce the PR size, but also added a flaky test fix which still increases it a bit more 😅 ... oh well 🤷 |
Will be able to further reduce the size of this PR after rebasing on top of #1413. EDIT: Done. |
9a5d502
to
bbc9f53
Compare
d1bd342
to
85a52c5
Compare
A lot of multi-key specific state was moved out of VenicePath and into its subclasses, which makes single get queries require less heap space. This includes streaming (chunkedResponse), HAR (helixGroupId and requestId), longTailRetryThresholdMs and responseHeaders. In addition, all kinds of VenicePaths are also getting their heap size reduced by leveraging shared instances where possible. For example: - The resourceName, storeName and versionNumber properties are replaced by a single reference to a shared instance of StoreVersionName, which is a new class obtained from a NameRepository. - The smartLongTailRetryEnabled, smartLongTailRetryAbortThresholdMs and longTailRetryThresholdMs properties are replaced by a single pointer to a RouterRetryConfig object, which is a simple facade wrapping the VeniceRouterConfig. - Removed the time property from VenicePath since the only time it is used by tests to inject a MockTime, it is done from a subclass, and therefore can be achieved via extension, rather than composition. - The responseDecompressor is now coming from a map of shared instances in the VenicePathParser. New config: - name.repository.max.entry.count : controls the maximum number of entries (per type) to be cached in the NameRepository class. For now this config is used only in the router, but it would likely become used in the server and controller as well, later on. Miscellaneous: - Various refactorings enable the VenicePath constructors to have fewer params and to make more of the properties final. - Made use of StoreName rather than String in the VenicePathParser's RetryManager maps. - Added a default IntSet getVersionNumbers function to the Store interface. This is a convenience function since oftentimes we only want the version numbers, and not the complete Version objects. - Cleaned up generics in the VenicePathParser and ScatterGatherHelper builder. - Deleted VeniceMetricsProvider which can be trivially inlined.
85a52c5
to
d647969
Compare
Rebased |
services/venice-router/src/main/java/com/linkedin/venice/router/api/VenicePartitionFinder.java
Show resolved
Hide resolved
...ces/venice-router/src/main/java/com/linkedin/venice/router/api/path/VeniceSingleGetPath.java
Show resolved
Hide resolved
services/venice-router/src/main/java/com/linkedin/venice/router/api/path/VenicePath.java
Show resolved
Hide resolved
services/venice-router/src/main/java/com/linkedin/venice/router/api/VenicePathParser.java
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good, dropped a few questions here and there, but I didn't see anything untoward. Thanks for the clean up!
Thanks for the review! |
A lot of multi-key specific state was moved out of VenicePath and into its subclasses, which makes single get queries require less heap space. This includes streaming (chunkedResponse), HAR (helixGroupId and requestId), longTailRetryThresholdMs and responseHeaders.
In addition, all kinds of VenicePaths are also getting their heap size reduced by leveraging shared instances where possible. For example:
The resourceName, storeName and versionNumber properties are replaced by a single reference to a shared instance of StoreVersionName, which is a new class obtained from a NameRepository.
The smartLongTailRetryEnabled, smartLongTailRetryAbortThresholdMs and longTailRetryThresholdMs properties are replaced by a single pointer to a RouterRetryConfig object, which is a simple facade wrapping the VeniceRouterConfig.
Removed the time property from VenicePath since the only time it is used by tests to inject a MockTime, it is done from a subclass, and therefore can be achieved via extension, rather than composition.
The responseDecompressor is now coming from a map of shared instances in the VenicePathParser.
New config:
Miscellaneous:
Various refactorings enable the VenicePath constructors to have fewer params and to make more of the properties final.
Made use of StoreName rather than String in the VenicePathParser's RetryManager maps.
Added a default IntSet getVersionNumbers function to the Store interface. This is a convenience function since oftentimes we only want the version numbers, and not the complete Version objects.
Cleaned up generics in the VenicePathParser and ScatterGatherHelper builder.
Deleted VeniceMetricsProvider which can be trivially inlined.
How was this PR tested?
CI.
Does this PR introduce any user-facing changes?