-
Notifications
You must be signed in to change notification settings - Fork 687
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
Introduce new rax function raxAllocSize
to return rax tree allocation size in constant time
#677
Comments
Sure, go for it! Just a thought: Is rax good for streams or should we consider replacing it with something else? We've replaced rax in various places and now it's almost only used in streams. But maybe it's actually really good for timestamps? (Common prefixes) |
Hi Viktor, can you give examples of where rax was replaced? Being sorted and providing range operations, I am guessing it's been replaced by a structure with those abilities as well (skiplist?). What would be a good test to consider replacing rax on timestamps for streams? Or asked differently, what motivated the switch away from rax in the other places? |
@knggk It was used for slot-to-key mapping. That was replaced by storing the keys in one dict per slot. Same for shard pubsub channels. Some other internal usages where replaced by dict i think, but i don't remember exactly. A sorted structure was not needed in those cases. |
@zuiderkwast Understood. I am not deeply familiar with streams, but it does require sorted elements to handle range operations (for example on timestamps in xrange, iterated on here Lines 1802 to 1804 in 32ca6e5
|
@knggk Sure, dict would not be an option for streams. Purely hypothetically, imagine btree or some other exotic structure. Radix trees are good for storing keys with common prefixes. Timestamps do have a long common prefix (when they're stored in big endian, which we do) so I believe it's a pretty good choice for streams. But after that, Salvatore started using the radix trees for various other things, where they may not have been the best data structure to use. |
@zuiderkwast Ok that makes sense. Thank you for providing that context and asking whether rax still makes sense. I've cut an initial attempt at adding the functionality (salvaged a previous attempt). Happy to take any feedback before adding tests. |
@knggk As part of your PR, or many someone else, can you consider porting https://github.com/antirez/rax/blob/master/rax-test.c over into our test base so we can write proper unit tests around the allocation tracking? |
@madolson Done updating the PR with rax-test.c. Doing Sounds like we're missing:
We can split the work with @kyle-yh-kim when we figure out how two people can work on a PR. On 1) and 3) I don't have precise ideas so far, input very welcome. |
@knggk Where's the PR? Did you use the new unit test framework under |
@zuiderkwast It's here #688. I tried to mention this issue (677) in that pull request thinking that's how you link an issue and a PR. Maybe I am confused. Re Another issue I've faced: On a Linux dev machine,
Note these failures are only on building the unit tests, not on building eg valkey-server. I don't have issues linking unit tests on local Mac Sonoma (I am continuing there for now). |
Ah, I see now "knggk mentioned this issue 2 days ago". Great. Even better: If you write " I'll look at the PR when I have some time. Thanks! |
Didn't know about |
Introduce a `size_t` field into the rax struct to track allocation size. Update the allocation size on rax insert and deletes. Return the allocation size when `raxAllocSize` is called. This size tracking is now used in MEMORY USAGE and MEMORY STATS in place of the previous method based on sampling. The module API allows to create sorted dictionaries, which are backed by rax. Users now also get precise memory allocation for them (through `ValkeyModule_MallocSizeDict`). Fixes valkey-io#677. For the release notes: * MEMORY USAGE and MEMORY STATS are now exact for streams, rather than based on sampling. --------- Signed-off-by: Guillaume Koenig <[email protected]> Signed-off-by: Guillaume Koenig <[email protected]> Co-authored-by: Joey <[email protected]> Co-authored-by: Viktor Söderqvist <[email protected]> Signed-off-by: naglera <[email protected]>
Introduce a `size_t` field into the rax struct to track allocation size. Update the allocation size on rax insert and deletes. Return the allocation size when `raxAllocSize` is called. This size tracking is now used in MEMORY USAGE and MEMORY STATS in place of the previous method based on sampling. The module API allows to create sorted dictionaries, which are backed by rax. Users now also get precise memory allocation for them (through `ValkeyModule_MallocSizeDict`). Fixes valkey-io#677. For the release notes: * MEMORY USAGE and MEMORY STATS are now exact for streams, rather than based on sampling. --------- Signed-off-by: Guillaume Koenig <[email protected]> Signed-off-by: Guillaume Koenig <[email protected]> Co-authored-by: Joey <[email protected]> Co-authored-by: Viktor Söderqvist <[email protected]>
Introduce a `size_t` field into the rax struct to track allocation size. Update the allocation size on rax insert and deletes. Return the allocation size when `raxAllocSize` is called. This size tracking is now used in MEMORY USAGE and MEMORY STATS in place of the previous method based on sampling. The module API allows to create sorted dictionaries, which are backed by rax. Users now also get precise memory allocation for them (through `ValkeyModule_MallocSizeDict`). Fixes valkey-io#677. For the release notes: * MEMORY USAGE and MEMORY STATS are now exact for streams, rather than based on sampling. --------- Signed-off-by: Guillaume Koenig <[email protected]> Signed-off-by: Guillaume Koenig <[email protected]> Co-authored-by: Joey <[email protected]> Co-authored-by: Viktor Söderqvist <[email protected]>
The problem/use-case that the feature addresses
Originally, the issue was opened in the Redis project to provide more visibility in
slotToKey
overhead [issue link].However, since version 7.4,
slotToKey
rax tree was replaced withkvstore->dicts[slot]
. While the original concern is no longer relevant, there still exist multiple motivations for introducingraxAllocSize
, namely;Limiting stream growth
raxAllocSize
will enable.Per-slot memory metric
Detailed
MEMORY STATS
overhead.rax
, for tracking internal rax tree used to manage Valkey server. Examples include; acl, aof, active defrag, config and networking.Description of the feature
size_t
field into the rax struct to track allocation size.raxAllocSize
is called.MEMORY STATS
is called.Alternatives you've considered
N/A.
Additional information
This is a revision of an already opened issue that never closed from the Redis project.
raxAllocSize
to return rax tree allocation size in constant time. redis/redis#9939The text was updated successfully, but these errors were encountered: