-
-
Notifications
You must be signed in to change notification settings - Fork 116
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
[udp] make response message cache configurable and update default #589
Conversation
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
Modifies UDP conn implementation to allow for a custom response message cache to be provided. This change is implemented in such a way that API compatibility with previous v3 releases is preserved. Users may now provide an option to supply their own cache implementation. Structured messages, rather than their serialized representation, are now passed to the cache implementation to allow for caching decisions to be made in the cache implementation. For example, it may be desirable to skip caching blockwise message responses if the entire underlying data being transferred is also cached. The cache implementation is responsible for cloning messages or otherwise ensuring that it is not storing data that may subsequently be modified. A slight functional change is also included in this update in that the default cache implementation now has pseudo-LRU functionality via ccache. When 30 newer messages are added to the cache, the 31st is marked for deletion. Note that deletion is not immediate in ccache and expired items can be returned. A check is added to ignore items that are returned expired. Further performance improvements can be made in the default cache implementation. For example, while this implementation dramatically improves memory consumption for connections performing large volumes of requests, it also increases the total overhead of every new connection. However, because the implementation is now pluggable, improvements can be made without requiring updates to the library or breaking API changes. Signed-off-by: Daniel Mangum <[email protected]>
27dce8f
to
67a80d4
Compare
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.
I have opened #590 as a replacement for this PR. I've played around with a number of popular Go in-memory caches, and though I do think the default cache used should employ some LRU functionality to keep the size bounded, all implementations I have tested have exhibited one or more of the following drawbacks:
- They don't also support TTL expiration.
- They are designed to run forever and do not expose functionality for stopping their background worker process (Why Expirable-LRU delete Close method? hashicorp/golang-lru#159).
- There are questions regarding cleaning up the cache after use (Cache can't be garbage collected karlseguin/ccache#3, Stop can cause race detector errors in testing karlseguin/ccache#59, Memory leak during cleanup karlseguin/ccache#81).
- They require cleanup at all. Initially I liked the property of the cache expirations being divorced from the
CheckExpirations()
functionality of theudp.Conn
. However, this mandates thatClose()
be called, orRun()
be called and eventually exit. If audp.Conn
is created and then not manually cleaned up, resources could be leaked.
I think we could add minimal LRU functionality to the existing cache, though for now #590 makes it such that caching decisions can be owned by consumers, which allows for providing an LRU cache if desired. I'd prefer to move forward with that strategy and see if we can determine a better default implementation based on feedback.
Replaced by #590 |
Modifies UDP conn implementation to allow for a custom response message cache to be provided. This change is implemented in such a way that API compatibility with previous v3 releases is preserved. Users may now provide an option to supply their own cache implementation. Structured messages, rather than their serialized representation, are now passed to the cache implementation to allow for caching decisions to be made in the cache implementation. For example, it may be desirable to skip caching blockwise message responses if the entire underlying data being transferred is also cached. The cache implementation is responsible for cloning messages or otherwise ensuring that it is not storing data that may subsequently be modified.
A slight functional change is also included in this update in that the default cache implementation now has pseudo-LRU functionality via ccache. When 30 newer messages are added to the cache, the 31st is marked for deletion. Note that deletion is not immediate in ccache and expired items can be returned. A check is added to ignore items that are returned expired.
Further performance improvements can be made in the default cache implementation. For example, while this implementation dramatically improves memory consumption for connections performing large volumes of requests, it also increases the total overhead of every new connection. However, because the implementation is now pluggable, improvements can be made without requiring updates to the library or breaking API changes.
Fixes #586