diff options
author | Viktor Söderqvist <viktor.soderqvist@est.tech> | 2021-02-05 18:54:01 +0100 |
---|---|---|
committer | Oran Agra <oran@redislabs.com> | 2021-02-22 23:22:53 +0200 |
commit | e461f599289e70cde088d621fcd8fde6d6761ee6 (patch) | |
tree | 903450554128a2fcf3696b85e0895d5b555f1adb | |
parent | 321f98726c88c3c5447fb3aa886b29206dbb6824 (diff) | |
download | redis-e461f599289e70cde088d621fcd8fde6d6761ee6.tar.gz |
RM_ZsetRem: Delete key if empty (#8453)
Without this fix, RM_ZsetRem can leave empty sorted sets which are
not allowed to exist.
Removing from a sorted set while iterating seems to work (while
inserting causes failed assetions). RM_ZsetRangeEndReached is
modified to return 1 if the key doesn't exist, to terminate
iteration when the last element has been removed.
(cherry picked from commit aea6e71ef82701e07177744e600e1ef20d60b7d0)
-rw-r--r-- | src/module.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/src/module.c b/src/module.c index 5515cfcad..521807141 100644 --- a/src/module.c +++ b/src/module.c @@ -2035,6 +2035,7 @@ int RM_ZsetRem(RedisModuleKey *key, RedisModuleString *ele, int *deleted) { if (key->value && key->value->type != OBJ_ZSET) return REDISMODULE_ERR; if (key->value != NULL && zsetDel(key->value,ele->ptr)) { if (deleted) *deleted = 1; + moduleDelKeyIfEmpty(key); } else { if (deleted) *deleted = 0; } @@ -2079,6 +2080,7 @@ void RM_ZsetRangeStop(RedisModuleKey *key) { /* Return the "End of range" flag value to signal the end of the iteration. */ int RM_ZsetRangeEndReached(RedisModuleKey *key) { + if (!key->value || key->value->type != OBJ_ZSET) return 1; return key->zer; } |