-
Notifications
You must be signed in to change notification settings - Fork 876
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
fix(zset): fix random in ZRANDMEMBER command #2994
Conversation
88e71c8
to
c7e7f8b
Compare
Hi @BagritsevichStepan - thank you very much for this PR. I understand that you are aware of the tradeoffs - you specified them in the PR description. You decided to implement a high quality random selection, to preserve the uniformity properties of the algorithm but have more Can you explain why do you think a naive " Simple random sampling with replacement" (SRSWR) algorithm won't work here? |
8becf94
to
1741f15
Compare
Hi @romange, Then the algorithm finds the elements from the sorted set by the generated indexes. There are also two options here:
If I'm not mistaken, the current implementation of HRANDFIELD command uses only the second case and thus has Note: The |
1741f15
to
542405a
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.
LGTM
src/server/zset_family_test.cc
Outdated
// Test WITHSCORES | ||
using ZSetEntry = std::pair<std::string, std::string>; | ||
std::set<ZSetEntry> expected_entries_with_scores{{"a", "1"}, {"b", "2"}, {"c", "3"}}; | ||
|
||
auto parse_response_with_scores = [](const auto& resp) { | ||
auto vec = resp.GetVec(); | ||
|
||
std::vector<ZSetEntry> entries; | ||
for (std::size_t i = 1; i < vec.size(); i += 2) { | ||
entries.emplace_back(vec[i - 1].GetString(), vec[i].GetString()); | ||
} | ||
return entries; | ||
}; | ||
|
||
resp = Run({"ZRandMember", "x", "1", "WITHSCORES"}); |
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.
Just a small nit:
MATCHER_P(AreScoredArrayMatcher, array, "") {
RespExpr arg_expr = arg;
// check all (p for p in `args` is in array)
}
auto AreScoredArray(std::initializer_list<pair<string,string>> l) {
return AreScoredArrayMatcher(l);
}
would be a more gtest'y way of doing things 😅
src/server/zset_family.cc
Outdated
if (!IndexWasPicked(random_index)) { | ||
picked_indexes_.insert(random_index); |
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.
nit: there is emplace()
src/server/zset_family.cc
Outdated
auto generator = [count, picks_count, size]() -> std::unique_ptr<PicksGenerator> { | ||
if (count >= 0) { | ||
return std::make_unique<UniquePicksGenerator>(picks_count, size); | ||
} else { | ||
return std::make_unique<NonUniquePicksGenerator>(size); | ||
} | ||
}(); |
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.
nit: cool trick but maybe less readable than just
unique ? static_cast<unique_ptr<A>>(make_unique<B>()) : make_unique<C>();
or an if with the generator delcared before
542405a
to
5182d15
Compare
0bdb298
to
5ce6260
Compare
virtual ~PicksGenerator() = default; | ||
}; | ||
|
||
class NonUniquePicksGenerator : public PicksGenerator { |
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.
This classes are generic generators
I think that total_size_ can be renamed to max_range type uint32_t
also return value from Generate can be changed to uint32_t
src/server/zset_family.cc
Outdated
} | ||
|
||
RandomPick Generate() override { | ||
const std::size_t max_index = current_random_limit_++; |
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 would add a dcheck that generate is called not more than picks_count
"3", | ||
"c", | ||
}); | ||
auto resp = Run({"ZAdd", "x", "1", "a", "2", "b", "3", "c"}); |
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.
This is good coverage of unit tests
good work here!
5ce6260
to
bee35fe
Compare
I fixed the code review comments. @adiholden @dranikpg please take a second look, thank you! |
bee35fe
to
e604df2
Compare
@BagritsevichStepan the code looks good |
fixes dragonflydb#2850 Signed-off-by: Stepan Bagritsevich <sbagritsevich@quantumbrains.com>
e604df2
to
1e696aa
Compare
…nfly ( v1.17.1 → v1.18.0 ) (#539) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [docker.dragonflydb.io/dragonflydb/dragonfly](https://togithub.com/dragonflydb/dragonfly) | minor | `v1.17.1` -> `v1.18.0` | --- ### Release Notes <details> <summary>dragonflydb/dragonfly (docker.dragonflydb.io/dragonflydb/dragonfly)</summary> ### [`v1.18.0`](https://togithub.com/dragonflydb/dragonfly/releases/tag/v1.18.0) [Compare Source](https://togithub.com/dragonflydb/dragonfly/compare/v1.17.1...v1.18.0) ##### Dragonfly v1.18.0 Some prominent changes include: - ACL improvements: [#​2945](https://togithub.com/dragonflydb/dragonfly/issues/2945) [#​2943](https://togithub.com/dragonflydb/dragonfly/issues/2943) [#​2920](https://togithub.com/dragonflydb/dragonfly/issues/2920) [#​2982](https://togithub.com/dragonflydb/dragonfly/issues/2982) [#​2995](https://togithub.com/dragonflydb/dragonfly/issues/2995) - Implementation of json.merge [#​2960](https://togithub.com/dragonflydb/dragonfly/issues/2960) - Replication - memory improvements - Very much alpha support for data tiering. Try it out with `--tiered_prefix=/pathto/ssd/base` and see how your memory usage goes down (STRING type only). Do not use it in prod! 😸 ##### What's Changed - feat: retry ACK if the configs are different [#​2833](https://togithub.com/dragonflydb/dragonfly/issues/2833) by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#2906 - chore(tiering): Update Get, Set, Del by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2897 - chore: preparation step for lock fingerprints by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2899 - fix(transaction): Use FinishHop in schedule by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2911 - chore(tiering): Fix MacOs build by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2913 - feat(cluster): Migration cancellation support by [@​chakaz](https://togithub.com/chakaz) in [dragonflydb/dragonfly#2869 - feat: process migration data after FIN opcode [#​2864](https://togithub.com/dragonflydb/dragonfly/issues/2864) by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#2918 - chore(string_family): Refactor SetCmd by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2919 - fix: Improve reply latency of HELLO by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2925 - chore: improve reply latency of SendScoredArray by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2929 - Namespace support in prometheus rule by [@​Pothulapati](https://togithub.com/Pothulapati) in [dragonflydb/dragonfly#2931 - fix: socket closed when RegisterOnErrorCb is called in HandleRequests by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2932 - chore: bring more clarity when replayer fails by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2933 - Slot migration cancel crash fix by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#2934 - feat: add ability reaply config with migration [#​2924](https://togithub.com/dragonflydb/dragonfly/issues/2924) by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#2926 - fix(test): Unflake fuzzy cluster migration test by [@​chakaz](https://togithub.com/chakaz) in [dragonflydb/dragonfly#2927 - chore: Remove Schedule() call by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2938 - chore: get rid of lock keys by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2894 - fix: introduce info_replication_valkey_compatible flag by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2936 - feat(metrics): adding max_clients to metrics and info output ([#​2912](https://togithub.com/dragonflydb/dragonfly/issues/2912)) by [@​racamirko](https://togithub.com/racamirko) in [dragonflydb/dragonfly#2940 - chore: adjust transaction code to keystep/3 commands by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2941 - feat(tiering): Get, GetSet, Set test by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2921 - chore(acl): adjust some ACL command responses by [@​Niennienzz](https://togithub.com/Niennienzz) in [dragonflydb/dragonfly#2943 - chore: Pull helio with new future by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2944 - refactor: add cluster namespace by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#2948 - chore: Introduce ShardArgs as a distinct type by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2952 - chore: Log db_index in traffic logger by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2951 - fixes for v1.18.0 by [@​adiholden](https://togithub.com/adiholden) in [dragonflydb/dragonfly#2956 - feat(tiering): Support append (and modifications in general) by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2949 - feat: extended bracket index in jsonpath by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2954 - chore: Remove TieringV1 by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2962 - fix(pytests): replace proc.wait() with proc.communicate() to avoid deadlocks by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2964 - feat(tiering): Registered buffers by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2967 - feat: add slot migration error processing by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#2957 - chore(acl): allow multiple users in acl deluser by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2945 - feat: implement json.merge by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2960 - fix: fix deadlock and slot flush for migration cancel [#​2968](https://togithub.com/dragonflydb/dragonfly/issues/2968) by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#2972 - chore(tiering): Lots of metrics by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2977 - fix: crash during migration when connection is closing by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2973 - fix: remove acl-check and cancel instead when REPLCONF ACK fails to validate by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2920 - fix: check return code of process after communicate by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2976 - fix: allow non hashed passwords when loading users from acl file by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2982 - chore: update our container distributions versions by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2983 - chore: remove version checks when running our regtests by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2988 - chore(acl): add vlog and check on deluser flow by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2995 - fix(memcached): Register memcached listener to handle `--maxclients` by [@​chakaz](https://togithub.com/chakaz) in [dragonflydb/dragonfly#2985 - chore: another preparation commit to get rid of kv_args in transaction by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2996 - chore: improve performance of Scan operation by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2990 - fix(server): small string allocations only under 256 bytes str by [@​adiholden](https://togithub.com/adiholden) in [dragonflydb/dragonfly#2991 - fix(cluster-migration): Support cancelling migration right after starting it by [@​chakaz](https://togithub.com/chakaz) in [dragonflydb/dragonfly#2992 - chore: fix double header issue by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#3002 - chore: small tiering fixes by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2966 - feat(benchmark-tests): run in K8s by [@​zacharya19](https://togithub.com/zacharya19) in [dragonflydb/dragonfly#2965 - Benchmark fixes by [@​zacharya19](https://togithub.com/zacharya19) in [dragonflydb/dragonfly#3005 - fix(tiering): rename v2 + max_file_size by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#3004 - chore: fix tiering macos stub by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#3006 - chore: export listener stats by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#3007 - chore: pull latest helio by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#3009 - fix(server): lag is 0 when server not in stable state by [@​adiholden](https://togithub.com/adiholden) in [dragonflydb/dragonfly#3010 - chore: get rid of kv_args and replace it with slices to full_args by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2942 - fix(server): non auto journal write after callback finish by [@​adiholden](https://togithub.com/adiholden) in [dragonflydb/dragonfly#3016 - fix(server): shrink replication steaming buf by [@​adiholden](https://togithub.com/adiholden) in [dragonflydb/dragonfly#3012 - fix(zset): fix random in ZRANDMEMBER command by [@​BagritsevichStepan](https://togithub.com/BagritsevichStepan) in [dragonflydb/dragonfly#2994 - Fix benchmark by [@​adiholden](https://togithub.com/adiholden) in [dragonflydb/dragonfly#3017 - chore: Remove tiering test skip by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#3011 - feat(tiering): simple offload loop by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2987 - feat(tiering): MGET support by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#3013 - Revert "chore: get rid of kv_args and replace it with slices to full\_… by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#3024 - chore(dash): Replace comparator with predicate by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#3025 - feat: add defragment command by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#3003 ##### Huge thanks to all the contributors! ❤️ ##### New Contributors - [@​racamirko](https://togithub.com/racamirko) made their first contribution in [dragonflydb/dragonfly#2940 - [@​BagritsevichStepan](https://togithub.com/BagritsevichStepan) made their first contribution in [dragonflydb/dragonfly#2994 **Full Changelog**: dragonflydb/dragonfly@v1.17.0...v1.18.0 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zNTIuMCIsInVwZGF0ZWRJblZlciI6IjM3LjM1Mi4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19--> Co-authored-by: kireque-bot[bot] <143391978+kireque-bot[bot]@users.noreply.github.com>
…18.0 ) (#4656) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ghcr.io/dragonflydb/dragonfly](https://togithub.com/dragonflydb/dragonfly) | minor | `v1.17.1` -> `v1.18.0` | --- > [!WARNING] > Some dependencies could not be looked up. Check the Dependency Dashboard for more information. --- ### Release Notes <details> <summary>dragonflydb/dragonfly (ghcr.io/dragonflydb/dragonfly)</summary> ### [`v1.18.0`](https://togithub.com/dragonflydb/dragonfly/releases/tag/v1.18.0) [Compare Source](https://togithub.com/dragonflydb/dragonfly/compare/v1.17.1...v1.18.0) ##### Dragonfly v1.18.0 Some prominent changes include: - ACL improvements: [#​2945](https://togithub.com/dragonflydb/dragonfly/issues/2945) [#​2943](https://togithub.com/dragonflydb/dragonfly/issues/2943) [#​2920](https://togithub.com/dragonflydb/dragonfly/issues/2920) [#​2982](https://togithub.com/dragonflydb/dragonfly/issues/2982) [#​2995](https://togithub.com/dragonflydb/dragonfly/issues/2995) - Implementation of json.merge [#​2960](https://togithub.com/dragonflydb/dragonfly/issues/2960) - Replication - memory improvements - Very much alpha support for data tiering. Try it out with `--tiered_prefix=/pathto/ssd/base` and see how your memory usage goes down (STRING type only). Do not use it in prod! 😸 ##### What's Changed - feat: retry ACK if the configs are different [#​2833](https://togithub.com/dragonflydb/dragonfly/issues/2833) by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#2906 - chore(tiering): Update Get, Set, Del by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2897 - chore: preparation step for lock fingerprints by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2899 - fix(transaction): Use FinishHop in schedule by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2911 - chore(tiering): Fix MacOs build by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2913 - feat(cluster): Migration cancellation support by [@​chakaz](https://togithub.com/chakaz) in [dragonflydb/dragonfly#2869 - feat: process migration data after FIN opcode [#​2864](https://togithub.com/dragonflydb/dragonfly/issues/2864) by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#2918 - chore(string_family): Refactor SetCmd by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2919 - fix: Improve reply latency of HELLO by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2925 - chore: improve reply latency of SendScoredArray by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2929 - Namespace support in prometheus rule by [@​Pothulapati](https://togithub.com/Pothulapati) in [dragonflydb/dragonfly#2931 - fix: socket closed when RegisterOnErrorCb is called in HandleRequests by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2932 - chore: bring more clarity when replayer fails by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2933 - Slot migration cancel crash fix by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#2934 - feat: add ability reaply config with migration [#​2924](https://togithub.com/dragonflydb/dragonfly/issues/2924) by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#2926 - fix(test): Unflake fuzzy cluster migration test by [@​chakaz](https://togithub.com/chakaz) in [dragonflydb/dragonfly#2927 - chore: Remove Schedule() call by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2938 - chore: get rid of lock keys by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2894 - fix: introduce info_replication_valkey_compatible flag by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2936 - feat(metrics): adding max_clients to metrics and info output ([#​2912](https://togithub.com/dragonflydb/dragonfly/issues/2912)) by [@​racamirko](https://togithub.com/racamirko) in [dragonflydb/dragonfly#2940 - chore: adjust transaction code to keystep/3 commands by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2941 - feat(tiering): Get, GetSet, Set test by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2921 - chore(acl): adjust some ACL command responses by [@​Niennienzz](https://togithub.com/Niennienzz) in [dragonflydb/dragonfly#2943 - chore: Pull helio with new future by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2944 - refactor: add cluster namespace by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#2948 - chore: Introduce ShardArgs as a distinct type by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2952 - chore: Log db_index in traffic logger by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2951 - fixes for v1.18.0 by [@​adiholden](https://togithub.com/adiholden) in [dragonflydb/dragonfly#2956 - feat(tiering): Support append (and modifications in general) by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2949 - feat: extended bracket index in jsonpath by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2954 - chore: Remove TieringV1 by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2962 - fix(pytests): replace proc.wait() with proc.communicate() to avoid deadlocks by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2964 - feat(tiering): Registered buffers by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2967 - feat: add slot migration error processing by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#2957 - chore(acl): allow multiple users in acl deluser by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2945 - feat: implement json.merge by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2960 - fix: fix deadlock and slot flush for migration cancel [#​2968](https://togithub.com/dragonflydb/dragonfly/issues/2968) by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#2972 - chore(tiering): Lots of metrics by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2977 - fix: crash during migration when connection is closing by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2973 - fix: remove acl-check and cancel instead when REPLCONF ACK fails to validate by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2920 - fix: check return code of process after communicate by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2976 - fix: allow non hashed passwords when loading users from acl file by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2982 - chore: update our container distributions versions by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2983 - chore: remove version checks when running our regtests by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2988 - chore(acl): add vlog and check on deluser flow by [@​kostasrim](https://togithub.com/kostasrim) in [dragonflydb/dragonfly#2995 - fix(memcached): Register memcached listener to handle `--maxclients` by [@​chakaz](https://togithub.com/chakaz) in [dragonflydb/dragonfly#2985 - chore: another preparation commit to get rid of kv_args in transaction by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2996 - chore: improve performance of Scan operation by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2990 - fix(server): small string allocations only under 256 bytes str by [@​adiholden](https://togithub.com/adiholden) in [dragonflydb/dragonfly#2991 - fix(cluster-migration): Support cancelling migration right after starting it by [@​chakaz](https://togithub.com/chakaz) in [dragonflydb/dragonfly#2992 - chore: fix double header issue by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#3002 - chore: small tiering fixes by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2966 - feat(benchmark-tests): run in K8s by [@​zacharya19](https://togithub.com/zacharya19) in [dragonflydb/dragonfly#2965 - Benchmark fixes by [@​zacharya19](https://togithub.com/zacharya19) in [dragonflydb/dragonfly#3005 - fix(tiering): rename v2 + max_file_size by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#3004 - chore: fix tiering macos stub by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#3006 - chore: export listener stats by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#3007 - chore: pull latest helio by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#3009 - fix(server): lag is 0 when server not in stable state by [@​adiholden](https://togithub.com/adiholden) in [dragonflydb/dragonfly#3010 - chore: get rid of kv_args and replace it with slices to full_args by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#2942 - fix(server): non auto journal write after callback finish by [@​adiholden](https://togithub.com/adiholden) in [dragonflydb/dragonfly#3016 - fix(server): shrink replication steaming buf by [@​adiholden](https://togithub.com/adiholden) in [dragonflydb/dragonfly#3012 - fix(zset): fix random in ZRANDMEMBER command by [@​BagritsevichStepan](https://togithub.com/BagritsevichStepan) in [dragonflydb/dragonfly#2994 - Fix benchmark by [@​adiholden](https://togithub.com/adiholden) in [dragonflydb/dragonfly#3017 - chore: Remove tiering test skip by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#3011 - feat(tiering): simple offload loop by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#2987 - feat(tiering): MGET support by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#3013 - Revert "chore: get rid of kv_args and replace it with slices to full\_… by [@​romange](https://togithub.com/romange) in [dragonflydb/dragonfly#3024 - chore(dash): Replace comparator with predicate by [@​dranikpg](https://togithub.com/dranikpg) in [dragonflydb/dragonfly#3025 - feat: add defragment command by [@​BorysTheDev](https://togithub.com/BorysTheDev) in [dragonflydb/dragonfly#3003 ##### Huge thanks to all the contributors! ❤️ ##### New Contributors - [@​racamirko](https://togithub.com/racamirko) made their first contribution in [dragonflydb/dragonfly#2940 - [@​BagritsevichStepan](https://togithub.com/BagritsevichStepan) made their first contribution in [dragonflydb/dragonfly#2994 **Full Changelog**: dragonflydb/dragonfly@v1.17.0...v1.18.0 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zNTIuMCIsInVwZGF0ZWRJblZlciI6IjM3LjM1Mi4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19--> Co-authored-by: lumiere-bot[bot] <98047013+lumiere-bot[bot]@users.noreply.github.com>
Fixes #2850
The implementation of the
ZRANDMEMBER
command has two cases:O(n * log(m))
, wheren
is the number of random elements,m
is the size of the sorted set. In this case,n
indexes are generated using the Robert Floyd's sampling algorithm and then obtained from the set.O(m)
. In this case, the algorithm iterates through the entire sorted setMore about the Robert Floyd's sampling algorithm: