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

[router] Reduced allocations in router read path #1367

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

FelixGV
Copy link
Contributor

@FelixGV FelixGV commented Dec 4, 2024

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.

How was this PR tested?

CI.

Does this PR introduce any user-facing changes?

  • No. You can skip the rest of this section.
  • Yes. Make sure to explain your proposed changes and call out the behavior change.

@FelixGV
Copy link
Contributor Author

FelixGV commented Dec 18, 2024

Carved out a portion of this big-ish PR into this other fairly trivial PR: #1405.

@FelixGV FelixGV force-pushed the router_allocation_cleanup branch from ccdca3e to 9a5d502 Compare December 19, 2024 04:05
@FelixGV
Copy link
Contributor Author

FelixGV commented Dec 19, 2024

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 🤷

@FelixGV
Copy link
Contributor Author

FelixGV commented Dec 20, 2024

Will be able to further reduce the size of this PR after rebasing on top of #1413.

EDIT: Done.

@FelixGV FelixGV force-pushed the router_allocation_cleanup branch from 9a5d502 to bbc9f53 Compare December 21, 2024 17:02
@FelixGV FelixGV force-pushed the router_allocation_cleanup branch 2 times, most recently from a6b2a01 to d1bd342 Compare January 8, 2025 02:01
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.
@FelixGV FelixGV force-pushed the router_allocation_cleanup branch from d1bd342 to 85a52c5 Compare January 8, 2025 02:07
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.

2 participants